Есть еще более простое решение для этого;использование кода, предложенного RRUZ, зависит от того, знаете ли вы путь установки, и если вы запускаете его при инициализации установщика, вы этого не знаете.
Лучшее решение - использовать FindWindowByClassName.У него есть небольшое предварительное условие, что у вас есть основная форма, которая всегда открыта, но вы всегда можете запустить несколько проверок, если у вас есть множество форм, которые могут быть открыты.Само собой разумеется, что вам нужно сделать имя класса как можно более уникальным!
Пример функции:
function IsAppRunning(): Boolean;
begin
Result := (FindWindowByClassName( '{#AppWndClassName}') <> 0) or (FindWindowByClassName( '{#AltAppWndClassName}') <> 0);
end;
# Прекомпиляция ссылок определена ранее в сценарии установки ...
#define AppWndClassName "TMySplashScreen"
#define AltAppWndClassName "TMyMainForm"
Затем в разделе кода вы называете это следующим образом:
function InitializeUninstall(): Boolean;
begin
// check if application is running
if IsAppRunning() then
begin
MsgBox( 'An Instance of MyFantasticApp is already running. - Please close it and run the uninstall again.', mbError, MB_OK );
Result := false;
end
else
Result := true;
End;
Если вам нужно что-то более сложное, чем это, то вам нужно смотреть на мьютексы, но красота сПриведенный выше код состоит в том, что он простой, быстрый и при условии, что у вас достаточно уникальные имена классов, как и все остальное.
(Хотя по общему признанию, если вы работаете в многопользовательской системе, это, вероятно, победитЯ не могу найти окно, если оно находится в сеансе другого пользователя. Но, как я уже сказал, для большинства простых ситуаций это было бы хорошо.)