我有一段使用Microsoft-specific extension到C ++的代码:
interface __declspec(uuid("F614FB00-6702-11d4-B0B7-0050BABFC904"))
ICalculator : public IUnknown
{
//...
};
这句话扩展到了什么?如何用ANSI C ++重写它?
答案 0 :(得分:6)
它不是一个宏,所以它不会“扩展”到任何东西。它只是在目标文件元数据中使用给定的UUID修饰类型,然后可以使用__uuidof运算符提取该类型。
答案 1 :(得分:4)
如果需要将guid静态“附加”到界面,也可以使用模板(特征)。考虑:
在常见的h文件中,您可以创建一个空的非专用模板:
template<typename TInterface> struct TInterfaceTraits {}
定义界面时,请为其编写模板专业化(或者您可以在任何其他地方编写它,包括在使用之前):
class ICalculator : public IUnknown
{
//...
};
template<> struct TInterfaceTraits<class ICalculator > {
static GUID guid() {
return IID_ICalculator ;
}
};
然后,为了得到它,你可以写下这样的东西:
ICalculator *pCalcFace;
pObject->QueryInterface(TInterfaceTraits<ICalculator>::guid(), (void**)pCalcFace);
因为你可以写(我留给你)一个QueryInterface的模板包装器,它将使用这些特性自动提供适当的guid,这将更容易使用,即
ICalculator *pCalcFace = QueryInterface<ICalculator>(pObject);