4

inno setup.iを使用してプロセスを強制終了したいのですが、セットアップのインストールを開始する前にウィンドウが開いているかどうかを確認します。inno setupを使ってプロセスを終了するには?

Windowsの名前を検索することでこれを行うことはできますか? プロセスを強制終了するためのサンプルコードを教えてください。

+0

多分単純なミューテックス解決策で十分でしょうか?あなたのアプリケーションにmutexを追加し、 'Setup'セクションの' AppMutex'パラメータを使います。 –

答えて

1

ベストプラクティスは、ムーテックスを使用してまだ実行中であるかどうかを確認することです。AppMutex。これを閉じる方法の1つは、ウィンドウハンドルを見つけて単純なWM_CLOSEメッセージをポストすることです。

Files in use extensionPSVince

また少し詳しくthis articleを見るような他のオプションがあります。

+0

begin Wnd:= FindWindowByWindowName( 'name'); Wnd <> 0の場合、SendMessage(Wnd、WM_CLOSE、0、0); 結果:= True;私はthis.itのように試みました。うまくいきましたが、私はこのウィンドウを終了するためにトレイwindow.howを閉じたいです – Nithin

+1

[UninstallRun] ファイル名:{cmd};パラメータ:/ c taskkill/f/im notepad.exe;フラグ:runhidden.canこれは好きですか? – Nithin

+0

問題が発生する可能性があるので、それを完全に殺すだけではありません。隠しウィンドウとFindWindowメソッドを使用してシャットダウンするように通知します。 – Deanna

5

これは、実行中であることがわかった場合にプログラムを終了するようユーザーに促すためのものです。

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; 

私は次のように次のような特別なコードセクションでそれを使用:

Filename: {sys}\taskkill.exe; Parameters: "/f /im MyProcess.exe"; Flags: skipifdoesntexist runhidden 
+0

それは意味されている方法です。アプリケーションを閉じるには、ユーザーにはきちんと尋ねてください。 – thomiel

+0

これを愛する;現在のバージョンのInitializeGlobalsを除きます。それを壊す。 – Will

15

を、次のコードを追加することができます方法は、タスクキルを使用するbatch fileを実行することです

ie:あなたが望むならアンインストールする前にメモ帳を削除するように編集しました

1

それほど複雑:[UninstallRun]セクションで

// 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; 
関連する問題