即使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