2015-04-30 9 views
11

Un ID di classe (GUID) viene generalmente specificato con una sequenza di numeri esadecimali separati da trattini, ad es. {557cf406-1a04-11d3-9a73-0000f81ef32e}. Questo non è un valore letterale che può essere utilizzato per inizializzare direttamente una struttura CLSID.Come inizializzare un CLSID costante

Ho scoperto due modi per inizializzare la struttura, ma sono entrambi piuttosto scomodi. Il primo non consente di dichiararlo const e deve essere eseguito in fase di esecuzione, mentre il secondo richiede una riformattazione estesa delle costanti esadecimali.

CLSID clsid1; 
CLSIDFromString(CComBSTR("{557cf406-1a04-11d3-9a73-0000f81ef32e}"), &clsid1); 

const CLSID clsid2 = { 0x557cf406, 0x1a04, 0x11d3, { 0x9a,0x73,0x00,0x00,0xf8,0x1e,0xf3,0x2e } }; 

so che Visual Studio può generare uno automaticamente se si dispone di un tipo che è associato con un UUID, utilizzando il __uuidof operator. C'è un modo per farlo se hai solo la stringa esadecimale?

+0

Ahem: http://stackoverflow.com/questions/5345803/does-gdi-have-standard-image-encoder-slids –

+1

È possibile utilizzare sempre una funzione factory che chiama 'CLSIDFromString' - qualcosa come' const CLSID clsid1 = GUIDFactoryFunc ("{557cf406-1a04-11d3-9a73-0000f81ef32e}") ' –

+1

@i_am_jorf perché pensi che stia facendo la domanda? Ho bisogno di usare la risposta di quella domanda in un nuovo programma, e il codice che ho scritto è un lavoro fa e non è più disponibile come riferimento. –

risposta

2

Utilizzare una funzione di supporto per creare il GUID.

#include <Windows.h> 
#include <atlbase.h> 

template<class S> 
CLSID CreateGUID(const S& hexString) 
{ 
    CLSID clsid; 
    CLSIDFromString(CComBSTR(hexString), &clsid); 

    return clsid; 
} 

int main() 
{ 
    const CLSID clsid1 = CreateGUID("{557cf406-1a04-11d3-9a73-0000f81ef32e}"); 
    const CLSID clsid2 = CreateGUID(L"{557cf406-1a04-11d3-9a73-0000f81ef32e}"); 
} 
7

statica CLSID inizializzazione da stringa (senza helper conversione runtime necessario):

class __declspec(uuid("{557cf406-1a04-11d3-9a73-0000f81ef32e}")) Foo; 
static const CLSID CLSID_Foo = __uuidof(Foo);  
// ... 
CComPtr<IUnknown> pUnknown; 
pUnknown.CoCreateInstance(CLSID_Foo); 

o uso semplicemente diretto di __uuidof (compilatore tratterà il valore GUID come costante e generare codice necessario minima):

class __declspec(uuid("{557cf406-1a04-11d3-9a73-0000f81ef32e}")) Foo; 
// ... 
CComPtr<IUnknown> pUnknown; 
pUnknown.CoCreateInstance(__uuidof(Foo)); 

non è niente di speciale: per esempio quando le librerie di tipi sono #import ndr, lo stesso incontrato hod viene utilizzato per allegare CLSID s ai tipi basati su coclasse e quindi potrebbero essere generati ulteriori identificatori CLSID_xxx se additionally requested.

+0

Uno buono. Potrebbe anche usare qualche macro per renderlo un one-liner. – Noseratio

+0

In realtà non è necessario definire 'CLSID_Foo' perché' __uuidof (Foo) 'può essere utilizzato direttamente (rendendolo già un one-liner). –

+0

Penso che l'OP voglia un 'const CLSID', quindi ho menzionato la macro. – Noseratio