如何初始化常量 CLSID
How to initialize a constant CLSID
A class 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
operator 自动生成一个。如果你只有十六进制字符串,有没有办法做到这一点?
使用辅助函数创建 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}");
}
从字符串静态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, the same method is used to attach CLSID
s to coclass based types, and then additional CLSID_xxx
identifiers might be generated if additionally requested.
A class 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
operator 自动生成一个。如果你只有十六进制字符串,有没有办法做到这一点?
使用辅助函数创建 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}");
}
从字符串静态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, the same method is used to attach CLSID
s to coclass based types, and then additional CLSID_xxx
identifiers might be generated if additionally requested.