2011-06-02 25 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);