2011-06-02 54 views
5

我有一段代码,使用Microsoft-specific extension到C++:__declspec(uuid(“ComObjectGUID”))扩展到了什么地方?

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

这句话是什么扩大到?我如何用ANSI C++重写它?

+0

@Mat:更像是,它是''struct'的'define'。 – Xeo 2011-06-02 20:33:10

+2

@Mat:那是'__interface'(注意下划线),IUnknown头文件中还有'#define interface struct'。 – Xeo 2011-06-02 20:41:05

+0

@Xeo,我填写像@Mat刚退休:) – ezpresso 2011-06-02 20:48:49

回答

6

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

+0

谢谢!将静态成员+静态方法像'get_uuid()'模拟相同的事情? – ezpresso 2011-06-02 20:41:59

+0

@ezpresso:它可以,是的,如果你有能力改变每个类的定义(不像'__declspec(uuid)'可以非侵入式使用)。 – ildjarn 2011-06-02 20:43:36

4

如果您需要静态“附加”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);