Приветствую, уважаемые разработчики! В этой статье мы рассмотрим проблему, с которой сталкиваются специалисты при использовании Inno Setup для проверки запущенных процессов на 64-битных системах Windows, в частности, Windows 2008 R2. Мы обсудим, почему стандартный подход с использованием DLL psvince.dll не работает, и предложим альтернативные решения, которые позволят вам успешно решить данную задачу.
Описание проблемы
Пользователи Inno Setup часто сталкиваются с необходимостью проверки, запущен ли определенный процесс на компьютере перед установкой программы. Для этого существует несколько подходов, но один из популярных методов — использование внешней библиотеки psvince.dll. Однако, как выяснилось, данный метод не работает на 64-битных системах, поскольку psvince.dll не может корректно обрабатывать 64-битные процессы.
Пример кода, который не работает
[Files]
Source: "psvince.dll"; Flags: dontcopy
[Code]
function IsModuleLoaded(modulename: AnsiString): Boolean;
external 'IsModuleLoaded@files:psvince.dll stdcall';
function InitializeSetup(): Boolean;
begin
if(IsModuleLoaded('notepad.exe')) then
begin
MsgBox('Running', mbInformation, MB_OK);
Result := False;
end
else
begin
MsgBox('Not running', mbInformation, MB_OK);
Result := True;
end
end;
Альтернативные решения
Использование WMI
Один из способов — использование WMI (Windows Management Instrumentation) для проверки запущенных процессов. Вот пример функции, которая делает это:
function IsAppRunning(const FileName: string): Boolean;
var
FSWbemLocator: Variant;
FWMIService: Variant;
FWbemObjectSet: Variant;
begin
Result := False;
FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"', [FileName]));
Result := (FWbemObjectSet.Count > 0);
// Освобождение ресурсов
FWbemObjectSet := Unassigned;
FWMIService := Unassigned;
FSWbemLocator := Unassigned;
end;
Использование FindWindowByClassName
Если приложение имеет уникальный класс окна, можно использовать функцию FindWindowByClassName для проверки его запущенности:
function IsAppRunning(): Boolean;
begin
Result := (FindWindowByClassName('{#AppWndClassName}') <> 0) or
(FindWindowByClassName('{#AltAppWndClassName}') <> 0);
end;
Использование мутексов
Для более сложных сценариев можно использовать мутексы. В Inno Setup есть функция CheckForMutexes, которая может быть полезна.
Подтвержденный ответ
К сожалению, psvince.dll не может корректно работать с 64-битными процессами. В качестве альтернативы можно использовать утилиту processviewer.exe, доступную на GitHub.
Заключение
В данной статье мы рассмотрели проблему проверки запущенных процессов в Windows 2008 R2 64bit с помощью Inno Setup и предложили несколько решений, которые помогут вам в этом непростом вопросе. Выбирайте подходящий вам метод в зависимости от конкретной задачи и требований вашего проекта.
Проблема совместимости Inno Setup с 64-битными процессами в Windows 2008 R2, поиск решений для проверки запущенных процессов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS