类别ID(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 } };

我知道如果您使用 __uuidof operator与UUID关联的类型,Visual Studio可以自动生成一个。如果只有十六进制字符串,有没有办法做到这一点?

最佳答案

从字符串进行静态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附加到基于coclass的类型,然后如果additionally requested可能会生成其他CLSID_xxx标识符。

08-17 18:18