c++ - COM:使用指向它实现的接口(interface)的指针获取 coclass 对象的 GUID

标签 c++ com

如果有指向由某个具体组件类对象实现的 COM 接口(interface)的指针,是否可以获得实现该接口(interface)的底层对象的 GUID (CLSID)?

更新 1

更一般地说,我有一个类似 SetFont(ICanvasFont* font) 的函数,并且我需要一种方法来确定实现 ICanvasFont 接口(interface)的底层对象是否属于某些类(例如 MCanvasFont)。

最佳答案

IUnknown::QueryInterface 在此接口(interface)指针上获取以下之一:IPersistIPersistStreamIPersistStreamInit 或其他 IPersist* 接口(interface)。如果您有幸获得一个,那么 GetClassID 方法将为您获取 CLSID 类标识符(替代选项是 IProvideClassInfoIProvideClassInfo: :GetClassInfo).

请注意,此类信息不一定存在。接口(interface)指针即使在实现它的类上没有 CLSID 也可以是有效的。

UPD。如果主要目标是识别您自己在提供的接口(interface)上的实现(“提供的 ICanvasFont 是我自己的 MCanvasFont 类的实例,还是有所不同?”) ,那么最简单而有效的方法是在类上实现一些额外的私有(private)接口(interface)。如果您的查询成功,那么您就识别了该实例。如果不进行编码(marshal)处理,您甚至可以 static_cast 返回原始 C++ 指针。

关于c++ - COM:使用指向它实现的接口(interface)的指针获取 coclass 对象的 GUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10800595/

相关文章:

c++ - COM 客户端连接 COM 服务器(进程外场景)所需的文件是什么?

c++ - 指针概念

c++ - Qt 中 _variant_t 的等价物

delphi - Delphi有 "getopt"的实现吗?

c++ - 比较当前前景窗口句柄

javascript - 从BHO中的静态方法调用网页上的javascript

java - JACOB 库的有效 COM 结构是什么?

c++ - 如何从自定义数据流编写 CoreGraphics CGImageRef?

c++ - 在 boost::msm 中的子 SM 之间跳转

java - 最好使用哪种无限循环