• C++-GUID from string


    C++-GUID from string

    July 7, 2020 9:26 PM

    参考 CLSIDFromString function

    #include <string>
    GUID Guid = { 0 };
    std::wstring strGuid = L"{2C1EB211-1435-4B4D-9144-29168CD22A4C}";
    CLSIDFromString((LPCOLESTR)strGuid.c_str(), (LPCLSID)& Guid);
    

    此外以下写法可以获取GUID,但运行结束后报错。

    GUID guid = {0};
    	sscanf_s(
    		"2C1EB211-1435-4B4D-9144-29168CD22A4C",
    		"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
    		&(guid.Data1),
    		&(guid.Data2),
    		&(guid.Data3),
    		&(guid.Data4[0]),
    		&(guid.Data4[1]),
    		&(guid.Data4[2]),
    		&(guid.Data4[3]),
    		&(guid.Data4[4]),
    		&(guid.Data4[5]),
    		&(guid.Data4[6]),
    		&(guid.Data4[7])
    	);
    运行报错:Run-Time Check Failure #2 - Stack around the variable 'guid' was corrupted.
    
    

    分析:
    因为使用的GUID结构体中Data4为unsigned char,通过sscanf_s操作时导致缓冲区不足或溢出

    typedef struct _GUID {
    unsigned long Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char Data4[ 8 ];
    } GUID;

    Data4为unsigned char,经测试,Data4改为unsigned int(UINT)不再报错。

    之后,仔细查看编译信息:

    warning C4477:  “sscanf_s”: 格式字符串“%04x”需要类型“unsigned int *”的参数,但可变参数 3 拥有了类型“unsigned short *”
    message :  请考虑在格式字符串中使用“%hx”
    
    warning C4477:  “sscanf_s”: 格式字符串“%02hx”需要类型“unsigned short *”的参数,但可变参数 4 拥有了类型“unsigned char *”
    message :  请考虑在格式字符串中使用“%hhx”
    
    warning C4477:  “sscanf_s”: 格式字符串“%02hx”需要类型“unsigned short *”的参数,但可变参数 11 拥有了类型“unsigned char *”
    message :  请考虑在格式字符串中使用“%hhx”
    

    测试中发现当改为以下写法时,编译运行未报错:
    "%08x-%04hx-%04hx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",

    此时,编译器警告中还存在以下警告:

    警告	C6328	大小不匹配: 已将“unsigned char”作为 _Param_(8) 传递,但需要使用“16 bit operand”来调用“sscanf_s”。这表示可能存在严重错误。若针对像 scanf 这样的函数报告此信息,可能表示发生缓冲区不足或溢出.
    
    
  • 相关阅读:
    Java SE (3) 之 事件监听
    Java SE (2)之 Graphics 画图工具
    Java SE (1)之 JFrame 组件 GridLayout布局
    解决IIS7中出现An error occurred on the server when processing the URL错误提示的方法
    VS2010中配置C#Project不生成.vhost.exe和.pdb文件的方法
    IIS7和IIS7.5备份和还原的方法
    C# 读取IE缓存文件(2)
    C# 读取IE缓存文件(1)
    raywenderlich的Swift编程风格指南
    Swift和C#的基本语法对比
  • 原文地址:https://www.cnblogs.com/yongchao/p/13263659.html
Copyright © 2020-2023  润新知