2010-05-05 58 views
5

背景:從EXE檢索COM的ProgID不註冊它

我想提取從VB6應用程序的COM數據,所以我可以(根據Microsoft最佳實踐)正確地註冊它的應用程序。我使用的是WiX 3.0,並且heat.exe不會提取數據(已知問題),並且我無法訪問關聯的TLB文件。 VB6應用程序沒有啓用兼容性,因此它在每次構建時重新生成COM GUID(他們希望應用程序能夠與舊版本並排運行)。

我創建了一個C#應用程序,它將收集TypeLib,來自VB6應用程序的接口和CoClass信息,而無需註冊它,並創建一個供蠟燭使用的wxs文件。我的公司還有其他幾個較老的應用程序,我想讓它成爲更通用的解決方案。

的問題:

1.Is有沒有辦法從出項目或TLB文件,而無需註冊它的應用程序收集的「真實」的ProgID(程序員希望的一)?

2.是否有一種方法可以從DLL中找出預期的線程模型而無需註冊它? (我打算它可以處理所有的COM活動項目,不妨完成) 謝謝。

+0

與Visual Studio捆綁在一起的OLE-COM對象查看器可以做到這一點,所以它絕對有可能。很好的問題! + 1 – ParmesanCodice 2010-05-05 07:44:49

+1

這通常通過設置註冊表重定向和調用自注冊來完成。 COM組件沒有被註冊,我不知道這是否滿足「不註冊它」這個問題的一部分。我正在使用一個已調整版本的tallow:http://www.unicontsoft.com/upload/tallow/ – wqw 2010-05-05 20:57:36

+0

我的目的是查看是否已經不在調用註冊表。我會閱讀重定向謝謝。 – mangelo 2010-05-06 03:37:04

回答

1

是的,沒有。

據我所知,沒有通用的方法可以從類型庫或COM服務器中獲取ProgID。

DLL的入口點是DllRegisterServer,它應該向註冊表寫入註冊信息,對於EXE服務器,它們通常有一個具有相同含義的命令行參數。

類型庫恰巧包含組件中所有接口和coclasses的描述,但它們很少包含人類可讀的ProgID。

我可以看到並推薦的唯一清晰方法是覆蓋HKCR \ CLSID鍵以臨時指向某處,然後致電DllRegisterServer。由於註冊表項覆蓋是流程本地的,因此這僅適用於進程內(DLL)服務器。

有關覆蓋註冊表項的信息,請參閱http://msdn.microsoft.com/en-us/library/ms724901(v=VS.85).aspx

然後檢查臨時註冊表並查看所做的更改,例如, CLSID < - > ProgID映射,線程模型等

+0

我會看看這個。由於我現在專注於一個不同的項目,因此可能需要幾天到一週的時間。 – mangelo 2010-05-06 03:33:05

+0

我想知道如果我可能導致你誤入歧途......更接近'RegOverridePredefKey'只會覆蓋當前進程(原因很明顯),所以你不能用它來從可執行文件中收集註冊數據。我正在編輯我的答案以反映這一點。 – 2010-05-06 13:36:38