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

Windows API 獲取 GetLastError 詳細錯誤訊息並顯示

     編輯:關於C++

錯誤處理最佳實踐:FormatMessage 完整範例

呼叫 Windows API 失敗時,透過 GetLastError() 取得錯誤碼,再用 FormatMessage() 轉為人類可讀字串。

void __fastcall TSerialPort::ProcessErrorMessage(char* ErrorText)
{
    char ErrorMsg[400];
    LPVOID lpMsgBuf;

    // 取得系統錯誤訊息
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |  // 由系統配置緩衝區
        FORMAT_MESSAGE_FROM_SYSTEM,       // 從系統訊息表取得
        NULL,                             // 忽略訊息來源
        GetLastError(),                   // 錯誤碼
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 系統預設語言
        (LPTSTR)&lpMsgBuf,                // 輸出緩衝區指標
        0,                                // 最小寬度
        NULL                              // 無插入參數
    );

    // 組合完整錯誤訊息
    sprintf(ErrorMsg, "\"%s\" 因以下錯誤而失敗: %s", ErrorText, (char*)lpMsgBuf);

    // 顯示錯誤對話框
    Application->MessageBox(ErrorMsg, "錯誤", MB_ICONSTOP);

    // 釋放系統配置的緩衝區
    LocalFree(lpMsgBuf);
}

關鍵參數說明

  • FORMAT_MESSAGE_ALLOCATE_BUFFER:讓系統自動配置足夠大小的緩衝區,避免手動估算大小。
  • FORMAT_MESSAGE_FROM_SYSTEM:指定從系統內建訊息表查找錯誤描述。
  • MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT):使用目前系統預設語言環境。
  • LocalFree(lpMsgBuf):必須釋放 FORMAT_MESSAGE_ALLOCATE_BUFFER 配置的記憶體,否則洩漏。

適用場景

  • 檔案/裝置 I/O 失敗
  • 註冊表操作錯誤
  • 網路通訊失敗
  • 執行緒/程序建立失敗
  • 所有可設定 LastError 的 Win32 API

提示:若需支援 Unicode 專案,建議改用 TCHAR、LPTSTR 並搭配 _T() 巨集,或直接使用 FormatMessageW 寬字元版本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved