Delphi-Quellcode:
const
cMagic = $1234567;
cResult = $7654321;
sTitle = 'my_program$XY12345678_Moeglichst_Eindeutiger_Name';
// als sTitle kann auch ParamStr(0) herhalten
var
WndHandle: hWnd = 0;
type
TSingleInstance = class
class procedure WndProc(var Msg: TMessage);
class procedure Start;
class procedure Stop;
end;
class function TSingleInstance.WndProc(var Msg: TMessage);
var
Param: String;
begin
with Msg do
if (Msg = wm_CopyData) and (PCopyDataStruct(lParam).cwData = cMagic) then
begin
Param := PCopyDataStruct(lParam).lpData;
OpenFile(Param); // o.ä.
Result := cResult;
end else
Result := DefWindowProc(WndHandle, Msg, wParam, lParam);
end;
class procedure TSingleInstance.Start;
var
PrevWnd: hWnd;
Data: TCopyDataStruct;
Param: String;
begin
PrevWnd := FindWindow('TPUtilWindow', sTitle);
if IsWindow(PrevWnd) then
begin
Param := ParamStr(1);
Data.cwData := cMagic;
Data.cbData := Length(Param) +1;
Data.lpData := Pointer(Param);
if SendMessage(PrevWnd, wm_CopyData, 0, Integer(@Data)) = cResult then ; // erfolgreich
Halt;
end;
WndHandle := AllocateHWnd(WndProc);
SetWindowText(WndHandle, sTitle);
end;
class procedure TSingleInstance.Stop;
begin
if IsWindow(WndHandle) then DeallocateHWnd(WndHandle);
end;
initialization
TSingleInstance.Start;
finalization
TSingleInstance.Stop;
end;
Unter
Win9x werden Mutexe/Atome/Semaphore usw. nicht mehr korrekt freigeben falls die Anwednung crasht. Dadurch könnte es passieren das eine einmal gecrashte Anwendung nicht erneut gestartet werden kann, da der globale benammte
Mutex noch existiert. ABER!, das feine ist das Fensterhandles auch unter
Win9x ungültig werden wenn die Anwendung gecrasht ist. Deshalb nutzen wir oben ein Fensterhandle mit möglichst eindeutigen Namen um 1. zu erkennen ob unsere Anwendung schon läuft und 2. gleichzeigt als Transportweg um ParamStr(1) zu übertragen.
Allerdings auch diese Methode hat ihre Nachteile, z.b. bei Services die in einer anderen WinSta laufen.
Gruß Hagen
PS: obiger Code ist nur aus'm Gedächtnis, also keine Garantie das alles absolut korrekt ist