Как завершить процесс с помощью inno setup? - PullRequest
4 голосов
/ 27 октября 2011

Я хочу завершить процесс с помощью inno setup.i я хочу проверить, открыто ли окно, прежде чем я начну установку установки.

Могу ли я сделать это, выполнив поиск по имени окна?пожалуйста, помогите мне с примером кода, чтобы убить процесс

Ответы [ 4 ]

16 голосов
/ 02 сентября 2014

в разделе [UninstallRun] вы можете добавить следующий код:

Filename: {sys}\taskkill.exe; Parameters: "/f /im MyProcess.exe"; Flags: skipifdoesntexist runhidden
5 голосов
/ 24 мая 2013

Это то, что я сделал, чтобы предложить пользователю закрыть программу, если она была найдена работающей.

function CheckProcessRunning( aProcName,
                              aProcDesc: string ): boolean;
var
  ShellResult: boolean;
  ResultCode: integer;
  cmd: string;
  sl: TStringList;
  f: string;
  d: string;
begin
  cmd := 'for /f "delims=," %%i ' + 
         'in (''tasklist /FI "IMAGENAME eq ' + aProcName + '" /FO CSV'') ' + 
         'do if "%%~i"=="' + aProcName + '" exit 1'; 
  f := 'CheckProc.cmd';
  d := AddBackSlash( ExpandConstant( '{tmp}' ));
  sl := TStringList.Create;
  sl.Add( cmd );
  sl.Add( 'exit /0' );
  sl.SaveToFile( d + f );
  sl.Free;
  Result := true;
  while ( Result ) do
  begin
    ResultCode := 1;
    ShellResult := Exec( f,
                         '',
                         d, 
                         SW_HIDE, 
                         ewWaitUntilTerminated, 
                         ResultCode );
    Result := ResultCode > 0;
    if Result and 
       ( MsgBox( aProcDesc + ' is running. This program must be closed to continue.'#13#10 + 
                 'Please close it and click Yes to retry or click No to cancel this installer.', 
                 mbConfirmation, 
                 MB_YESNO ) <> IDYES ) then
      Break;
  end;
  DeleteFile( d + f );
end;

Я использовал ее в следующих специальных разделах кода:

// Perform some initializations.  Return False to abort setup
function InitializeSetup: Boolean;
begin
  // Do not use any user defined vars in here such as {app}
  InitializeGlobals;
  Result := not ( CheckProcessRunning( 'bcb.exe',      'C++ Builder' ) or
                  CheckProcessRunning( 'delphi32.exe', 'Delphi'      ) or
                  CheckProcessRunning( 'bds.exe',      'Rad Studio'  ));
end;


function InitializeUninstall: Boolean;
begin
  InitializeGlobals;
  Result := not ( CheckProcessRunning( 'bcb.exe',      'C++ Builder' ) or
                  CheckProcessRunning( 'delphi32.exe', 'Delphi'      ) or
                  CheckProcessRunning( 'bds.exe',      'Rad Studio'  ));
end;
1 голос
/ 27 ноября 2014

Менее сложный метод - запустить командный файл , который использует задачу kill

т.е.: если вы хотите убить блокнот перед удалением

taskkill /IM notepad.exe
1 голос
/ 27 октября 2011

Лучший вариант - использовать мьютекс, чтобы проверить, работает ли он по-прежнему, используя AppMutex. Один из способов закрыть его - найти дескриптор окна, а затем просто опубликовать простое сообщение WM_CLOSE.

Существуют и другие варианты, например Используемые файлы с расширением и PSVince

Также см. в этой статье для получения дополнительной информации.

...