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).
Das ist richtig
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?
Das siehst du richtig, dass du das falsch siehst
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.
Du hast vom Seil etwas abgeschnitten und festgestellt, dass es immer noch zu kurz ist?
Hat jemand noch eine andere praktikable Idee?
Ja, gib den
Mutex vor dem Aufruf von
ShellExecute
mit
CloseHandle
frei.
Dann wird das
Handle geschlossen (übersetzt heißt
CloseHandle ->
SchließeHandle).
Wird der Prozess beendet, dann werden alle noch offenen Handles von diesem Prozess automatisch geschlossen.
Aber in diesem Falle musst du den halt vorher manuell freigeben.
Delphi-Quellcode:
// Nun ja ... wenn schon dann bitte mit Self
{form1}Self.Close;
// Da wir aber die Anwendung schließen wollen, müssen wir das HauptFormular schließen, also besser
Application.MainForm.Close;
// wozu das? unnötig!
// application.ProcessMessages;
// Hier jetzt das Handle vom Mutex freigeben
CloseHandle( MyAppMutexHandle );
// Nicht das Application.Handle übergeben sondern 0
ShellExecute(
{Application.Handle} 0, '
open', Pchar(ParamStr(0)),
nil,
nil, sw_SHOWNORMAL);
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)