我如何枚举COM对象成员,如接口,属性和方法?

时间:2009-07-11 00:38:09

标签: winapi com

我可以使用哪种WinAPI方法或接口以编程方式枚举COM对象的接口,属性,方法(和参数)?

4 个答案:

答案 0 :(得分:5)

你需要更加具体。有两种方法可以解释您的问题。

一个是你有一个COM 组件(例如某个库),并且你想要以编程方式枚举它的接口/属性/方法。通常(但不总是),COM组件带有一个类型库,其中包含有关所有这些的完整元信息 - 它嵌入到COM .exe或.dll中,或者是一个单独的.tlb文件。在任何情况下,如果COM组件在系统中正确注册(例如使用regsvr32),则COM提供标准API以检索以ITypeLibITypeInfo接口为中心的类型信息。

另一种解释是您获得对特定COM 对象的引用,并且您需要枚举其上的所有方法/属性和/或通过计算名称调用它们,如Java或C#反射,或Delphi RTTI。如果是这样,那么只有COM对象实现IDispatch接口才有可能,这允许您完成上述所有操作。

答案 1 :(得分:0)

嗯,COM对象是通过接口引用的,接口是设计上不透明的抽象。如果你对Delphi对象模型的低级细节有很好的了解并且该对象实际上是用Delphi编写的,那么只有在没有一些黑魔法的情况下才能获得底层对象。

关于您可以做的最好的事情是检查接口声明本身,它将为您提供其方法和属性中的所有可用信息。

答案 2 :(得分:0)

我假设您需要一个将成功QueryInterface的所有接口的列表。答案是COM没有内在的方法来做到这一点。有些接口本身提供了像IServiceProvider这样的功能。

答案 3 :(得分:0)

您可以从注册表中获取所需的所有内容,但是这需要一些时间,因为信息的排序方式不能在不首先分析大部分内容的情况下为您提供所需的信息。如果从Microsoft平台SDK(MSDN上提供)下载实用程序OLEVIEW32,则可以使用它来浏览计算机上注册的COM接口。

COM的基础知识通过注册表中注册的接口在HKEY CLASSES ROOT \ CLSID下工作。当你要求一个特定的com对象时,它会解析为其中一个guid,后者会查看此guid下的InprocServer32部分,以确定要加载的DLL / EXE以及要使用的线程模型。你可以使用这些信息来构建一个guid地图,它也解析为同一个DLL(这是为了获取类)

HKEY CLASSES ROOT \ Interface是指向系统中注册的所有接口的链接。再次,它的时间来进行查找,因为大部分信息只是指向另一个键或类型库的指针。然而,这里有用的是一个GUID列表 - > InterfaceName(每个guid的默认属性)。

在HKEY CLASSES ROOT \ TypeLib是指向系统中注册的所有类型库的链接。