5

我有一段代码使用Microsoft 特定的 C++ 扩展:

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

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

4

2 回答 2

6

它不是一个宏,所以它不会“扩展”到任何东西。它只是在对象文件元数据中使用给定的 UUID 修饰类型,然后可以使用__uuidof运算符提取该类型。

于 2011-06-02T20:26:52.413 回答
5

如果您需要将 guid 静态“附加”到界面,您也可以使用模板(特征)。考虑:

在一个常见的 h 文件中,您创建一个空的非专业模板:

template<typename TInterface> struct TInterfaceTraits {}

在定义你的接口时,为它写一个模板特化(或者你可以在任何其他地方写它,包括在使用之前):

class ICalculator : public IUnknown
{ 
    //...
};
template<> struct TInterfaceTraits<class ICalculator > { 
    static GUID guid() { 
        return IID_ICalculator ; 
    } 
};

然后要获得它的 uuid,您可以编写如下内容:

ICalculator *pCalcFace;
pObject->QueryInterface(TInterfaceTraits<ICalculator>::guid(), (void**)pCalcFace);

当然,您可以为 QueryInterface 编写(我留给您)一个模板包装器,它将使用特征自动提供适当的 guid,这将更容易使用,即

ICalculator *pCalcFace = QueryInterface<ICalculator>(pObject);
于 2011-09-06T08:19:34.413 回答