94

Inno Setup を使用してインストーラーを作成しています。

以前にインストールしたバージョンを上書きするのではなく、インストーラーが自動的にアンインストールするようにしたい。どうやってやるの?

4

13 に答える 13

118

私は以下を使用しました。それが最も簡単な方法かどうかはわかりませんが、うまくいきます。

これは{#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 セットアップ スクリプト サンプル」も参照してください。これはさらに一歩進んで、以前にインストールされたバージョンのバージョン番号を読み取り、そのバージョン番号を現在のインストール パッケージのバージョン番号と比較します。

于 2010-01-20T08:00:20.883 に答える
29

AppId(つまり、-sectionで使用した値)を指定すると、レジストリからアンインストール文字列を読み取ることができるはずAppIDです[Setup]。使用した実際の値に置き換える必要がある場所Software\Microsoft\Windows\CurrentVersion\Uninstall\{AppId}\(またはのいずれHKLMかである可能性があるHKCUため、両方を確認することをお勧めします)の下にあります。またはの値を{AppId}探し、関数を使用してイベント関数から実行します。UninstallStringQuietUninstallStringExecInitializeSetup()

于 2010-01-07T10:10:33.643 に答える
8

「古いアイコンを削除したいだけ」(あなたのアイコンが変更/更新されたため) の場合は、これを使用できます。

; attempt to remove previous versions' icons
[InstallDelete]
Type: filesandordirs; Name: {group}\*;

これは「インストールの開始時に」実行されるため、基本的に古いアイコンが削除され、これが完全に完了した後も新しいアイコンがインストールされます。

「何かが変更された場合に備えて」アイコンごとにすべてのインストールでこれを行うだけです(とにかくすべて再インストールされます)。

于 2014-03-21T20:31:03.310 に答える
5

Inno Setup を使用する場合、以前のバージョンが別のインストーラー プログラムによってインストールされていない限り、以前のバージョンをアンインストールする必要はありません。それ以外の場合、アップグレードは自動的に処理されます。

于 2010-03-25T10:29:22.210 に答える
2

Craig McQueen が提供する答えは完全に実行可能です。ただし、これらのコメントを追加します。

  • {#emit SetupSetting("AppId")}コードが機能しないので、App ID を追加するだけです。
  • アンインストーラーによって削除される AppData/ フォルダーに INI 構成ファイルが保存されており、新しいバージョンをインストールするときにそれを消去したくないため、アンインストール プログラムを実行したくありませんでした。そこで、パスを取得した後、Craig McQueen から提供されたコードを少し変更して、プログラムがインストールされているディレクトリを削除しました。

したがって、Craig McQueen のコードに関しては、変更点は次のとおりです。

  • InstallLocationキーの代わりにキーを取得しUninstallStringます。
  • DelTreeの代わりに関数を使用します。Exec(sUnInstallString, ...)
于 2011-03-08T16:56:45.710 に答える
1

上記の提案を使用してGetUninstallString()内部CurStepChanged()でアンインストールを強制し、ディスク キャッシュの問題がある場合は、アンインストール後にアンインストーラー exe が削除されるまで実際にしばらく待機する関連ソリューションについて、以下を参照してください。

inno-setup でのディスク キャッシングの問題?

于 2013-09-25T07:30:35.340 に答える
0

[コード]セクションでアンインストーラーを実行できます。既存のアンインストーラーへのパスを取得する方法を理解する必要があります。アプリをインストールするときに簡単にするために、アンインストーラーを含むフォルダーを指すレジストリ文字列値を追加し、InitializeWizardコールバックでアンインストーラーを実行するだけです。

Inno Setupアンインストーラー名はすべてuninsnnn.exeの形式であることに注意してください。コードでは、それを考慮する必要があります。

于 2011-01-05T00:04:49.283 に答える
-8

[Run] セクションではなく、[UninstallRun] セクションを使用してください。実際、[実行] の下のプログラムはインストールに実行されるため、インストール直後にプログラムがアンインストールされます :-| 代わりに、インストール前に[UninstallRun] セクションが評価されます。

于 2010-11-23T12:41:27.450 に答える
-9

このリンクに従ってください: http://news.jrsoftware.org/news/innosetup/msg55323.html

InitializeSetup() 関数では、ユーザー プロンプトの後に "MSIEXEC /x {your program ID}" を呼び出して、古い古いバージョンをアンインストールできます。

于 2011-01-06T03:33:45.310 に答える