__declspec(uuid("ComObjectGUID"))扩展为什么?

ezp*_*sso 5 c++ declspec

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

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

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

ild*_*arn 6

它不是一个宏,所以它不会"扩展"到任何东西.它只是装饰用在对象文件元数据给定的UUID,然后可将其与以后提取的类型__uuidof运算符.


Ste*_*eed 5

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

在一个普通的 h 文件中,你创建一个空的非专业模板:

template<typename TInterface> struct TInterfaceTraits {}
Run Code Online (Sandbox Code Playgroud)

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

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

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

ICalculator *pCalcFace;
pObject->QueryInterface(TInterfaceTraits<ICalculator>::guid(), (void**)pCalcFace);
Run Code Online (Sandbox Code Playgroud)

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

ICalculator *pCalcFace = QueryInterface<ICalculator>(pObject);
Run Code Online (Sandbox Code Playgroud)