Delphi-Version: 2006
Problem beim Programmneustart mit Instanzkontrolle
Hallo,
mit folgender Unit stelle ich sicher, dass mein Programm nur einmal gestartet wird.
Delphi-Quellcode:
Im Programm selbst ergibt sich die Notwendigkeit, das Programm neu starten zu müssen. Hierzu verwende ich
unit Startkontrolle;
interface implementation uses windows,Dialogs,sysutils; var mHandle: THandle; // Mutexhandle Initialization mHandle := CreateMutex(nil,True,'zeugnis.exe'); if GetLastError = ERROR_ALREADY_EXISTS then begin showMessage('Es läuft bereits eine Instanz des Programms'); Halt; end; finalization if mHandle <> 0 then CloseHandle(mHandle) end.
Delphi-Quellcode:
Das Problem ist nun, dass beides sich nicht wirklich mag. Wenn ich neu starten lasse, läuft ja noch eine Instanz, wodurch die Startkontrolle sich beschwert und den Neustart abbricht.
form1.Close;
application.ProcessMessages; ShellExecute(Application.Handle, 'open', Pchar(ParamStr(0)), nil, nil, sw_SHOWNORMAL); Hat jemand eine Idee, wie ich das elegant lösen könnte? Danke vorab Opa |
AW: Problem beim Programmneustart mit Instanzkontrolle
Hallo,
ich hab mir für diesen Zweck einen kleinen Programmstarter geschrieben, der zwei Kommandozeilenparameter auswertet: 1. Das zu startende Programm 2. Die Wartezeit Das kleine Progrämmchen ist übrigens auch nützlich, wenn man Programme im Windows-Autostart starten möchte, aber sichergehen will/muss, dass alle anderen Programme im Autostart schon vorher gestartet sind, weil z.B. eine Abhängigkeit besteht. Übrigens...
Delphi-Quellcode:
... und die Unit funzt mit jeder Echse
...
mHandle := CreateMutex(nil,True,ExtractFileName(ParamStr(0))); ... |
AW: Problem beim Programmneustart mit Instanzkontrolle
Ich würde vor dem Aufruf des Programms den Mutex wieder freigeben ... :cyclops:
BTW Den Code in finalization kannst du dir sparen, denn Zitat:
Zitat:
|
AW: Problem beim Programmneustart mit Instanzkontrolle
Hi Sir Rufo,
sag mal, wann schläfst du denn? :) Klar, die Unit hat noch Verbesserungspotential. Ich gebe den Mutex auch nicht frei. Habe es auch noch nirgendwo gesehen, muss aber nichts bedeuten. Ich dachte immer, bei Programmende wird der Mutex automatisch freigegeben? Hier mal meine Variante:
Delphi-Quellcode:
unit RuMutex;
interface uses Windows, SysUtils; function CreateRubinSoftwareMutex(MutexName: string): boolean; function CreateApplicationMutex: boolean; implementation function StringReplace(Value: string): string; var i: integer; begin Result := Value; for i := 1 to Length(Result) do if not CharInSet(Result[i],['0'..'9','a'..'z','A'..'Z']) then Result[i] := '_'; end; function CreateRubinSoftwareMutex(MutexName: string): boolean; var LastError : DWord; SecurityDesc : TSecurityDescriptor; SecurityAttr : TSecurityAttributes; aName : string; Res : Cardinal; begin Result := false; InitializeSecurityDescriptor(@SecurityDesc, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@SecurityDesc, True, nil, False); SecurityAttr.nLength := SizeOf(SecurityAttr); SecurityAttr.lpSecurityDescriptor := @SecurityDesc; SecurityAttr.bInheritHandle := False; aName := 'Global\RUBiN_Software_' + StringReplace(MutexName); Res := CreateMutex(@SecurityAttr, True, PChar(aName)); LastError := GetLastError; if (Res = 0) then raise EOSError.Create('Mutex Modul-Name <' + aName+'> konnte nicht erzeugt werden. Fehler-Code:' + IntToStr(LastError)) else if (LastError <> ERROR_ALREADY_EXISTS) then Result := true; end; function CreateApplicationMutex: boolean; begin Result := CreateRubinSoftwareMutex(ParamStr(0)); end; end. |
AW: Problem beim Programmneustart mit Instanzkontrolle
Wenn du das in eine Klasse und als Klassenmethoden verpackst wird das schon runder.
Ich kann da mal - nach meinem Schönheitsschlaf - einen Entwurf machen. |
AW: Problem beim Programmneustart mit Instanzkontrolle
Noch runder als rund....ich bin gespannt :-D
Brauch jetzt auch meinen Schönheitsschlaf. |
AW: Problem beim Programmneustart mit Instanzkontrolle
Also in der JCL gibt es die Klasse TJclAppInstances (Unit JclAppInst) die alle Probleme mit den Instanzen abdeckt.
Wenn man z.B. eine zweite Instanz startet obwohl nur eine erlaubt ist, dann gibt die 2. Instanz seine Aufrufparameter an die 1. Instanz weiter und beendet sich sich. Sind mehrere Instanzen zugelassen können diese untereinander kommunizieren. Wenn man das Rad nicht neu erfinden will ist diese Klasse die beste Lösung. |
AW: Problem beim Programmneustart mit Instanzkontrolle
Zitat:
|
AW: Problem beim Programmneustart mit Instanzkontrolle
Zitat:
Mal ernsthaft, jede Anwendung die über ein Hobbyprogrämmchen hinaus geht kann von der JCL profitieren. Alles was Borland/Embacadero in der RTL vergessen hat findet man in der JCL. |
AW: Problem beim Programmneustart mit Instanzkontrolle
Den Bezug zwischen JCL und der Kuh übernehme ich dann mal in meinen Sprachgebrauch... :-)
Wenn ich das richtig verstehe (sorry, Musicman, aber in D2006 ist CharInSet nicht verfügbar, somit konnte ich das nicht ausprobieren), muss ich den Mutex freigeben, bevor ich ihn erzeuge (was ja auch logisch ist). Dann ergibt sich aber aus meiner Sicht das Problem, dass ich den Neustart ja vom Programm aus initiiere, der Mutex also noch besteht, und das dieser erst freigegeben werden kann, wenn das Programm auch beendet ist. Oder sehe ich das falsch? Ich habe inzwischen ausprobiert, ob ich den Mutex dadurch freigeben kann, dass ich vor Programmende versuche, ihn neu zu erzeugen und bei Vorhandensein über CloseHandle freizugeben, leider jedoch ohne Erfolg. Hat jemand noch eine andere praktikable Idee? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz