2

WIXを使用してアプリケーションをインストールするプロジェクトに取り組んでいます。要件の1つは、現在のバージョンをインストールする前に古いバージョンを削除することです。古いバージョンはMSIベースではなく、SetupApi(infファイルに依存)で作成されています。

これはカスタムアクションで実現できると思いました。ロジックは次のとおりです。

  1. HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \%NAME%で「古代」バージョンを探し、可能であればUninstallString値を抽出します
  2. 値が設定されている場合は、そのコマンドを実行するカスタムアクションを実行します。通常は、RunDll32 advpack.dll、LaunchINFSection C:\ PROGRA〜1 \ PROGRAM \ file.inf、DefaultUninstallのような文字列です。
  3. このアクションは、共有ファイルとレジストリキーを持っているため、プログラムをインストールする前に実行する必要があります。MSIのインストールの最後にカスタムアクションを実行すると、プログラムが中断します

私の質問は次のとおりです。

  1. これは、古いINFベースのプログラムを削除するための推奨される方法ですか?
  2. INFベースのプログラムをサイレントにアンインストールする方法はありますか?そうしないと、ユーザーエクスペリエンスがかなり悪くなります。ある人がプログラムをインストールしていると、突然「プログラムのアンインストール」ウィンドウが表示されます。これは直感に反します。[アンインストールコマンドに「、3」を追加することで解決しました]

興味のある方のために、上記で説明したことを実行するコードスニペットを次に示します。

<Property Id="ANCIENTVERSION">
  <RegistrySearch Id="RegistrySearchAncientVersion" Type="raw"
     Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Program" 
     Name="UninstallString" />
</Property>

<CustomAction Id="removeAncientVersion"
        Directory="SystemFolder"
        <!--ExeCommand="[ANCIENTVERSION]"  regular uninstall-->
        ExeCommand="[ANCIENTVERSION],3" <!--silent uninstall-->
        Execute="immediate"
        Return="check"/>

<InstallExecuteSequence>
  <Custom Action='removeAncientVersion' After='InstallValidate'>ANCIENTVERSION</Custom>
</InstallExecuteSequence>
4

1 に答える 1

1

調査の結果、サイレントアンインストールを実行するには、UninstallStringコマンドラインの最後に「、3」を追加する必要があることがわかりました。私はそれをテストしました、そしてそれは働きます:

定期的なアンインストール

RunDll32 advpack.dll,LaunchINFSection C:\PROGRA~1\PROGRAM\file.inf, DefaultUninstall

サイレントアンインストール

RunDll32 advpack.dll,LaunchINFSection C:\PROGRA~1\PROGRAM\file.inf, DefaultUninstall,3

最初の質問については、アンインストールのメカニズムは、プログラムの追加と削除で[アンインストール]をクリックするのと同じであるため、それ以上のクリーン/優れたものは得られないと思います。

于 2012-02-01T14:57:15.067 に答える