-
Ситуация: Есть софтинка на Дельфи7, которая при попытке повторного запуска говорит, что уже запущена копия и вторая копия не стартует. Добились этого таким образом: const UNIQUE_NAME = 'TEST_SOFT_THE_UNIQUE_MUTEX_TO_PREVENT_MULTIPLE_INSTANCES'; ... if OpenMutex(MUTEX_MODIFY_STATE, False, UNIQUE_NAME) = 0 then MuGuard := CreateMutex(nil, False, UNIQUE_NAME) else begin LogWrite('Попытка повторного запуска!'); Appplication.Terminate; end; ... Теперь надо при потытке повторного запуска не только вторую копию закрывать, но и первую, ранее запущенную!
-
Разрешаем, если надо)
-
Заводишь сообщение своё, по нему делаешь выход из программы, при старте если мутекс занят - рассылаешь рупорным методом.
-
> Appplication.Terminate;а это здесь зачем? где-то так:
begin
CreateMutex(nil, TRUE, 'TEST_SOFT_XXXXXXX_INSTANCES');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
h := FindWindow('TMainXXX', nil);
if h <> 0 then
SendMessage(h, WM_USER + 666, 0, 0); end
else
begin
Application.Initialize;
Application.CreateForm(TMainXXX, Main);
Application.Run;
end;
end.
И в коде приложения обработать сообщение WM_USER + 666, правильно завершить приложение.
|