如何初始化常量 CLSID

2024-03-08

类 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 } };

我知道,如果您有一种与 UUID 关联的类型,Visual Studio 可以使用以下命令自动生成一个类型:__uuidof操作员 https://msdn.microsoft.com/en-us/library/zaah6a61.aspx。如果你只有十六进制字符串,有没有办法做到这一点?


Static 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 https://msdn.microsoft.com/en-us/library/8etzzkb6ed,用同样的方法附加CLSIDs 到基于 coclass 的类型,然后附加CLSID_xxx可能会生成标识符,如果额外要求 https://msdn.microsoft.com/en-us/library/xybakhaa.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何初始化常量 CLSID 的相关文章

随机推荐