![]() |
Autostart über Registry
Hallo,
ich habe ein Programm geschrieben, das bei jedem Windows-Start gestartet werden soll (Also Autostart). Dies läuft alles über die Registry ab, nicht über den Autostartordner. Der erste Compilierversuch gelang. Beim Neustart erhalte ich allerdings die Fehlermeldung: "Datei nicht gefunden" Nach Bstätigung dieser Meldung läuft das Programm wieder. Dann habe ich aber beim Schließen wieder eine Fehlermeldung: "E/A-Fehler 103". Ich wollte das Programm ändern, doch beim Compilieren krieg ich folgende Fehlermeldung: "[Fataler Fehler] Ausgabedatei 'Pfad der Datei' kann nicht erstellt werden" Kann mir da jemand weiterhelfen? |
Re: Autostart über Registry
Hallo bubabo,
Zitat:
Zitat:
Ein bisschen Code wäre nciht schlecht, wo Du was mit der Datei machst. Zitat:
Grüsse, Daniel :hi: |
Damit schreibe ich den Wert in die Registry
Delphi-Quellcode:
[/code]
regist := TRegistry.create;
regist.rootkey := HKEY_LOCAL_MACHINE; regist.OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run',true); regist.writestring('Name des Programms','Pfad der Exe-Datei'); regist.closekey; |
Moin Bubabo,
hast Du auch daran gedacht, den Eintrag wieder aus der Registry zu nehmen, bzw. das Programm zu beenden, bevor Du es bearbeitest? Wenn es noch läuft, kann die EXE ja nicht neu erstellt werden. |
Geschlossen hab ich's mit der deletekey-Anweisung
Hat jemand vielleicht eine andere Methode ein Programm automatisch zu starten? |
Hoi,
damit schließ du aber nich die Anwendung ... |
Nein, den Registry-Eintrag hab ich mit deletekey geschlossen.
Das Programm soll doch aber beim Systemstart geöffnet werden und auch laufen. Es soll nicht gleich geschlossen werden. |
Moin Bubabo,
also so wie ich es bisher verstanden hatte, konntest Du das Programm nicht mehr kompilieren, oder? |
Hallo ihrs,
Irgendwie habe ich hier kein Wort verstanden, kann mich mal jemand aufklären was das Problem von bubabo ist? Hat er jetzt ein Problem mit dem autostart oder damit sein Programm zu kompilieren, weiterhin frage ich mich was er genau bei jedem Windowsstart ausführen will, das Programm selber, oder ein fremdes Programm? Zitat:
Ich verstehe nur Bahnhof. Naja, BB Jan |
Zitat:
Man muss also die Anwendung manuell beenden, oder sie aus dem Autostart löschen UND Windows einmal neustarten. |
Ja, aber warum jetzt Windows neu starten? Task killen und neu starten reicht.
Außerdem vermisse ich noch ein
Delphi-Quellcode:
damit das ganze auch wieder freigegeben wird, oder machst du das an einer anderen Stelle?
regist.free
Auch solltest du das ganze dann in einen try...finally Block packen:
Delphi-Quellcode:
regist := TRegistry.create;
with regist do try rootkey := HKEY_LOCAL_MACHINE; OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run', true); writestring('Name des Programms','Pfad der Exe-Datei'); closekey; finally free; end; |
Zitat:
Grüsse, Daniel :hi: |
Habe ich das richtig verstanden: Der EInOutError Nr. 103 bedeutet, dass die Datei nicht offen war, die ich zu schließen versuche? Das Problem hatte ich nämlich heute auch.
|
Ein kurzer Blick in der OH hätte Dir folgendes gebracht:
Zitat:
|
Unter welchem Stichwort hast du das gefunden??? Ich habe in der Hilfe gesucht, aber selbst im Volltext-Index mit den Begriffen EInOutError und 103 hab ich nichts gescheites gefunden.
|
:wall: siehe Anhang! :wall:
Und ein Doppelklick auf I/O Errors hätte wahre wunder gebracht! ;) Grüsse, Daniel :hi: Nachtrag: Jetzt mit Anhang. ;) |
Naja, auf die Idee, das Stickwort I/0 einzugeben bin ich nicht gekommen ;-)
Hilfe und IDE gefallen mir ja beim Visual Studio bis Version 6 besser, aber an die Sprache Delphi kommen weder VB noch VC++ ran. |
:wall:
Siehe Anhang. :wall: Grüsse, Daniel :hi: |
Zitat:
Außerdem wollt ich mal sagen, dass ich bubabos Problem so verstanden habe, dass er erstmal das Problem hat, dass er das Programm im Autostart hat und nun bei jedem Windowsstart eine Fehlermeldung kommt, obwohl der Schlüssel in der Registry eigentlich stimmt. Und bei einem Windowsstart kann ja das Programm nicht bereits geöffnet sein. Außer er hätte es noch einmal in einem anderen Autostart (Autostart-Ordner). Oder? Daraus würde ich mal schließen, dass das Problem wo anders liegen muss. Oder seh ich das komplett falsch??? :?: |
Zitat:
Grüsse, Daniel :hi: |
Zitat:
Auf der anderen Seite find ich das mit dem Autostart in der Registry aber auch praktisch. Man denke nur mal an Benutzer, die sich am Rechner fast gar nicht auskennen. Die klicken da irgendwo rum un verschieben oder löschen den Link aus dem Autostartordner. Aber so generell muss ich sagen, dass Du mich überzeugt hast. Man könnte aber vielleicht einen Kompromiss eingehen und den Benutzer vor der Installation fragen, ob er das Programm überhaupt im Autostart haben möchte. OK! Jetzt schweif zu sehr vom eigentlichen Thema ab. |
Hallo!
Oh weh - da ist aber wohl einer seeeehr mutig - die compilierte EXE direkt aus dem Projektverzeichnis zu benutzen! Was ist denn, wenn Du noch Änderungen hat/eine neue Version schreibst? Bis zur Fertigstellung ist das Programm nicht benutzbar. Meine Programme kommen nach Fertigstellung einer Version immer in einen getrennten Ordner und werden zum Anwenden daraus gestartet. Dann kann ich neu compilieren, ohne eine funktionsfähige und ggf. benötigte EXE zu verlieren! Außerdem passiert es dann nicht, daß beim Compilieren die EXE noch geöffnet ist. Gruß Dietmar Brüggendiek |
Zitat:
Delphi-Quellcode:
Grüsse, Daniel :hi:
var
mHandle: THandle; implementation {$R *.dfm} [...] initialization //Verhindern, dass ein Programm mehrmals gestartet wird mHandle := CreateMutex(nil, True, 'NameDerExe'); if GetLastError = ERROR_ALREADY_EXISTS then begin Halt; end; finalization if mHandle <> 0 then begin CloseHandle(mHandle); end; end. |
Zitat:
Bei Office oder Corel oder andere wirklich grossen Anwendungen kann ich es verstehen und hab auch kein Problem damit, solange alles wieder entfernt wird. Aber wenn sich jeder Snake-Clon wie sich hier viele rumtreiben, in die Registry einträgt, dann krieg ich so ein Hals. Grüsse, Daniel :hi: |
Hallo!
@Daniel B: 1. kenne ich den Code mit dem Mutex bereits. 2. verhindert das ja nicht, daß ich die Exe neu compilieren will, während das Programm noch (nicht von der IDE gestartet) läuft. Ich wollte darauf hinweisen, daß man eigene Programme, und wenn es nur mit einem einfachen Kopieren ist, in einem Verzeichnis ausserhalb der Delphi-Sources installieren sollte. Sonst zerstört man sich möglicherweise beim Compilieren eine funktionsfähige Version. Eine der Fragen lautete ja, warum der Compiler die EXE nicht schreiben will. Das zeigt mir an, daß der Benutzer die fertige EXE nicht kopiert hat und diese noch läuft. Nebenbei: über bedingte Compilierung und einen Boolean-Parameter bei der Mutex-Erzeugung stelle ich sogar sicher, daß die Produktions- und die Entwicklungsversion parallel laufen können, aber jede nur einmal! Gruß Dietmar Brüggendiek |
Servus,
Das Compilieren funktionierte deshalb nicht, weil die exe-Datei nach gestartet war. Ist diese .free-Anweisung unbedingt nötig und was bewirkt sie? |
Zitat:
Das macht man mit Reg.Free; oder noch besser, FreeAndNil(Reg);. Grüsse, Daniel :hi: |
Hallo,
ich hab ständig rumprobiert und es hat alles nichts gebracht. Jetzt versuche ich es über den Autostartordner mit dieser Funktion:
Delphi-Quellcode:
uses activeX,comobj,shlobj;
const IID_IPersistFile: TGUID = (D1:$0000010B;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46)); function CreateLink(PathObj,PathLink,Desc,Workdir:string):Boolean; var psl : IShellLink; ppf : IPersistFile; begin result := False; if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IID_IShellLinkA, psl)) then begin psl.SetPath(PChar(PathObj)); psl.SetDescription(PChar(Desc)); psl.SetWorkingDirectory(PChar(workdir)); if SUCCEEDED(psl.QueryInterface(IID_IPersistFile,ppf)) then begin ppf.Save(StringToOLEStr(PathLink),TRUE); Result := true; end; end; end; Doch auch hier gibt es wieder Probleme. Zwar wird eine Datei erstellt (ich übergebe Pathlink den Namen der Verknüpfung 'Name des Programms.ink'), doch es wird keine Verknüpfung, sondern eine .ink-Datei, bei der ich dann gefragt werde, mit welchem Programm ich sie öffnen will. [/quote][/delphi] |
Hallo!
Was sollen den ".INK"-Dateien sein???? :shock: Oder sind vielleicht doch eher ".LNK"-Dateien gemeint???? Gruß Dietmar Brüggendiek |
Hallo Dietmar,
ich meine damit Zitat:
|
Moin Bubabo,
wenn Du die Endung .ink verwendest wird's kein Link. Nimm mal .lnk. |
Es funktioniert!
Ich hab das jetzt über den Autostart-Ordner gemacht. Dummerweise hab ich bei der Verknüpfung die Dateiendung ".INK" verwendet. Richtig ist aber ".LNK". |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz