拥有指向由某些具体组件类对象实现的 COM 接口的指针,是否可以获得实现该接口 (CLSID) 的底层对象的 GUID?
更新 1
更一般地说,我有一个类似的函数SetFont(ICanvasFont* font)
,我需要一种方法来确定实现ICanvasFont
接口的底层对象是否属于某个类(例如MCanvasFont
)。
IUnknown::QueryInterface
在此接口指针上获取以下之一:IPersist
、IPersistStream
或IPersistStreamInit
其他IPersist*
接口。如果您幸运地得到一个,那么GetClassID
方法将为您提供CLSID
类标识符(替代选项是IProvideClassInfo
and IProvideClassInfo::GetClassInfo
)。
请注意,此类信息不必存在。接口指针可以在没有CLSID
实现它的类上有效。
UPD。如果主要目标是在提供的接口上识别您自己的实现(“提供ICanvasFont
的是我自己的MCanvasFont
类的实例,还是不同的东西?”),那么最简单但有效的方法是在提供的接口上实现一些额外的私有接口班级。如果您的查询成功,那么您可以识别该实例。如果不进行封送处理,您甚至可以static_cast
返回到原始 C++ 指针。