Zobacz poniższy kod, z tego co testowałem działa poprawnie. Pozwoli uruchomić kolejne instacje tej
samej aplikacji tylko jeżeli zostanie wywołany z parametrem "/many". Dokładnie jak działają mutexy,
to powinno się Tobie udać znaleźć w googlach. Napisz czy taki kod Tobie odpowiada, no i sorki że
dopiero teraz piszę ale musiałem przetestować ten kod. Jak ktoś ma inny pomysł to niech napisze.
I za pewne da się tę procedurę w OnCreate może uprościć, ale ja zrobiłem tak aby działało, bo jak
wcześniej testowałem to uruchamiał mi się "w kółko" i miałem masę okien, więc zrobiłem tak jak tu:
// do uses dodaj moduł ShellApi
procedure WczytajPlik(const Plik: string);
begin
// Ta procedura może robić coś innego, to co robi teraz jest tylko dla testów
Form1.Caption := Plik;
end;
procedure TForm1.FormCreate(Sender: TObject);
const
Kluczowy = '/many';
TheMutex = 'unikalna nazwa muteksu';
var
I : Integer;
begin
Application.Title := Caption;
CreateMutex(nil, False, TheMutex);
if (AnsiLowerCase(ParamStr(1)) <> Kluczowy) then
begin
if ParamStr(1) <> '' then
begin
WczytajPlik(ParamStr(1));
end;
if GetLastError() <> 0 then
begin
MessageBox(Application.Handle,
'Możesz uruchomić tylko jedną kopię tej aplikacji na raz!',
PChar(Application.Title), MB_OK + MB_ICONWARNING);
Halt;
end;
end
else
begin
if ParamCount > 1 then
begin
WczytajPlik(ParamStr(2));
end;
end;
if (ParamStr(1) = Kluczowy) then
begin
if ParamCount > 2 then
for I := 3 to ParamCount do
begin
ShellExecute(Application.Handle, 'open', PChar(Application.ExeName),
PChar(Kluczowy +#32+ ParamStr(I)), nil, SW_SHOW);
end;
end;
end;