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

roo*_*ook 7 com reflection activex typelib

是否可以找到通常使用组件对象模型(COM)TypeLib注册的所有接口(类,参数等),即使TypeLib是完全空的?如果是这样你会怎么做呢?我认为另一个术语是"匿名COM".我确信这个COM存在可访问的接口,因为我有一个使用TypeLib中未列出的类的应用程序.

cas*_*One 8

如果类型库为空,则无法在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接口.

我能想到这样的事情的唯一原因是混淆和/或解决隐私/安全问题,只允许服务器的生产者批准的客户调用它.

它对您没有帮助,但可以解释为什么您看到一个没有信息的类型库,同时看到其他客户端使用该库.


Han*_*ant 5

在COM编程中不使用类型库是相当常见的.任何脚本语言都可以,它使用IDispatch在运行时发现支持的方法和属性.IDispatch :: GetIDsOfNames()或IDispatch :: GetTypeInfo()得到了滚动.这称为后期绑定.它很慢,但在脚本语言中无关紧要.

另一种标准方法是通过MIDL从.idl文件生成的头文件来描述接口和coclass.您可以在Windows SDK包含目录中找到其中许多目录,例如mshtml.h.但这仅适用于非托管C/C++代码.

在C#等托管语言中使用没有类型库的COM很困难,但并非不可能.VB.NET是更好的语言,它支持开箱即用的后期绑定.当4.0版本到货时,C#会变得更好,它有一个新的"动态"关键字.