innosetup を使用してインストーラー (myinstaller) を作成し、アプリケーション (myapp) をインストールしました。コード スニペットは次のとおりです。
function legacy_check(): Boolean;
begin
ShellExec('runas', 'rundll32.exe', 'dfshim.dll,ShArpMaintain SecretsUtility.application, Culture=neutral, PublicKeyToken=0000000000000000, processorArchitecture=amd64', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
Result := True;
end;
function InitializeSetup(): Boolean;
begin
Result:=legacy_check(); // after this line only inno setup wizard page will appear
// code to install latest version
end;
ここで関数 legacy_check() は、システム内のmyappの古いバージョンの存在をチェックし、それをアンインストールして true を返します。myinstallerが先に進むことができるようにします。
ただし、ここで古いバージョンのアンインストール中に、アンインストールするかどうかをユーザーに尋ねます。その時点で、ユーザーが [OK] を押してアンインストールすると、正常に動作します。しかし、ユーザーが古いバージョンをアンインストールするために [キャンセル] を押すと、myinstallerを終了する必要があります。しかし、いずれにせよ True が返されるため、終了しません。
したがって、ユーザーがキャンセルボタンを押してアンインストールしたときにリターンコードを取得する必要があると思います。これにより、リターンコードを使用して true または false を返すことができます。
ユーザーがキャンセルを押してアンインストールしたときにリターンコードを取得する方法はありますか?
ShellExec('runas', 'rundll32.exe', 'dfshim.dll,ShArpMaintain SecretsUtility.application, Culture=neutral, PublicKeyToken=0000000000000000, processorArchitecture=amd64', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode); ?
それ以外の場合は、サイレント モードでアンインストールする方法を教えてください。パラメータが既に存在するため、 ShellExecで/SILENTパラメータを使用する方法について混乱しています。だから私に何かアイデアを提案してください。