2010-03-02 47 views
7

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

回答

8

如果类型库为空,那么您无法找到有关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接口,并从那里开始工作。

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

它不能帮助你,但可以解释为什么你看到一个没有任何信息的类型库,并同时看到其他客户端使用这个库。

+0

感谢您的快速回答,我将不得不做更多的挖掘。但是,我确信TypeLib是不完整的,因为我有一个程序访问COM中不在TypeLib中的类。 – rook

+0

@The Rook:我已更新我的回答,以反映您可能会看到此行为的原因。 – casperOne

5

在COM编程中不使用类型库是相当普遍的。任何脚本语言都可以,它使用IDispatch在运行时发现受支持的方法和属性。 IDispatch :: GetIDsOfNames()或IDispatch :: GetTypeInfo()获取该球滚动。这被称为后期绑定。速度很慢,但在脚本语言中无关紧要。

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

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

相关问题