在開發軟體的過程裡,經常要做的工作就是偵錯工具,許多問題的出現,不但是邏輯的問題,還有可能是對API的不熟悉,或者某種條件下調用API會出錯的。那麼這些出錯的原因是什麼呢?通常只擷取到錯誤碼,也就是通過函數GetLastError得到。當然可以根據這個錯誤碼去尋找MSDN就可以知道出錯的原因,但有時在客戶那裡並沒有MSDN,那麼就需要把調用API函數出錯的資訊顯示出來,或者寫到LOG裡去。這時就需要調用函數FormatMessage把出錯碼詳細原因顯示出來。
函數FormatMessage聲明如下:
WINBASEAPI
DWORD
WINAPI
FormatMessageA(
DWORD dwFlags,
LPCVOID lpSource,
DWORD dwMessageId,
DWORD dwLanguageId,
LPSTR lpBuffer,
DWORD nSize,
va_list *Arguments
);
WINBASEAPI
DWORD
WINAPI
FormatMessageW(
DWORD dwFlags,
LPCVOID lpSource,
DWORD dwMessageId,
DWORD dwLanguageId,
LPWSTR lpBuffer,
DWORD nSize,
va_list *Arguments
);
#ifdef UNICODE
#define FormatMessage FormatMessageW
#else
#define FormatMessage FormatMessageA
#endif // !UNICODE
調用函數的例子如下:
#001 //系統錯誤資訊提示。
#002 //蔡軍生 2007/11/28 QQ:9073204 深圳
#003 void TestErrorInfo(void)
#004 {
#005 //進行出錯。
#006 if (!CreateDirectory(_T("c:\\"),0))
#007 {
#008 TCHAR szBuf[128];
#009 LPVOID lpMsgBuf;
#010 DWORD dw = GetLastError();
#011
#012 FormatMessage(
#013 FORMAT_MESSAGE_ALLOCATE_BUFFER |
#014 FORMAT_MESSAGE_FROM_SYSTEM,
#015 NULL,
#016 dw,
#017 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
#018 (LPTSTR) &lpMsgBuf,
#019 0, NULL );
#020
#021 wsprintf(szBuf,
#022 _T("%s 出錯資訊 (出錯碼=%d): %s"),
#023 _T("CreateDirectory"), dw, lpMsgBuf);
#024
#025 LocalFree(lpMsgBuf);
#026
#027 //輸出提示。
#028 OutputDebugString(szBuf);
#029 }
#030
#031 }
調用後輸出下面的提示資訊:
CreateDirectory 出錯資訊 (出錯碼=5): 拒絕訪問。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/caimouse/archive/2007/11/30/1909968.aspx