2010-03-02 76 views
7

即使TypeLib是完全空的,是否可以找到通常在組件對象模型的(COM)TypeLib中註冊的所有接口(類,參數等)?如果是的話,你會怎麼做呢?我相信另一個術語是「匿名COM」。我相信這個COM存在可訪問的接口,因爲我有一個使用TypeLib中沒有列出的類的應用程序。如何在沒有typelib的情況下找到COM的接口?

回答

8

如果類型庫爲空,那麼您無法找到有關COM庫中類型的信息。

您需要至少類型庫中的coclass條目以查找IUnknown的實現。

如果您有這個問題,那麼您實際上可以創建該類的實例,然後針對IDispatch實現(如果存在)在IUnknown上調用QueryInterface

如果存在IDispatch接口,則可以調用GetTypeInfo來獲取有關所實現接口的信息。

如果您需要向IDispatch發出遲到的呼叫,那麼您需要致電Invoke method

請注意,您提到了類型庫,但是它是進程內COM服務器將類型庫嵌入到dll中的常見做法,該類型庫是庫中表示類型的實現。你確定你還沒有檢查過嗎?或者你確定你有類型庫,它確實是空白的?

如果lib類型確實是空白的,並且dll不包含它,那麼類型lib完全可能是「私有」的,因爲其他客戶端是針對它編譯的。 COM在運行時不一定需要type-lib。暴露IClassFactory interface實現的模式是導出帶有衆所周知簽名的標準DLL函數。

可以很容易地調用LoadLibrary,然後調用GetProcAddress並將結果轉換爲IClassFactory。從那裏,他們將使用他們知道的私有GUID和IID(不是來自類型庫)以及它們私下定義的COM接口,並從那裏開始工作。

我能想到的唯一推理就是這樣一種混淆和/或解決隱私/安全問題的形式,只允許服務器的生產者批准調用它。

它不能幫助你,但可以解釋爲什麼你看到一個沒有任何信息的類型庫,並同時看到其他客戶端使用這個庫。

+0

感謝您的快速回答,我將不得不做更多的挖掘。但是,我確信TypeLib是不完整的,因爲我有一個程序訪問COM中不在TypeLib中的類。 – rook

+0

@The Rook:我已更新我的回答,以反映您可能會看到此行爲的原因。 – casperOne

5

在COM編程中不使用類型庫是相當普遍的。任何腳本語言都可以,它使用IDispatch在運行時發現受支持的方法和屬性。 IDispatch :: GetIDsOfNames()或IDispatch :: GetTypeInfo()獲取該球滾動。這被稱爲後期綁定。速度很慢,但在腳本語言中無關緊要。

另一種標準的方法是通過MIDL從.idl文件生成頭文件來描述接口和coclasses。例如,您會在Windows SDK包含目錄中找到其中的許多目錄,例如mshtml.h。但是這僅適用於非託管C/C++代碼。

在像C#這樣的託管語言中使用沒有類型庫的COM很困難但並非不可能。 VB.NET是更好的語言,它支持開箱即用的後期綁定。當4.0版本到來時,C#會變得更好,它有一個新的「動態」關鍵字。

相關問題