2013-07-11 76 views
3

我使用Wix編寫我自己的MSI安裝程序。我只需要在卸載產品之前運行自定義操作,但之前刪除任何註冊表值或文件。我做了以下(只是嘗試):微星卸載Wix之前的自定義操作

<Property Id='CALC'>Calc.exe</Property> 
<CustomAction Id='BeforeUninstall01' Property='CALC' ExeCommand='' Return='check' /> 

<InstallExecuteSequence> 
    <Custom Action='BeforeUninstall01' After='InstallInitialize'>Installed</Custom> 
</InstallExecuteSequence> 

它的工作原理,如果我選擇uninstall從控制面板,但如果我跑我的MSI代替(儘管它已經安裝)BeforeUninstall01自定義動作被觸發,無論如何,它不應該。

任何想法如何改變這種情況?

回答

6

您選擇「安裝」的條件。

使用內置屬性「刪除」將導致鑑於你的代碼想要的條件:

<InstallExecuteSequence> 
    <Custom Action='BeforeUninstall01' After='InstallInitialize'>REMOVE="ALL"</Custom> 
</InstallExecuteSequence> 

這也可以讓你(哪怕是沒有必要)卸載單一功能,但不沒有您的自定義操作(ca)的整個產品被觸發。 換句話說,CA是永遠也只有觸發,如果

此致條件啓動CA 總是,而不是先安裝(包括維修,更新,卸載,修改,補丁等,這是不,你需要什麼,確實如此。

Reubz的情況略有不同,這將啓動總是而不是一個重大的升級,這是不是這裏真正的改進過程中先安裝並沒有。

關於排序: 如果你的ca真的需要提升權利,那麼你hav E要運行的自定義操作「延期」與系統中的權限和您定CA定義修改爲(如果沒有,讓它):

<CustomAction Id='BeforeUninstall01' Property='CALC' ExeCommand='' Execute="deferred" Impersonate="no" Return="check" /> 

(我不是WiX的精靈,只有我自己知道MSI相當不錯,所以我沒有檢查過任何部分的WiX代碼,只有這些問題。)

+0

謝謝,它的工作原理,但它創造了一個新問題。在我的實際代碼中,我需要從我的DLL運行一個方法。我使用相同的方法來調用自定義操作,但是當DLL被調用時,提升'MsiGetProperty'不會從C++代碼中檢索任何屬性。或者,他們是空的字符串。如果我刪除了'Execute =「延遲的」'',那麼它就不再是一個問題,但是它不會被提升。你看到我要去的地方 - 聽起來像一個捕獲 - 22 ... – ahmd0

+0

是的,這真的很煩人。在每個先進的項目中都有人陷入這個問題。它在以下鏈接中有點解釋。您可以在InstallInitialize之前將屬性存儲在註冊表或設置文件中,並將其解析爲獨立於msi的延遲自定義操作。或者您必須遵循記錄的方法並將所有內容存儲在名爲「CustomActionData」的一個屬性中。我沒有在WiX中使用它,但一旦你明白了這一點,我肯定有些東西不是太複雜。 – Philm

+0

看看這裏或谷歌它,你會發現相同的答案也許更好地解釋:http://msdn.microsoft.com/en-us/library/windows/desktop/aa370543(v=vs.85)。aspx – Philm

0

嘗試一個附加條件,以檢查該產品不被升級

<Custom Action='BeforeUninstall01' After='InstallInitialize'>Installed AND NOT UPGRADINGPRODUCTCODE</Custom> 
+0

你知道我剛剛嘗試過它,它不僅啓動了'Calc.exe',而且它在UAC提升提示出現之前就這麼做了。也許我應該比'InstallInitialize'晚一段時間調用它? – ahmd0