2015-04-30 2 views
11

Идентификатор класса (GUID) обычно задается с помощью последовательности шестнадцатеричных чисел, разделенных штрихами, например. {557cf406-1a04-11d3-9a73-0000f81ef32e}. Это не литерал, который можно использовать для инициализации структуры CLSID напрямую.Как инициализировать константу CLSID

Я обнаружил два способа инициализации структуры, но они оба неловкие. Первое не позволяет объявить его const и должно выполняться во время выполнения, а второе требует обширного переформатирования шестнадцатеричных констант.

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

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

Я знаю, что Visual Studio может сгенерировать автоматически, если у вас есть тип, связанный с UUID, используя __uuidof operator. Есть ли способ сделать это, если у вас есть только шестнадцатеричная строка?

+0

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

+1

Вы всегда можете использовать заводскую функцию, которая вызывает 'CLSIDFromString' - что-то вроде' const CLSID clsid1 = GUIDFactoryFunc ("{557cf406-1a04-11d3-9a73-0000f81ef32e}") ' –

+1

@i_am_jorf Почему, по-вашему, я задаю вопрос? Мне нужно использовать ответ из этого вопроса в новой программе, а код, который я написал тогда, - это работа назад и больше недоступна для справки. –

ответ

2

Используйте вспомогательную функцию для создания 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

Статический CLSID инициализации из строки (не помощник преобразования во время выполнения не требуется):

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

или просто прямое использование __uuidof (компилятор будет рассматривать значение GUID как константа и генерировать минимальный необходимый код):

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

это не что-то особенное: например, когда библиотеки типов являются #import-е изд, то же встретились hod используется для присоединения CLSID s к типам на основе сокласса, а затем дополнительные CLSID_xxx идентификаторы могут быть сгенерированы, если additionally requested.

+0

Хороший. Также можно использовать макрос, чтобы сделать его однострочным. – Noseratio

+0

Нет необходимости на самом деле определять 'CLSID_Foo', потому что' __uuidof (Foo) 'может использоваться напрямую (делая его уже однострочным). –

+0

Я думаю, что OP хочет 'const CLSID', поэтому я упомянул макрос. – Noseratio

Смежные вопросы