2012-01-30 97 views
2

我正在使用WIX安裝應用程序的項目。其中一個要求是在安裝當前版本之前刪除舊版本。舊版本是不是基於MSI的,它是使用SetupApi(依賴於inf文件)創建的。Wix自定義操作以刪除使用INF文件安裝的舊版本

我想這可以通過自定義操作來實現,邏輯如下:

  1. 尋找在HKLM \ SOFTWARE 「古」 版\微軟\的Windows \ CurrentVersion \卸載\%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> 
+0

我想你可以創建一個應用程序,並用你自己的相應INF調用SetupAPI函數。這樣你可以禁止默認的進度UI。或者,您可以向用戶顯示一個對話框,您可以在其中說您將要刪除該應用程序的先前版本。 – 2012-02-01 06:36:53

+0

直接調用SetupAPI函數是一個選項 - 但不幸的是,我無法找到有關如何使用SetupAPI執行無提示卸載的任何詳細信息。 有關於靜默安裝的討論,但我不確定這適用於刪除過程。到目前爲止,我的實驗並不成功。 – Alex 2012-02-01 14:04:44

回答

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 

至於第一個問題 - 因爲卸載機制是點擊「卸載」中添加相當於/刪除程序,我相信它不能得到任何更清潔/更好的。