簡體   English   中英

如何找到沒有typelib的COM接口?

[英]How do you find a COM's interfaces without typelib?

是否可以找到通常使用組件對象模型(COM)TypeLib注冊的所有接口(類,參數等),即使TypeLib是完全空的? 如果是這樣你會怎么做呢? 我認為另一個術語是“匿名COM”。 我確信這個COM存在可訪問的接口,因為我有一個使用TypeLib中未列出的類的應用程序。

如果類型庫為空,則無法在COM庫中找到有關類型的信息。

在typelib 中至少需要一個coclass條目來查找IUnknown的實現。

如果你有,那么你可以實際創建該類的實例,然后在IUnknown上為IDispatch實現調用QueryInterface (如果存在)。

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

如果需要對IDispatch進行后期綁定調用,則需要調用Invoke方法

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

如果類型lib確實是空白且dll不包含它,那么類型lib完全有可能是“私有”,因為其他客戶端是針對它編譯的。 COM在運行時不一定需要類型lib。 公開IClassFactory接口實現的模式是使用眾所周知的簽名導出標准DLL函數。

可以輕松調用LoadLibrary ,然后調用GetProcAddress並將結果轉換為IClassFactory。 從那里,他們將使用他們知道的私有GUID和IID(不是來自類型庫)以及他們私下定義並在那里工作的COM接口。

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

它對您沒有幫助,但可以解釋為什么您看到一個沒有信息的類型庫,同時看到其他客戶端使用該庫。

在COM編程中不使用類型庫是相當常見的。 任何腳本語言都可以,它使用IDispatch在運行時發現支持的方法和屬性。 IDispatch :: GetIDsOfNames()或IDispatch :: GetTypeInfo()得到了滾動。 這稱為后期綁定。 它很慢,但在腳本語言中無關緊要。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM