将GUID结构体转换为LPCSTR

5

我正在使用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));
1个回答

16

操作系统不能直接将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]);

谢谢Remy。在你的第二种方法中,你使用了sprintf函数,相比于第一种方法中的两个函数调用(StringFromGUID2和WideCharToMultiByte)。从表面上看,第二种方法似乎更紧凑,更简洁,这让我相信它可能更快,但我不确定。你有什么想法吗? - user2177565
我不确定,但我敢打赌第二个更慢,因为它不是专门的,sprintf必须解析输入字符串并决定如何处理其他参数,但另一个则是完全专为此目的而建。最快的方法是使用第二种方法中明显的逻辑构建一个新的专用函数,直接将GUID转换为ANSI。 - Motomotes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接