呼叫 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 配置的記憶體,否則洩漏。提示:若需支援 Unicode 專案,建議改用 TCHAR、LPTSTR 並搭配 _T() 巨集,或直接使用 FormatMessageW 寬字元版本。