2012-03-09 82 views
0

在我們團隊正在開發的其中一個項目中,我們正在嘗試爲現有的桌面應用程序製作自動部署系統。爲了做到這一點,我們需要了解如何安裝應用程序以開始使用InstallShield如何在不使用InstallShield的情況下從OCX中提取Com信息?

我們可以訪問InstallShield清單,但有一個OCX文件,我們無法弄清楚如何手動安裝(沒有InstallShield)。這個特定的OCX文件設置爲'提取COM信息'。

以下是截圖:

InstallShield Properties Dialog

該應用中的其他OCX控件是自注冊,這樣他們就可以與Regsvr32.exe註冊。但是我們遇到問題的OCX無法以這種方式註冊。

如何手動安裝在InstallShield清單中設置爲「提取COM信息」的OCX文件?

回答

4

RegSvr32.exe調用LoadLibrary API來加載您的DLL,然後調用DLL中的DllRegisterServer入口點。該函數內的代碼執行實際的COM註冊。如果RegSvr32失敗,那通常意味着DLL的依賴關係丟失或無效。

InstallShield將所有這一切與一些真正的低級別的黑客攻擊一起虛擬化,然後收穫它。關於這個問題的一篇舊文是:

Spying on Registry Entries

InstallShield不會真正使用每說這種技術(他們有多種技術,其中大部分未記錄和各種過濾器和轉換引擎來清理數據)。如果您只是在不使用InstallShield的情況下尋找方法,請查看Windows Installer XML的「Heat」命令行工具。這可以將COM元數據「收穫」到WxS XML元素中。

此外,WiX是開源的,所以如果你真的好奇,你可以看看他們的代碼。

+0

對不起,我們不能修改DLL,所以我們必須找到另一種方式。 – 2012-03-09 19:22:04

+0

我不相信我說過修改任何DLL的東西。 – 2012-03-09 19:27:44

+0

+1感謝您的回覆,讓我澄清。我不確定「RegSvr32.exe調用LoadLibrary來加載你的DLL,然後DLL裏面的DllRegisterServer()。」手段。你是說在部署系統中運行DllRegisterServer嗎? (我們可以通過編程來完成)。重申,是否在部署應用程序的內部,必須調用DllReigsterServer()? – 2012-03-09 19:52:19

2

正如克里斯托弗提到的,InstallShield通過在與regsvr32.exe調用類似的方式調用它時查看它註冊的內容來從.ocx中提取COM信息。其各種形式的重定向(用於捕獲目的)具有在文件在構建環境中註冊時解決幾個潛在權限問題的附加好處。但是,如果我不錯過你的問題的重點,那就是「爲什麼regsvr32.exe your.ocx在目標機器上工作?」

這在黑暗中有點刺,因爲你沒有包含足夠的信息。雖然缺少依賴關係可能會導致此問題,但我猜測您只能在Windows Vista/Server 2008或更高版本上看到此故障。如果是這種情況,那麼很可能您的應用程序試圖寫入受Windows Resource Protection(WRP)保護的註冊表項,或者被每個用戶的typelib註冊問題絆住。

當性能較差的自注冊例程遇到WRP時,它會嘗試寫入其缺少修改權限的註冊表項,然後註冊失敗。我不確定在那之前它寫的鑰匙會發生什麼,但是之後的所有鑰匙絕對不會讓它出現在機器上。您應該能夠確認是否使用類似Process Monitor這樣的工具。

如果是這種情況,你會怎麼做?那麼,你可以堅持像InstallShield(你說你想離開)的提取方法。您可以修復該文件,以免試圖寫入受保護的密鑰(您稱其無法修改)。或者你也許可以使用Application Compatibility Toolkit(ACT)來填補一些空白,但我不知道你通常可以在下游做些什麼。一般來說,我會建議修復該文件,或者繼續使用工作方法。

+0

+1感謝您的深思熟慮的評論,您認爲我應該在問題中包含哪些額外信息? – 2012-03-10 19:44:45

+0

Michael在InstallShield中有實際工作的不公平優勢,所以他知道內部和外部的代碼。 :-) FWIW,對於你的問題,我不清楚的是,如果你想在非常低的層次上理解提取是如何工作的,那麼你可以編寫自己的程序,或者如果你只是想解決COM提取問題有一次,或者你只是不想依靠InstallShield繼續完成工作。 – 2012-03-10 21:06:51

+0

如果你只是想解決這個DLL的COM提取問題,並且你不介意給我發郵件,我可以通過一些技巧來運行它,我必須嘗試爲你解決這個問題。 – 2012-03-10 21:07:59

相關問題