如何枚举 COM 对象成员,如接口、属性和方法?
Posted
技术标签:
【中文标题】如何枚举 COM 对象成员,如接口、属性和方法?【英文标题】:How I can enumerate the COM Object Members like interfaces, properties and methods? 【发布时间】:2010-11-09 21:37:12 【问题描述】:我可以使用哪种 WinAPI 方法或接口以编程方式枚举 COM 对象的接口、属性、方法(和参数)?
【问题讨论】:
【参考方案1】:您需要更具体。有两种方法可以解释您的问题。
一个是您有一个 COM 组件(例如某个库),并且您希望以编程方式枚举其接口/属性/方法。通常(但并非总是),COM 组件带有一个类型库,其中包含有关所有这些的完整元信息 - 它或者嵌入到 COM .exe 或 .dll 中,或者是一个单独的 .tlb 文件。在任何情况下,如果 COM 组件在系统中正确注册(例如,使用 regsvr32),那么 COM 提供标准 API 来检索该类型信息,以 ITypeLib 和 ITypeInfo 接口为中心。
另一种解释是,您获得了对特定 COM 对象的引用,并且您需要枚举其上的所有方法/属性和/或通过计算名称调用它们,例如 Java 或 C# 反射,或德尔福RTTI。如果是这样,那么只有当 COM 对象实现 IDispatch 接口时才有可能,它允许您执行上述所有操作。
【讨论】:
【参考方案2】:嗯,COM 对象是通过接口引用的,这些接口在设计上是不透明的抽象。如果没有一些黑魔法,您就无法获得底层对象,只有当您非常了解 Delphi 对象模型的低级细节并且该对象实际上是用 Delphi 编写时,这些魔法才会起作用。
您能做的最好的事情就是检查接口声明本身,这将为您提供其方法和属性中的所有可用信息。
【讨论】:
【参考方案3】:我假设您想要一个能够成功查询接口的所有接口的列表。答案是 COM 中没有内在的方法可以做到这一点。一些接口本身就提供这种功能,例如 IServiceProvider。
【讨论】:
【参考方案4】:您可以从注册表中获取您想要的所有信息,但这需要一些时间,因为信息的排序方式无法在没有首先分析大部分信息的情况下为您提供所需的信息。如果您从 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 是指向系统中注册的所有类型库的链接。
【讨论】:
以上是关于如何枚举 COM 对象成员,如接口、属性和方法?的主要内容,如果未能解决你的问题,请参考以下文章