首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何初始化常量CLSID

如何初始化常量CLSID
EN

Stack Overflow用户
提问于 2015-04-30 19:14:28
回答 2查看 7.6K关注 0票数 13

类ID (GUID)通常用十六进制数序列以破折号分隔,例如{557cf406-1a04-11d3-9a73-0000f81ef32e}。这不是可以直接用于初始化CLSID结构的文字。

我发现了两种初始化结构的方法,但它们都有点尴尬。第一个不允许声明为const,必须在运行时完成,而第二个则需要对十六进制常量进行广泛的重新格式化。

代码语言:javascript
复制
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可以使用运算符自动生成一个。如果你只有六角线的话,有什么办法可以做到吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-01 06:26:34

从字符串进行静态CLSID初始化(不需要运行时转换助手):

代码语言:javascript
复制
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值作为常量处理,并生成最小的必要代码):

代码语言:javascript
复制
class __declspec(uuid("{557cf406-1a04-11d3-9a73-0000f81ef32e}")) Foo;
// ...
CComPtr<IUnknown> pUnknown;
pUnknown.CoCreateInstance(__uuidof(Foo));

它没有什么特别之处:例如,当类型库被#import编辑时,使用相同的方法将CLSIDs附加到基于coclass的类型,如果额外请求,则可能会生成额外的CLSID_xxx标识符。

票数 10
EN

Stack Overflow用户

发布于 2015-04-30 19:42:07

使用助手函数创建GUID。

代码语言:javascript
复制
#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}");
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29975918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档