【问题标题】:Convert GUID structure to LPCSTR将 GUID 结构转换为 LPCSTR
【发布时间】:2013-09-04 12:07:48
【问题描述】:

我正在使用 C 语言中的 Win32 API,并且需要将 GUID 结构转换为 LPCSTR。我对 Win32 比较陌生,没有找到关于这种类型转换的太多信息。

我确实设法使用 StringFromGUID2 函数将 GUID 转换为 OLECHAR(请参见下面的代码片段),但坚持进一步转换为 LPSCSTR。我不太确定我是否正在使用 OLECHAR 朝着正确的方向前进,但目前这似乎是合乎逻辑的事情。

GUID guid;
OLECHAR wszGuid[40] = {0};
OLECHAR szGuid[40]={0};
LPCSTR lpcGuid;
CoCreateGuid(&guid);
StringFromGUID2(&guid, wszGuid, _countof(wszGuid));

【问题讨论】:

    标签: c windows api winapi


    【解决方案1】:

    操作系统不支持直接将 GUID 格式化为 Ansi 字符串。您可以先将其格式化为 Unicode 字符串,然后再将其转换为 Ansi:

    GUID guid = {0};
    wchar_t szGuidW[40] = {0};
    char szGuidA[40] = {0};
    CoCreateGuid(&guid);
    StringFromGUID2(&guid, szGuidW, 40);
    WideCharToMultiByte(CP_ACP, 0, szGuidW, -1, szGuidA, 40, NULL, NULL);
    

    或者您可以使用sprintf() 或类似函数手动格式化 Ansi 字符串:

    GUID guid = {0};
    char szGuid[40]={0};
    CoCreateGuid(&guid);
    sprintf(szGuid, "{%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]);
    

    【讨论】:

    • 谢谢雷米。在您的第二种方法中,您使用 sprintf 函数与第一种方法中的两个函数调用(StringFromGUID2 和 WideCharToMultiByte)进行比较。从表面上看,第二种方法似乎更紧凑和简洁,这让我相信它也可能更快,但我不确定。对此有什么想法吗?
    • 我不知道,但我敢打赌第二个会慢一些,因为它不是专门的,sprintf 必须解析输入字符串并决定如何处理附加参数,但另一个正是专门建造的。 -- 最快的方法是使用第二种方法中明显的逻辑构建一个新的专用函数,直接将 GUID 转换为 ANSI。
    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 2011-07-23
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多