Как инициализировать постоянный 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}");
}