Naja prinzipiell gibt es folgende Möglichkeiten:
- CreateMutex schlägt fehl (Result = 0; bedingt durch fehlende Rechte, etc)
- CreateMutex gibt ein Handle zurück und GetLastError ist <> ERROR_ALREADY_EXISTS
- CreateMutex gibt ein Handle zurück und GetLastError ist = ERROR_ALREADY_EXISTS
Ich würde den Check auf hMutex = 0 und GetLastError = ERROR_ALREADY_EXISTS nicht in die selben Abfrage einbauen.
Delphi-Quellcode:
procedure TForm1.MutexCheck;
var
hMutex: THandle;
begin
hMutex := CreateMutex(
nil, true, '
MutexName');
if (hMutex = 0)
then
begin
// kritischer Fehler beim Erzeugen / Öffnen des Mutex
end else
begin
if (GetLastError = ERROR_ALREADY_EXISTS)
then
begin
// bestehende Instanz kontaktieren
// ist hier dein Parameter = /OPEN, brauchst du eigentlich nur die alte
// Instanz schließen. Dadurch, dass du an dieser Stelle schon ein
// Handle des Mutex geöffnet hast, "müsste" die aktuelle Instanz dann
// automatisch zur "CallApp" werden.
// an dieser Stelle könnte man wohl auch noch ein CloseHandle(hMutex)
// einbauen, fals der Parameter NICHT /OPEN ist
end else
begin
// dies ist die erste Instanz
end;
end;
end;