2011-06-02 12 views
5

Tengo un pedazo de código que utiliza Microsoft-specific extension a la C++:¿A qué se amplía __declspec (uuid ("ComObjectGUID"))?

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

¿Qué esta frase ampliar a? ¿Cómo puedo reescribirlo con ANSI C++?

+0

@Mat: Más bien, es un '# define' para' struct'. – Xeo

+2

@Mat: Bueno, eso es '__interface' (observe los guiones bajos), también hay una' #define interface struct' en el encabezado IUnknown. – Xeo

+0

@ Xeo, llené como @Mat solo se retiró :) – ezpresso

Respuesta

6

No es un macro por lo que no se "expande" a nada. Simplemente decora el tipo con un UUID dado en los metadatos del archivo objeto, que luego se puede extraer más tarde con el operador __uuidof.

+0

¡Gracias! ¿El método static member + static como 'get_uuid()' simulará lo mismo? – ezpresso

+0

@ezpresso: Podría, sí, si tiene la capacidad de cambiar la definición de cada clase en cuestión (a diferencia de '__declspec (uuid)' que se puede usar de forma no intrusiva). – ildjarn

4

También puede usar plantillas (rasgos), si necesita "adjuntar" estáticamente un guid a la interfaz. Considere:

En una h-archivo común de crear una plantilla no especializada vacío:

template<typename TInterface> struct TInterfaceTraits {} 

Al definir la interfaz, escriba una especialización de plantilla para él (o puede escribir en cualquier otro lugar, incluyendo justo antes uso):

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

Luego de conseguir su UUID se puede escribir algo como:

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

De la causa se puede escribir (lo dejo a usted) un envoltorio plantilla a QueryInterface, que utilizará los rasgos de suministrar automáticamente GUID adecuado, y que será más fácil de usar, es decir

ICalculator *pCalcFace = QueryInterface<ICalculator>(pObject);