即使TypeLib是完全空的,是否可以找到通常在組件對象模型的(COM)TypeLib中註冊的所有接口(類,參數等)?如果是的話,你會怎麼做呢?我相信另一個術語是「匿名COM」。我相信這個COM存在可訪問的接口,因爲我有一個使用TypeLib中沒有列出的類的應用程序。如何在沒有typelib的情況下找到COM的接口?
回答
如果類型庫爲空,那麼您無法找到有關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接口,並從那裏開始工作。
我能想到的唯一推理就是這樣一種混淆和/或解決隱私/安全問題的形式,只允許服務器的生產者批准調用它。
它不能幫助你,但可以解釋爲什麼你看到一個沒有任何信息的類型庫,並同時看到其他客戶端使用這個庫。
在COM編程中不使用類型庫是相當普遍的。任何腳本語言都可以,它使用IDispatch在運行時發現受支持的方法和屬性。 IDispatch :: GetIDsOfNames()或IDispatch :: GetTypeInfo()獲取該球滾動。這被稱爲後期綁定。速度很慢,但在腳本語言中無關緊要。
另一種標準的方法是通過MIDL從.idl文件生成頭文件來描述接口和coclasses。例如,您會在Windows SDK包含目錄中找到其中的許多目錄,例如mshtml.h。但是這僅適用於非託管C/C++代碼。
在像C#這樣的託管語言中使用沒有類型庫的COM很困難但並非不可能。 VB.NET是更好的語言,它支持開箱即用的後期綁定。當4.0版本到來時,C#會變得更好,它有一個新的「動態」關鍵字。
- 1. 如何在沒有接口的情況下綁定COM事件
- 2. 如何在沒有窗口的情況下運行Phaser引擎?
- 3. 如何在沒有窗口句柄的情況下使用RegisterDeviceNotification?
- 4. Skype如何在沒有端口轉發的情況下工作?
- 5. 如何在沒有窗口的情況下繪製文本
- 6. 如何在沒有窗口的情況下使用tkinter filedialog
- 7. 如何在沒有管理員權限的情況下查找MS SQL端口?
- 8. 在沒有COM Interop的情況下創建.msg文件
- 9. 如何在沒有原型的情況下查找C函數?
- 10. 如何在沒有IDE的情況下查找聲明/定義?
- 11. 如何在沒有間隙的情況下查找序列號?
- 12. COM typelib疑問
- 13. C#如何在沒有實現的情況下單元測試接口方法
- 14. 如何在沒有相機接口的情況下訪問iPhone相機?
- 15. 如何在沒有相機接口的情況下訪問iPhone相機API?
- 16. FindBugs的非空沒有找到所有的情況下
- 17. 如何在沒有密碼的情況下連接ssh2 nodejs
- 18. 如何在沒有stackoverflow的情況下鏈接兩個節點?
- 19. 如何在沒有網絡連接的情況下安裝sbt
- 20. 如何在沒有選擇的情況下進行左連接
- 21. 如何在沒有localStream的情況下創建對等連接?
- 22. 如何在沒有鏈接的情況下回顯「<a>」?
- 23. 如何在沒有AJAX的情況下接收xml代碼
- 24. 如何在沒有map的情況下連接工作DispatchToProps
- 25. 如何在沒有連接的情況下獲得FB ID
- 26. 在沒有測試數據的情況下找到段錯誤
- 27. 在沒有writeln的情況下找不到構造函數
- 28. 如何在沒有管理員權限的情況下使用COM?
- 29. 如何在沒有安全警告的情況下從https://domain1.com重定向到https://domain2.com
- 30. 在沒有串口的情況下仿真串口
感謝您的快速回答,我將不得不做更多的挖掘。但是,我確信TypeLib是不完整的,因爲我有一個程序訪問COM中不在TypeLib中的類。 – rook
@The Rook:我已更新我的回答,以反映您可能會看到此行爲的原因。 – casperOne