2011-02-24 31 views
0

我正在爲具有多個先決條件的產品編寫引導程序。要確定要安裝哪些準備,我使用MSI AppSearch。Windows Installer:MsiDoAction()返回ERROR_FUNCTION_NOT_CALLED

引導程序打開myproduct.msi::MsiOpenPackageEx(),然後調用::MsiDoAction("AppSearch")加載性能,並最終獲取感興趣的屬性,以確定哪些prereqs需要加載。然後關閉prereqs會話(::MsiCloseHandle()),以便它不會干擾prereqs安裝程序使用的任何MSI會話。最終(在安裝prereq之後)引導程序運行msiexec /i myproduct.msi

我想通過調用自定義操作::MsiDoAction("MyExtendedAppSearch")來擴展此操作,該操作將在prereqs會話期間使用WMI執行MSI AppSearch無法執行的搜索來填充其他MSI屬性。但是,當我打電話給該行動時,它將返回ERROR_FUNCTION_NOT_CALLED。當在真實安裝會話中調用相同的操作時,工作得很好。

我已經嘗試過用C .dll和VBScript(嵌入,Binary表,無所謂)。顯然,在我真正的安裝中,我沒有做某種初始化。另外或者,我沒有在動作上設置正確的標誌位,或者應該安排在InstallExecuteSequence(或不是,或者其他)。

您的指導將非常感謝。提前致謝。

+0

之後標準動作是您的自定義動作安排在哪個序列表中? MsiDoAction只能調用UI操作並執行InstallInitialize之前的操作。您是否嘗試在AppSearch之後立即安排自定義操作? – 2011-02-24 08:25:55

回答

1

@Cosmin Pirvu:它根本沒有計劃,也沒有在任何序列表中。它只存在於CustomAction表中,並由chainer程序明確調用。

沒關係,夥計們。錯誤的報警/馬虎程序員。

元解決方案:仔細閱讀您的前任代碼,並更仔細地閱讀文檔。

解決方法:使用MSIOPENPACKAGEFLAGS_IGNOREMACHINESTATE標誌調用::MsiOpenPackageEx()。根據MSI文檔,使用該標誌返回受限制的會話句柄,該句柄無法調用.dll,.exe或腳本自定義操作。

傳遞一個標誌 - 或等效的調用::MsiOpenPackage()(無Ex) - 返回不受限制的句柄可以的.dll,.exe或腳本自定義操作。

相關問題