如果有指向由某个具体组件类对象实现的 COM 接口(interface)的指针,是否可以获得实现该接口(interface)的底层对象的 GUID (CLSID)?
更新 1
更一般地说,我有一个类似 SetFont(ICanvasFont* font)
的函数,并且我需要一种方法来确定实现 ICanvasFont
接口(interface)的底层对象是否属于某些类(例如 MCanvasFont
)。
最佳答案
IUnknown::QueryInterface
在此接口(interface)指针上获取以下之一:IPersist
、IPersistStream
、IPersistStreamInit
或其他 IPersist*
接口(interface)。如果您有幸获得一个,那么 GetClassID
方法将为您获取 CLSID
类标识符(替代选项是 IProvideClassInfo
和 IProvideClassInfo: :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/