Hmmm, seltsam.
Dann sollte es eigentlich funktionieren. Verwende ähnlichen (!) Code, allerdings in einer
Unit ausgelagert - und das funktioniert bisher einwandfrei. Versuch's doch mal folgender
Unit anstelle deines codes in der .dpr
Delphi-Quellcode:
unit rzM_OneInstanceOnly;
// Unit lediglich in das Projekt aufnehmen, danach werden mehrere Instanzen
// des Programmes unterbunden; bei erneutem Aufruf wird automatisch die
// erste Instanz aktiviert.
interface { ----------------------------------------------------------------- }
implementation { ------------------------------------------------------------ }
uses Forms,SysUtils,Windows;
var Mutex : THandle;
MName :
String;
h : HWnd;
initialization { ------------------------------------------------------------ }
MName:=ExtractFileName(ChangeFileExt(Application.ExeName,'
_MTX'));
Mutex:=CreateMutex(
nil,true,pchar(MName));
// Mutex anlegen
if GetLastError=ERROR_ALREADY_EXISTS
then begin // Fehler, Pgm schon aktiv!
h:=0;
// vorhandene Instanz suchen
repeat
h:=Windows.FindWindowEx(0,h,PChar('
TApplication'),PChar(Application.Title))
until h<>Application.Handle;
if h<>0
then begin // aktivieren
Windows.ShowWindow(h,SW_Restore);
Windows.SetForegroundWindow(h);
end;
Application.Terminate;
// und diesen zweiten Aufruf beenden!
end;
finalization { -------------------------------------------------------------- }
ReleaseMutex(
Mutex);
// Mutex der ersten Instanz wieder freigeben!
end.