GUID guid;
CString szGUID;
if (S_OK == ::CoCreateGuid(&guid))
{
szGUID.Format(_T("{%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]);
}
else
{
// 錯誤處理:CoCreateGuid 失敗極罕見,通常因 COM 未初始化
AfxMessageBox(_T("GUID 生成失敗,請確認已調用 CoInitialize/CoInitializeEx"));
szGUID.Empty();
}
| GUID 成員 | 類型 | 格式佔位符 | 說明 |
|---|---|---|---|
| Data1 | DWORD | %08X | 8 位十六進制,高位補 0 |
| Data2 | WORD | %04X | 4 位十六進制 |
| Data3 | WORD | %04X | 4 位十六進制 |
| Data4[0..1] | BYTE[2] | %02X%02X | 兩字節,共 4 位十六進制 |
| Data4[2..7] | BYTE[6] | %02X%02X%02X%02X%02X%02X | 六字節,共 12 位十六進制 |
輸出示例:{12345678-ABCD-EF00-1234-56789ABCDEF0}
<objbase.h> 或 <combaseapi.h>ole32.lib(通常默認已鏈接)CoInitialize(NULL) 或 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)StringFromGUID2LPOLESTR wszGuid = NULL;
if (SUCCEEDED(StringFromGUID2(guid, &wszGuid)))
{
szGUID = wszGuid; // 自動轉換為 CString (含大括號)
CoTaskMemFree(wszGuid);
}
優點:系統級實現,格式絕對標準。缺點:需額外內存分配/釋放,稍慢。
%02X 讀取 DWORD 會導致字節序錯誤%X 輸出大寫,%x 輸出小寫,RFC 4122 建議大寫{} 是標準表示法一部分,勿省略