2016-08-03 68 views
0

我有一個用於32位應用程序(使用MakeMsi構建,最初用於Windows XP,並自此之後進行簡單維護)的安裝程序包,無法註冊COM服務器在現代(64位)Windows系統上(7,8,10)。這是我看到想正常安裝MSI我時:避免將MSI帶入兼容模式「以前的Windows版本」

Screenshot of COM registration error

應用程序錯誤

異常EOleSysError模塊XYZ在000F0B01。訪問OLE註冊表時出錯。

如果我把MSI在兼容模式以前的Windows的版本中,COM服務器註冊成功。由於「它正在工作」不知何故,我沒有花費太多時間探索迄今的原因。但最後,我已經精疲力竭地記住我們的客戶(有時候也是我)在這個先決條件中的一次又一次,所以我想解決這個問題。

登記(並且註銷)經由CustomAction S DONE,在我尋找到它使用奧卡:

"[INSTALLDIR.MYAPP]\placeholder.exe" -regserver 
"[INSTALLDIR.MYAPP]\placeholder.exe" -unregserver 

對於每個那些條目,Type1122SourceINSTALLDIR.MYAPP

我可以想象,COM服務器在安裝過程中啓動時權限不足,但不是安裝程序自動運行的管理員權限?我的意思是,當我(作爲標準用戶)通過雙擊啓動安裝程序時,它會在之前顯示UAC提示進行實際安裝。爲什麼COM服務器不能以提升的註冊和註銷權利運行?它令人困惑...

我應該如何更改我的MSI以使Windows安裝程序成功處理它?

回答

0

在學習瞭如何register COM servers the right way後,我仍然有興趣瞭解爲什麼我的MSI包之前工作。換句話說:Windows XP之後的關鍵變化是什麼?
...我同時也檢查了MSI的工作原理,當我以管理員身份運行它時...

正如我想出讀取維克斯工具集的文檔,存在一種用於CustomAction屬性Impersonate如果CA與升高的權限執行控制:

This attribute specifies whether the Windows Installer, which executes as LocalSystem, should impersonate the user context of the installing user when executing this custom action. Typically the value should be 'yes', except when the custom action needs elevated privileges to apply changes to the machine.

它指的是CustomAction TableType字段中的msidbCustomActionTypeNoImpersonateflag。我在我的MSI觀察值1122反編譯成這樣:

我曾經用快速方法「修復」問題,啓用了CA類型中的msidbCustomActionTypeNoImpersonate標誌(2048)(在WiX中這將是Impersonate="no")。

翻譯成我的MAKEMSI腳本,我不得不使用System屬性在TypeExeCa command才能使自注冊工作前:

Type="Deferred Sync AnyRc System" 

我完全意識到這只是一種解決方法,因爲爲(註銷)註冊運行COM服務器是危險的。因此,PhilDWs answer第二部分中提到的解決方案應該是首選:通過MSI中的註冊表項管理與COM相關的靜態信息。但有時您需要快速解決方案,有時沒有其他選項,請參閱Euro Micellis comment

2

我假設您知道問題出在您作爲自定義操作運行的可執行文件中,而不是Windows Installer中的任何內容。這意味着問題將是可執行文件中的代碼,並且可能是舊的,並且與以後的操作系統版本不兼容。您需要查看代碼才能看到不支持的功能。

許多安裝不會打擾自注冊。這些數據都是靜態數據,可以提取一次幷包含在註冊表項和其他COM類表的MSI文件中。這意味着在安裝過程中不需要運行代碼。

+1

事實上,自我註冊在MSI軟件包中非常不受歡迎,原因如下(請閱讀https://msdn.microsoft.com/en-us/library/windows/desktop/aa371608.aspx)。我只在沒有其他選擇時才使用它(幾個極其古老的第三方OCX控件,它們極力阻止我確定他們在註冊表中寫入的密鑰) –

+0

寫完問題後,我偶然發現這篇文章正是這樣說的:[*'使用自注冊是非常強烈的不鼓勵微軟,應該不惜一切代價避免。* *(https://www.firegiant.com/wix/tutorial/com-expression-syntax- miscellanea/components-of-a-different-color /)現在我確定這是我的問題。你有沒有想過如何獲得不屬於VS解決方案的COM服務器(exe)的註冊表項?我的意思是,除了在體外自我註冊之前和之後對註冊表進行區分? – Wolf

+0

關於*問題出現在可執行文件中*:我認爲這個可執行文件最有可能是正確的,但是權限並不適合。如果我開始自我註冊的exe文件,我必須使用管理員權限來執行此操作。 (當然,我認爲自行註冊並不是安裝時的正確選擇。) – Wolf