Inno Setup Проверка работающего процесса - PullRequest
5 голосов
/ 02 марта 2010

У меня есть проект Inno Setup, который я хочу проверить, действительно ли приложение запущено перед его удалением. Я пробовал много способов, но все молча завершается неудачей при запуске в Windows 7. Например, следующий скрипт, который проверяет процесс notepad.exe с использованием psvince.dll, всегда возвращает false независимо от того, работает Блокнот или нет.

Я использовал psvince.dll в приложении C #, чтобы проверить, работает ли он под Windows 7 и работает ли он без проблем. Поэтому я думаю, что установщик не может работать правильно с включенным UAC.

[Code]
function IsModuleLoaded(modulename: String): Boolean;
external 'IsModuleLoaded@files:psvince.dll stdcall';

function InitializeSetup(): Boolean;
begin
   if(Not IsModuleLoaded('ePub.exe')) then
   begin
       MsgBox('Application is not running.', mbInformation, MB_OK);
       Result := true;
   end
   else
   begin
       MsgBox('Application is already running. Close it before uninstalling.', mbInformation, MB_OK);
       Result := false;
   end
end;

Ответы [ 4 ]

7 голосов
/ 25 марта 2010

Используете ли вы Unicode Inno Setup? Если вы, это должно сказать

function IsModuleLoaded(modulename: AnsiString): Boolean;

, поскольку psvince.dll не является Unicode dll.

Также пример проверяет наличие epub.exe, а не notepad.exe.

5 голосов
/ 12 июня 2014

Вы также можете попробовать использовать WMIService:

procedure FindApp(const AppName: String);
var
  WMIService: Variant;
  WbemLocator: Variant;
  WbemObjectSet: Variant;
begin
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WMIService := WbemLocator.ConnectServer('localhost', 'root\CIMV2');
  WbemObjectSet := WMIService.ExecQuery('SELECT * FROM Win32_Process Where Name="' + AppName + '"');
  if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
  begin
    Log(AppName + ' is up and running');
  end;
end;
4 голосов
/ 16 сентября 2011

Inno Setup на самом деле имеет директиву AppMutex, которая описана в справке. Для его реализации требуется 2 строки кода.

В разделе [Setup] вашего файла iss вы добавляете:

AppMutex=MyProgramsMutexName

А затем при запуске приложения добавьте следующую строку кода:

CreateMutex(NULL, FALSE, "MyProgramsMutexName");
1 голос
/ 24 февраля 2015

Вы можете использовать этот код, чтобы проверить, запущен ли notepad.exe.

[Code]
function IsAppRunning(const FileName: string): Boolean;
var
  FWMIService: Variant;
  FSWbemLocator: 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;

function InitializeSetup: boolean;
begin
  Result := not IsAppRunning('notepad.exe');
  if not Result then
  MsgBox('notepad.exe is running. Please close the application before running the installer ', mbError, MB_OK);
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...