2013-09-01 61 views
4

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

我确实设法使用StringFromGUID2函数将GUID转换为OLECHAR(请参阅下面的代码片段),但坚持进一步转换为LPSCSTR。我不太确定我是否与OLECHAR一起朝着正确的方向前进,但目前看起来合情合理。

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

回答

10

操作系统不支持直接将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]); 
+0

由于雷米。在第二种方法中,您使用sprintf函数与第一种方法中的两个函数调用(StringFromGUID2和WideCharToMultiByte)进行比较。从表面上看,第二种方法似乎更加紧凑和简洁,这使我相信它可能会更快,但我不确定。对此有何想法? – user2177565

+4

如果速度是一个问题,请使用分析器。 –

+0

我不知道,但我敢打赌,第二个比较慢,因为它不是专用的,'sprintf'必须解析输入字符串并决定如何处理额外的参数,但另一个是专门构建的。 - 最快的方法是使用第二种方法中明显的逻辑构建一个新的目标构建函数,该函数将GUID直接转换为ANSI。 – Motes