我使用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
自定義動作被觸發,無論如何,它不應該。
任何想法如何改變這種情況?
謝謝,它的工作原理,但它創造了一個新問題。在我的實際代碼中,我需要從我的DLL運行一個方法。我使用相同的方法來調用自定義操作,但是當DLL被調用時,提升'MsiGetProperty'不會從C++代碼中檢索任何屬性。或者,他們是空的字符串。如果我刪除了'Execute =「延遲的」'',那麼它就不再是一個問題,但是它不會被提升。你看到我要去的地方 - 聽起來像一個捕獲 - 22 ... – ahmd0
是的,這真的很煩人。在每個先進的項目中都有人陷入這個問題。它在以下鏈接中有點解釋。您可以在InstallInitialize之前將屬性存儲在註冊表或設置文件中,並將其解析爲獨立於msi的延遲自定義操作。或者您必須遵循記錄的方法並將所有內容存儲在名爲「CustomActionData」的一個屬性中。我沒有在WiX中使用它,但一旦你明白了這一點,我肯定有些東西不是太複雜。 – Philm
看看這裏或谷歌它,你會發現相同的答案也許更好地解釋:http://msdn.microsoft.com/en-us/library/windows/desktop/aa370543(v=vs.85)。aspx – Philm