Inno Setup を使用してインストーラーを作成しています。
以前にインストールしたバージョンを上書きするのではなく、インストーラーが自動的にアンインストールするようにしたい。どうやってやるの?
Inno Setup を使用してインストーラーを作成しています。
以前にインストールしたバージョンを上書きするのではなく、インストーラーが自動的にアンインストールするようにしたい。どうやってやるの?
私は以下を使用しました。それが最も簡単な方法かどうかはわかりませんが、うまくいきます。
これは{#emit SetupSetting("AppId")}
、Inno Setup Preprocessor に依存するものを使用します。それを使用しない場合は、App ID を直接カット アンド ペーストしてください。
[Code]
{ ///////////////////////////////////////////////////////////////////// }
function GetUninstallString(): String;
var
sUnInstPath: String;
sUnInstallString: String;
begin
sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1');
sUnInstallString := '';
if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then
RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString);
Result := sUnInstallString;
end;
{ ///////////////////////////////////////////////////////////////////// }
function IsUpgrade(): Boolean;
begin
Result := (GetUninstallString() <> '');
end;
{ ///////////////////////////////////////////////////////////////////// }
function UnInstallOldVersion(): Integer;
var
sUnInstallString: String;
iResultCode: Integer;
begin
{ Return Values: }
{ 1 - uninstall string is empty }
{ 2 - error executing the UnInstallString }
{ 3 - successfully executed the UnInstallString }
{ default return value }
Result := 0;
{ get the uninstall string of the old app }
sUnInstallString := GetUninstallString();
if sUnInstallString <> '' then begin
sUnInstallString := RemoveQuotes(sUnInstallString);
if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then
Result := 3
else
Result := 2;
end else
Result := 1;
end;
{ ///////////////////////////////////////////////////////////////////// }
procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep=ssInstall) then
begin
if (IsUpgrade()) then
begin
UnInstallOldVersion();
end;
end;
end;
代替案
このブログ投稿「バージョン比較のための Inno セットアップ スクリプト サンプル」も参照してください。これはさらに一歩進んで、以前にインストールされたバージョンのバージョン番号を読み取り、そのバージョン番号を現在のインストール パッケージのバージョン番号と比較します。
AppId(つまり、-sectionで使用した値)を指定すると、レジストリからアンインストール文字列を読み取ることができるはずAppID
です[Setup]
。使用した実際の値に置き換える必要がある場所Software\Microsoft\Windows\CurrentVersion\Uninstall\{AppId}\
(またはのいずれHKLM
かである可能性があるHKCU
ため、両方を確認することをお勧めします)の下にあります。またはの値を{AppId}
探し、関数を使用してイベント関数から実行します。UninstallString
QuietUninstallString
Exec
InitializeSetup()
「古いアイコンを削除したいだけ」(あなたのアイコンが変更/更新されたため) の場合は、これを使用できます。
; attempt to remove previous versions' icons
[InstallDelete]
Type: filesandordirs; Name: {group}\*;
これは「インストールの開始時に」実行されるため、基本的に古いアイコンが削除され、これが完全に完了した後も新しいアイコンがインストールされます。
「何かが変更された場合に備えて」アイコンごとにすべてのインストールでこれを行うだけです(とにかくすべて再インストールされます)。
Inno Setup を使用する場合、以前のバージョンが別のインストーラー プログラムによってインストールされていない限り、以前のバージョンをアンインストールする必要はありません。それ以外の場合、アップグレードは自動的に処理されます。
Craig McQueen が提供する答えは完全に実行可能です。ただし、これらのコメントを追加します。
{#emit SetupSetting("AppId")}
コードが機能しないので、App ID を追加するだけです。したがって、Craig McQueen のコードに関しては、変更点は次のとおりです。
InstallLocation
キーの代わりにキーを取得しUninstallString
ます。DelTree
の代わりに関数を使用します。Exec(sUnInstallString, ...)
上記の提案を使用してGetUninstallString()
内部CurStepChanged()
でアンインストールを強制し、ディスク キャッシュの問題がある場合は、アンインストール後にアンインストーラー exe が削除されるまで実際にしばらく待機する関連ソリューションについて、以下を参照してください。
[コード]セクションでアンインストーラーを実行できます。既存のアンインストーラーへのパスを取得する方法を理解する必要があります。アプリをインストールするときに簡単にするために、アンインストーラーを含むフォルダーを指すレジストリ文字列値を追加し、InitializeWizardコールバックでアンインストーラーを実行するだけです。
Inno Setupアンインストーラー名はすべてuninsnnn.exeの形式であることに注意してください。コードでは、それを考慮する必要があります。
[Run] セクションではなく、[UninstallRun] セクションを使用してください。実際、[実行] の下のプログラムはインストール後に実行されるため、インストール直後にプログラムがアンインストールされます :-| 代わりに、インストール前に[UninstallRun] セクションが評価されます。
このリンクに従ってください: http://news.jrsoftware.org/news/innosetup/msg55323.html
InitializeSetup() 関数では、ユーザー プロンプトの後に "MSIEXEC /x {your program ID}" を呼び出して、古い古いバージョンをアンインストールできます。