__declspec(uuid(“ComObjectGUID”))扩展为什么?

时间:2011-06-02 20:23:53

标签: c++ declspec

我有一段使用Microsoft-specific extension到C ++的代码:

interface __declspec(uuid("F614FB00-6702-11d4-B0B7-0050BABFC904"))
ICalculator : public IUnknown
{ 
    //...
};

这句话扩展到了什么?如何用ANSI C ++重写它?

2 个答案:

答案 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);