首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC 生成 GUID 並轉換為標準格式 CString 字符串

     編輯:關於VC++

標準實現代碼

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 成員類型格式佔位符說明
Data1DWORD%08X8 位十六進制,高位補 0
Data2WORD%04X4 位十六進制
Data3WORD%04X4 位十六進制
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}

前置條件

  1. 項目已包含 <objbase.h> 或 <combaseapi.h>
  2. 鏈接 ole32.lib(通常默認已鏈接)
  3. 線程已初始化 COM:CoInitialize(NULL) 或 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)

替代方案:使用 StringFromGUID2

LPOLESTR wszGuid = NULL;
if (SUCCEEDED(StringFromGUID2(guid, &wszGuid)))
{
    szGUID = wszGuid;  // 自動轉換為 CString (含大括號)
    CoTaskMemFree(wszGuid);
}

優點:系統級實現,格式絕對標準。缺點:需額外內存分配/釋放,稍慢。

常見坑

  • 格式字符串中 Data4 部分必須拆分為單字節,直接用 %02X 讀取 DWORD 會導致字節序錯誤
  • 大小寫:%X 輸出大寫,%x 輸出小寫,RFC 4122 建議大寫
  • 大括號 {} 是標準表示法一部分,勿省略
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved