Mar*_*som 12 c++ com uuid visual-studio
类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 } };
Run Code Online (Sandbox Code Playgroud)
我知道如果你有一个与UUID相关联的类型,Visual Studio可以使用__uuidof运算符自动生成一个.如果你只有十六进制字符串,有没有办法做到这一点?
CLSID从字符串静态初始化(不需要运行时转换助手):
class __declspec(uuid("{557cf406-1a04-11d3-9a73-0000f81ef32e}")) Foo;
static const CLSID CLSID_Foo = __uuidof(Foo);
// ...
CComPtr<IUnknown> pUnknown;
pUnknown.CoCreateInstance(CLSID_Foo);
Run Code Online (Sandbox Code Playgroud)
或者直接使用__uuidof(编译器会将GUID值视为常量并生成最少的必要代码):
class __declspec(uuid("{557cf406-1a04-11d3-9a73-0000f81ef32e}")) Foo;
// ...
CComPtr<IUnknown> pUnknown;
pUnknown.CoCreateInstance(__uuidof(Foo));
Run Code Online (Sandbox Code Playgroud)
它没有什么特别之处:例如,当#import编辑类型库时,使用相同的方法将CLSIDs 附加到基于coclass的类型,然后CLSID_xxx如果另外请求则可能生成其他标识符.