web-dev-qa-db-ja.com

プログラムが実行されているため、アンインストールは失敗します。削除を試みる前に、Inno Setupで実行中のプロセスをチェックするにはどうすればよいですか?

プログラムがまだ実行中であり、実行可能ファイルを削除できないため、InnoSetupはアンインストール中にコンポーネントの削除に失敗します。アンインストールを続行する前に、実行されているかどうかを確認するにはどうすればよいですか?

24
max

これらを確認してください

Inno Setup:AppMutexを使用して任意のユーザーセッションで実行されているインスタンスを検出します

Inno Setup:アプリケーションは実行されていますか?

Inno Setup:アプリケーションが実行されているかどうかを検出します

いくつかの方法があります。プログラムでミューテックスの使用が定義されている場合

[Setup]
AppMutex=MyMutexName

または、Codeセクションで指定されたミューテックスの場合

function CheckForMutexes (Mutexes: String): Boolean;

あなたも使うことができます

function FindWindowByClassName (const ClassName: String): Longint; 

クラス名でウィンドウハンドルを取得し、メッセージを送信します。

または名前で取得

function FindWindowByWindowName (const WindowName: String): Longint;

または、この特定のユースケースにいくつかのDLLファイルの1つを使用します

または読んだ後に自分でそれを行う

Win32でアプリケーションを「クリーンに」終了する方法

Win32 APIを使用してアプリケーションを列挙する方法 (これは、何らかの理由で英語版のKB175030が見つからないため、ドイツ語版にリンクしています。

またはKB175030-DEのグーグル翻訳版をお試しください

KB175030 DE-> EN

22
jitter

上記以外の方法を使用しました。これはアンインストールであるため、アプリケーションを強制終了してアンインストールできます。あなたがAppMutexを使用できないときの最も簡単な方法:(関連 Windowsでプロセスを本当に殺す

[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"

誰かがこれを助けてくれることを願っています。私はこれを長い間探しました。

20
kdoteu

このソリューションを試してください!アプリを閉じる他のソリューションで問題が発生しましたが、InnoSetupはインストールされたファイルがロックされていると考えていました。

定数を定義することを忘れないでください:

#define MyAppName "AppName"
#define MyAppExeName "AppName.exe"

[Code]
function InitializeUninstall(): Boolean;
  var ErrorCode: Integer;
begin
  ShellExec('open','taskkill.exe','/f /im {#MyAppExeName}','',SW_HIDE,ewNoWait,ErrorCode);
  ShellExec('open','tskill.exe',' {#MyAppName}','',SW_HIDE,ewNoWait,ErrorCode);
  result := True;
end;

このソリューションの元のソース への主要な小道具。

9
sky-dev

AppMutexディレクティブ を使用して、アプリケーションの実行中にアンインストーラーが続行されないようにします。

[Setup]
AppMutex=MyProgMutex

アプリケーションは、ディレクティブで指定されたミューテックスを作成する必要があります。例については、リンクされたAppMutexディレクティブのドキュメントを参照してください。


アンインストーラーでアプリケーションを強制終了する場合は、アプリケーションがまだ実行されているときに、代わりに次のコードを使用してください。

function InitializeUninstall(): Boolean;
var
  ErrorCode: Integer;
begin
  if CheckForMutexes('MyProgMutex') and
     (MsgBox('Application is running, do you want to close it?',
             mbConfirmation, MB_OKCANCEL) = IDOK) then
  begin
    Exec('taskkill.exe', '/f /im MyProg.exe', '', SW_HIDE, 
         ewWaitUntilTerminated, ErrorCode);
  end;

  Result := True;
end;

上記のAppMutexディレクティブと同様に、アプリケーションは CheckForMutexes 呼び出しで指定されたミューテックスを作成する必要があります。


インストーラーの場合、これをコーディングする必要はないことに注意してください。インストーラーにはリスタートマネージャーが組み込まれています。
InnoSetupの "taskkill/f/im"を使用して(再)インストールする前にプロセスを強制終了する を参照してください。

7
Martin Prikryl