2015-04-30 22 views
11

Identyfikator klasy (GUID) jest zwykle określany za pomocą ciągu liczb szesnastkowych rozdzielonych myślnikami, np. {557cf406-1a04-11d3-9a73-0000f81ef32e}. To nie jest literał, który może być użyty do bezpośredniego zainicjowania struktury CLSID.Sposób inicjowania stałej wartości CLSID

Odkryłem dwa sposoby inicjalizacji struktury, ale oba są dość niezręczne. Pierwsza nie pozwala na jej deklarację const i musi być wykonana w czasie wykonywania, podczas gdy druga wymaga obszernego formatowania stałych heksadecymalnych.

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

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

Wiem, że Visual Studio generuje jedną automatycznie jeśli masz typ, który jest skojarzony z UUID, używając __uuidof operator. Czy istnieje sposób, aby to zrobić, jeśli masz tylko ciąg szesnastkowy?

+0

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

+1

Zawsze możesz użyć funkcji fabrycznej, która nazywa 'CLSIDFromString' - coś w stylu' const CLSID clsid1 = GUIDFactoryFunc ("{557cf406-1a04-11d3-9a73-0000f81ef32e}") ' –

+1

@i_am_jorf dlaczego myślisz, że zadaję pytanie? Muszę użyć odpowiedzi z tego pytania w nowym programie, a kod, który wtedy napisałem, jest pracą sprzed lat i nie jest już dostępny w celach informacyjnych. –

Odpowiedz

2

Użyj funkcji pomocnika, aby utworzyć identyfikator 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

Static CLSID inicjalizacji z ciągiem (bez pomocnika konwersji Runtime potrzebne):

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

lub po prostu bezpośrednie wykorzystanie __uuidof (kompilator potraktuje wartość GUID jako stała i generują minimalną niezbędną kod):

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

nie jest to nic specjalnego, na przykład, gdy biblioteki są #import typu ED, tak samo spełnione hod jest używany do dołączania CLSID s do typów opartych na coclass, a następnie można wygenerować dodatkowe identyfikatory CLSID_xxx, jeśli additionally requested.

+0

Dobry. Może również użyć makra, aby uczynić go jednolinijkowym. – Noseratio

+0

Nie ma potrzeby definiowania 'CLSID_Foo', ponieważ' __uuidof (Foo) 'może być użyty bezpośrednio (dzięki czemu jest już jednolinijkowy). –

+0

Myślę, że OP chce "const CLSID", więc wspomniałem makro. – Noseratio

Powiązane problemy