Как инициализировать постоянный CLSID

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

Ответ 1

Статическая 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 ed, тот же метод используется для присоединения CLSID к на основе классов, а затем дополнительные CLSID_xxx идентификаторы могут быть сгенерированы, если дополнительно запрошено.

Ответ 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}");
}