Windows API函數檢測到錯誤時,不返回錯誤碼,而是將錯誤碼存入調用線程的TLS槽位中。每個線程擁有獨立的錯誤碼空間,互不干擾。
ERROR_FILE_NOT_FOUND = 2)獲取調用線程最近一次API調用的錯誤碼。必須緊跟在失敗的API調用之後,任何中間調用都可能覆蓋它。
HANDLE h = CreateFile(...);
if (h == INVALID_HANDLE_VALUE) {
DWORD err = GetLastError(); // 立即獲取
// 處理錯誤...
}
將錯誤碼轉換為本地化描述文本:
LPSTR msgBuf = NULL;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPSTR)&msgBuf, 0, NULL
);
// 使用 msgBuf...
LocalFree(msgBuf);
C:\Program Files\Microsoft SDKs\Windows\vX.Y\Include\winerror.hBOOL WinApiCallWithCheck() {
if (!SomeWinApiFunction()) {
DWORD err = GetLastError();
// 1. 記錄錯誤碼 + 文本
LPSTR msg = NULL;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, err, 0, (LPSTR)&msg, 0, NULL);
LogError("SomeWinApiFunction failed: %lu - %s", err, msg);
LocalFree(msg);
// 2. 根據錯誤碼決策:重試、回滾、上報...
return FALSE;
}
return TRUE;
}
printf、malloc等會重置錯誤碼Windows錯誤處理核心是TLS存儲 + GetLastError獲取 + FormatMessage轉文本。牢記「失敗後立即獲取」,配合錯誤碼查閱工具,能快速定位API調用失敗原因。