0

マシンに複数のプログラムが存在するかどうかを確認し、存在する場合は削除してから、Inno で作成したカスタム インストーラー パッケージにバンドルしているソフトウェアをインストールするという興味深い状況に遭遇しました。設定。これは、次の質問に記載されている作業に便乗することになります。

ここからいくつかの良いアイデアを見つけました。ただし、これを使用して複数のプログラムがインストールされていることを確認し、それらをアンインストールする方法がわかりません。たとえば、作成しようとしているカスタム インストーラーのワークフローは次のようになります。

  • 古いプログラム A が存在しない場合にのみ、新しいプログラム A のインストーラーを実行します。古いプログラム A が存在する場合は、新しいプログラム A をアンインストールしてインストールを再開します。
  • 古いプログラム B が存在しない場合にのみ、新しいプログラム B のインストーラーを実行します。古いプログラム B が存在する場合は、アンインストールして新しいプログラム B のインストールを再開します。
  • いくつかのクリーンアップ コマンドを実行し、新しくインストールされた programA と新しくインストールされた programB の構成用のレジストリ キーをいくつか追加します。
  • 出口

バンドルされている他のソフトウェアをインストールする前に、複数のプログラムをチェックしてアンインストールできるように、リンクされたスクリプトからカスタム変数を使用する方法があるのではないかと提案する人もいます。ただし、新しい変数またはカスタム変数を作成しようとするたびに、インストーラーがコンパイルされなくなったり、意図したとおりに機能しない場合があります (つまり、1 つのプログラムがアンインストールされ、もう 1 つのプログラムはアンインストールされません)。この目的のために、私の質問は、これらのカスタム変数の作成と、同じコード セットをランダムに何度もコピー アンド ペーストするのではなく、コードをループするために使用または拡張する方法に関係しています。これが理にかなっていることを願っています。

4

1 に答える 1

2

TLama または経験のある人がコードをクリーンアップすると確信していますが、チェックとアンインストールにはそのようなものを使用できます。

function GetUninstallStringA: string;
var
  sUnInstPathA: string;
  sUnInstallStringA: String;
begin
  Result := '';
  sUnInstPathA := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{{A227028A-40D7-4695-8BA9-41DF6A3895C7}_is1'); //Your AppA GUID/ID
  sUnInstallStringA := '';
  if not RegQueryStringValue(HKLM, sUnInstPathA, 'UninstallString', sUnInstallStringA) then
    RegQueryStringValue(HKCU, sUnInstPathA, 'UninstallString', sUnInstallStringA);
  Result := sUnInstallStringA;
end;

function GetUninstallStringB: string;
var
  sUnInstPathB: string;
  sUnInstallStringB: String;
begin
  Result := '';
  sUnInstPathB := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{{A227028A-40D7-4695-8BA9-41DF6A3895C8}_is1'); //Your AppB GUID/ID
  sUnInstallStringB := '';
  if not RegQueryStringValue(HKLM, sUnInstPathB, 'UninstallString', sUnInstallStringB) then
    RegQueryStringValue(HKCU, sUnInstPathB, 'UninstallString', sUnInstallStringB);
  Result := sUnInstallStringB;
end;

function IsUpgradeA: Boolean;
begin
  Result := (GetUninstallStringA <> '');
end;

function IsUpgradeB: Boolean;
begin
  Result := (GetUninstallStringB <> '');
end;

function InitializeSetup: Boolean;
var
V: Integer;
iResultCodeA, iResultCodeB: Integer;
sUnInstallStringA, sUnInstallStringB: string;
AppA, AppB: Boolean;
    begin
      Result := True; // in case when no previous versions were found
      AppA:= RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{A227028A-40D7-4695-8BA9-41DF6A3895C7}_is1'); //Your AppA GUID/ID
      AppB:= RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{A227028A-40D7-4695-8BA9-41DF6A3895C8}_is1'); //Your AppB GUID/ID
        if (AppA) and (AppB) then begin
          V := MsgBox(ExpandConstant('Hey! Old versions of Apps A and B were detected. Do you want to uninstall them?'), mbInformation, MB_YESNO); 
//Custom Message if App installed
          if V = IDYES then
          begin
            sUnInstallStringA := GetUninstallStringA;
            sUnInstallStringA :=  RemoveQuotes(sUnInstallStringA);
            Exec(ExpandConstant(sUnInstallStringA), '/silent', '', SW_SHOW, ewWaitUntilTerminated, iResultCodeA);
            sUnInstallStringB := GetUninstallStringB;
            sUnInstallStringB :=  RemoveQuotes(sUnInstallStringB);
            Exec(ExpandConstant(sUnInstallStringB), '/silent', '', SW_SHOW, ewWaitUntilTerminated, iResultCodeB);
            Result := True; //if you want to proceed after uninstall
           //Exit; //if you want to quit after uninstall
          end
          else begin
            MsgBox('You have to uninstall older versions of Apps A and B first. Installation will now be terminated.', mbInformation, MB_OK);
            Result := False; //when older versions present and not uninstalled
       end;
      end; 
          if (AppA) and (not AppB) then begin
          V := MsgBox(ExpandConstant('Hey! Old version of App A was detected. Do you want to uninstall it?'), mbInformation, MB_YESNO); 
//Custom Message if App installed
          if V = IDYES then
          begin
            sUnInstallStringA := GetUninstallStringA;
            sUnInstallStringA :=  RemoveQuotes(sUnInstallStringA);
            Exec(ExpandConstant(sUnInstallStringA), '/silent', '', SW_SHOW, ewWaitUntilTerminated, iResultCodeA);
            Result := True; //if you want to proceed after uninstall
           //Exit; //if you want to quit after uninstall
          end
          else begin
            MsgBox('You have to uninstall older version of App A first. Installation will now be terminated.', mbInformation, MB_OK);
            Result := False; //when older versions present and not uninstalled
       end;
      end;  
          if (AppB) and (not AppA) then begin
          V := MsgBox(ExpandConstant('Hey! Old version of App B was detected. Do you want to uninstall it?'), mbInformation, MB_YESNO); 
//Custom Message if App installed
          if V = IDYES then
          begin
            sUnInstallStringB := GetUninstallStringB;
            sUnInstallStringB :=  RemoveQuotes(sUnInstallStringB);
            Exec(ExpandConstant(sUnInstallStringB), '/silent', '', SW_SHOW, ewWaitUntilTerminated, iResultCodeB);
            Result := True; //if you want to proceed after uninstall
           //Exit; //if you want to quit after uninstall
          end
          else begin
            MsgBox('You have to uninstall older version of App B first. Installation will now be terminated.', mbInformation, MB_OK);
            Result := False; //when older versions present and not uninstalled
        end;
       end;
      end;

次に、AppA と AppB の新しいインストーラーをこのインストーラーに組み込み、一時的に抽出して実行することで実行できます。例:

[Files] 
Source: ".\AppA\setup_appa.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall 
Source: ".\AppB\setup_appb.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall 

[Run] 
Filename: "{tmp}\setup_appa.exe"; Flags: waituntilterminated skipifdoesnotexist; StatusMsg: "Installing App A..." 
Filename: "{tmp}\setup_appa.exe"; Flags: waituntilterminated skipifdoesnotexist; StatusMsg: "Installing App A..."

[Files]または、セクションと[Code]セクションを組み合わせた実行スクリプトを作成できます。

アプリ A とアプリ B の埋め込みインストーラー:

[Files]
Source: ".\AppA\setup_appa.exe"; DestDir: "{tmp}"; Flags: dontcopy 
Source: ".\AppB\setup_appb.exe"; DestDir: "{tmp}"; Flags: dontcopy

そして、で実行するように呼び出し[Code]ます:

[Code]

拡張中function InitializeSetup: Boolean;? または、他の場所に配置します。例: procedure CurPageChanged(CurPageID: Integer);+ with...if CurPageID = wpInstalling then
//YOUR RUN SECTION HERE end;

ExtractTemporaryFile('setup_appa.exe');
Exec(ExpandConstant('{tmp}'+'\setup_appa.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
于 2012-08-01T08:44:59.240 に答える