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

时间:2010-03-02 18:03:54

标签: reflection com activex typelib

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

2 个答案:

答案 0 :(得分:8)

如果类型库为空,则无法在COM库中找到有关类型的信息。

您需要至少类型库中的coclass条目才能找到IUnknown的实现。

如果你有,那么你实际上可以创建该类的实例,然后在IUnknown上为QueryInterface实现调用IDispatch(如果存在)。

如果存在IDispatch接口,则可以调用GetTypeInfo以获取有关所实现接口的信息。

如果您需要对IDispatch进行后期绑定调用,则需要调用Invoke method

注意,您提到了类型库,但是进程内COM服务器通常会将类型库嵌入到dll中,该库是库中表示的类型的实现。你确定你还没有检查过吗?或者你确定你有类型库,它确实是空白的吗?

如果类型lib确实是空白且dll不包含它,那么类型lib完全可能是“私有”的,因为其他客户端是针对它编译的。 COM在运行时不一定需要类型lib。公开IClassFactory interface实现的模式是使用众所周知的签名导出标准DLL函数。

可以轻松调用LoadLibrary,然后调用GetProcAddress并将结果转换为IClassFactory。从那里,他们将使用他们知道的私有GUID和IID(不是来自类型库)以及他们私下定义并在那里工作的COM接口。

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

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

答案 1 :(得分:5)

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

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

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