Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Autostart über Registry (https://www.delphipraxis.net/2541-autostart-ueber-registry.html)

bubabo 28. Jan 2003 17:15


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?

Daniel B 28. Jan 2003 17:21

Re: Autostart über Registry
 
Hallo bubabo,
Zitat:

Zitat von bubabo
Dies läuft alles über die Registry ab, nicht über den
Autostartordner.

*kopfschüttel*
Zitat:

beim Schließen wieder eine Fehlermeldung: "E/A-Fehler 103".
Sag das die Datei nicht offen ist. Öffnest DU sie zum richtigen Zeitpunkt? Schliesst Du sie auch wieder, falls Du vorher was damit machst?
Ein bisschen Code wäre nciht schlecht, wo Du was mit der Datei machst.
Zitat:

Ich wollte das Programm ändern, doch beim Compilieren krieg ich folgende Fehlermeldung:
Ja wie jetzt? Kannst Du kompilieren und den Rechner neustarten oder nicht?

Grüsse, Daniel :hi:

bubabo 28. Jan 2003 17:42

Damit schreibe ich den Wert in die Registry

Delphi-Quellcode:
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;
[/code]

Christian Seehase 28. Jan 2003 17:48

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.

bubabo 28. Jan 2003 18:03

Geschlossen hab ich's mit der deletekey-Anweisung


Hat jemand vielleicht eine andere Methode ein Programm automatisch zu starten?

RomanK 28. Jan 2003 18:05

Hoi,
damit schließ du aber nich die Anwendung ...

bubabo 28. Jan 2003 18:12

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.

Christian Seehase 28. Jan 2003 18:57

Moin Bubabo,

also so wie ich es bisher verstanden hatte, konntest Du das Programm nicht mehr kompilieren, oder?

Jan 28. Jan 2003 19:24

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:

Zitat von Christian Seehase
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.

Was bitteschön hat denn ein Eintrag in diesen Key der Registry mit dem Erstellen der exe zu tun?
Ich verstehe nur Bahnhof.
Naja, BB
Jan

nailor 28. Jan 2003 19:51

Zitat:

Zitat von Jan
Was bitteschön hat denn ein Eintrag in diesen Key der Registry mit dem Erstellen der exe zu tun?

Delphi will beim Kompilieren die alte exe mit der neuen Überschreiben. Hat man die alte exe jetzt aber im Autostart, und schließt sie nicht, dann ist sie für Windows noch geöffnet - und darf also nicht überschrieben werden. Das führt dazu, dass Delphi nicht kompiliert.

Man muss also die Anwendung manuell beenden, oder sie aus dem Autostart löschen UND Windows einmal neustarten.

Marco Haffner 28. Jan 2003 20:10

Ja, aber warum jetzt Windows neu starten? Task killen und neu starten reicht.
Außerdem vermisse ich noch ein
Delphi-Quellcode:
regist.free
damit das ganze auch wieder freigegeben wird, oder machst du das an einer anderen Stelle?
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;

Daniel B 28. Jan 2003 20:27

Zitat:

Zitat von Marco Haffner
Außerdem vermisse ich noch ein
Delphi-Quellcode:
regist.free
damit das ganze auch wieder freigegeben wird, oder machst du das an einer anderen Stelle?

Und was sprich gegen "FreeAndNil(Regist);"?

Grüsse, Daniel :hi:

BrainCode 28. Jan 2003 20:33

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.

Daniel B 28. Jan 2003 20:41

Ein kurzer Blick in der OH hätte Dir folgendes gebracht:
Zitat:

Zitat von Delphi OH sagte und
Number Name Description

100 Disk read error Reported by Read on a typed file if you attempt to read past the end of the file.
101 Disk write error Reported by CloseFile, Write, WriteIn, or Flush if the disk becomes full.
102 File not assigned Reported by Reset, Rewrite, Append, Rename, or Erase if the file variable has not been assigned a name through a call to Assign or AssignFile.
103 File not open Reported by CloseFile, Read Write, Seek, Eof, FilePos, FileSize, Flush, BlockRead, or BlockWrite if the file is not open.

104 File not open for input Reported by Read, Readln, Eof, Eoln, SeekEof, or SeekEoln on a text file if the file is not open for input.
105 File not open for output Reported by Write or Writeln on a text file if you do not generate a Console application.
106 Invalid numeric format Reported by Read or Readln if a numeric value read from a text file does not conform to the proper numeric format.

Grüsse, Daniel :hi:

BrainCode 28. Jan 2003 20:45

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.

Daniel B 28. Jan 2003 20:49

:wall: siehe Anhang! :wall:
Und ein Doppelklick auf I/O Errors hätte wahre wunder gebracht! ;)

Grüsse, Daniel :hi:

Nachtrag: Jetzt mit Anhang. ;)

BrainCode 28. Jan 2003 20:54

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.

Daniel B 28. Jan 2003 21:05

:wall:
Siehe Anhang.
:wall:

Grüsse, Daniel :hi:

fedderle 28. Jan 2003 21:33

Zitat:

Zitat von Daniel B
Zitat:

Zitat von bubabo
Dies läuft alles über die Registry ab, nicht über den Autostartordner.

*kopfschüttel*

Willst Du damit sagen, dass Du Autostarts lieber über den Autostart-Ordner machst? Wenn ja. Warum? Oder was meinst Du?`

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??? :?:

Daniel B 28. Jan 2003 21:40

Zitat:

Zitat von fedderle
Willst Du damit sagen, dass Du Autostarts lieber über den Autostart-Ordner machst? Wenn ja. Warum? Oder was meinst Du?

Genau das meinte ich. Heutige Anwendungen müllen die Registry schon genug zu und beim Deinstallieren machen sie auch nciht immer alles weg, mit der Zeit sammelt sich da jede menge Mist an und es muss nicht sein das ich mit meinen "kleinen progrämchen" auch noch was dazu beitrage, wo man noch andere möglichkeiten hat.

Grüsse, Daniel :hi:

fedderle 28. Jan 2003 21:53

Zitat:

Zitat von Daniel B
es muss nicht sein das ich mit meinen "kleinen progrämchen" auch noch was dazu beitrage, wo man noch andere möglichkeiten hat.

In dem Punkt muss ich dir zustimmen. Mich nervt es auch immer, wenn ich nach fast jeder Installation von nem Programm in der Registry das Ding wieder aus dem Autostart rausnehmen muss, weil ich es gar nicht im Autostart haben möchte.
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.

Brüggendiek 28. Jan 2003 22:08

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

Daniel B 28. Jan 2003 22:46

Zitat:

Zitat von Brüggendiek
Außerdem passiert es dann nicht, daß beim Compilieren die EXE noch geöffnet ist.

Delphi-Quellcode:
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.
Grüsse, Daniel :hi:

Daniel B 28. Jan 2003 22:51

Zitat:

Zitat von fedderle
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.

Das würde auch Sinn machen, wenn man das anklickt, dann weiss man "meistens" schon was man dadurch bewirkt und wie man den Link auch wieder findet. Und einfach! löschen kann, ohne in der Registry suchen zu müssen.

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:

Brüggendiek 28. Jan 2003 23:19

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

bubabo 29. Jan 2003 07:12

Servus,
Das Compilieren funktionierte deshalb nicht, weil die exe-Datei nach gestartet war.
Ist diese .free-Anweisung unbedingt nötig und was bewirkt sie?

Daniel B 29. Jan 2003 07:54

Zitat:

Zitat von bubabo
Ist diese .free-Anweisung unbedingt nötig und was bewirkt sie?

Natürlich, alles was Du Createst, z.B. bei der Registry, oder bei eine Ini, musst Du auch wieder freigeben, um Ressourcen zu sparen.
Das macht man mit Reg.Free; oder noch besser, FreeAndNil(Reg);.

Grüsse, Daniel :hi:

bubabo 29. Jan 2003 18:13

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]

Brüggendiek 29. Jan 2003 21:57

Hallo!

Was sollen den ".INK"-Dateien sein???? :shock: Oder sind vielleicht doch eher ".LNK"-Dateien gemeint????

Gruß

Dietmar Brüggendiek

bubabo 29. Jan 2003 22:18

Hallo Dietmar,
ich meine damit
Zitat:

".INK"-Dateien

Christian Seehase 29. Jan 2003 22:22

Moin Bubabo,

wenn Du die Endung .ink verwendest wird's kein Link. Nimm mal .lnk.

bubabo 29. Jan 2003 22:24

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