2013-09-01 94 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