プログラムがまだ実行中であり、実行可能ファイルを削除できないため、InnoSetupはアンインストール中にコンポーネントの削除に失敗します。アンインストールを続行する前に、実行されているかどうかを確認するにはどうすればよいですか?
これらを確認してください
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 APIを使用してアプリケーションを列挙する方法 (これは、何らかの理由で英語版のKB175030が見つからないため、ドイツ語版にリンクしています。
またはKB175030-DEのグーグル翻訳版をお試しください
上記以外の方法を使用しました。これはアンインストールであるため、アプリケーションを強制終了してアンインストールできます。あなたがAppMutexを使用できないときの最も簡単な方法:(関連 Windowsでプロセスを本当に殺す )
[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"
誰かがこれを助けてくれることを願っています。私はこれを長い間探しました。
このソリューションを試してください!アプリを閉じる他のソリューションで問題が発生しましたが、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;
このソリューションの元のソース への主要な小道具。
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"を使用して(再)インストールする前にプロセスを強制終了する を参照してください。