具有由某个具体组件类对象实现的COM接口的指针,是否可以获取实现此接口的基础对象的GUID(CLSID)?
更一般地说,我有一个像SetFont(ICanvasFont* font)
这样的函数,我需要一种方法来确定实现ICanvasFont
接口的底层对象是否属于某个类(比如MCanvasFont
)。
答案 0 :(得分:4)
IUnknown::QueryInterface
在此接口指针上获取以下内容之一:IPersist
,IPersistStream
,IPersistStreamInit
或其他IPersist*
接口。如果您很幸运得到一个,那么GetClassID
方法将为您提供CLSID
类标识符(备用选项为IProvideClassInfo
和IProvideClassInfo::GetClassInfo
)。
请注意,此类信息不一定存在。接口指针可以在实现它的类上没有CLSID
的情况下有效。
UPD。如果主要目标是在提供的接口上识别您自己的实现(“提供的ICanvasFont
是我自己的MCanvasFont
类的实例,还是它有所不同?”),那么最简单但最有效的方法是在类上实现一些额外的私有接口。如果您查询它成功,那么您可以识别该实例。如果没有发生编组,你甚至可以static_cast
回到原始的C ++指针。