This is what I did to encourage the user to close the program if it was running.
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;
I used it in the following sections of the special code as follows:
// 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;
source share