根據一個錯誤碼返回一個錯誤訊息
DWORD FormatMessage(
DWORD dwFlags,
LPCVOID lpSource,
DWORD dwMessageId,
DWORD dwLanguageId,
LPTSTR lpBuffer,
DWORD nSize,
va_list* Arguments
);
dwFlags:
# FORMAT_MESSAGE_ALLOCATE_BUFFER // 此函數會分配內存以包含描述字串。
# FORMAT_MESSAGE_FROM_SYSTEM, // 在系統的id映射表中尋找描述字串
# FORMAT_MESSAGE_FROM_HMODULE // 在其他資源模塊中尋找描述字串
# FORMAT_MESSAGE_FROM_STRING // 消息ID是個字串,不是個DWORD
通常為:FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM
lpSource:
# 指定了FORMAT_MESSAGE_FROM_HMODULE的話,此參數表示模塊的HANDLE
# 指定了FORMAT_MESSAGE_FROM_STRING的話,此參數表示id字串
通常為:NULL
dwMessageId:
消息ID;如果指定FORMAT_MESSAGE_FROM_STRING,將被忽略。
dwLanguageId:
消息描述所用的語言
通常為:0表示自動選擇
lpBuffer:
#如果未指定FORMAT_MESSAGE_ALLOCATE_BUFFER,則為自己提供的緩沖區
#否則為系統LocalAlloc分配,需要被用戶LocalFree
nSize:
#如果未指定FORMAT_MESSAGE_ALLOCATE_BUFFER,則為自己提供的緩沖區大小
#否則為系統LocalAlloc分配之最小緩沖區大小
Arguments:
通常不使用
下面是個例子:
TCHAR* buffer;
DWORD error = ERROR_DS_OBJ_STRING_NAME_EXISTS;
::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
error,
0,
( LPTSTR )&buffer,
0,
NULL );
::MessageBox( NULL, buffer, NULL, 0 );
LocalFree( buffer );
=======================================================================================
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,lVal,NULL,(LPTSTR)&hLocal,0,NULL);
第一個參數是標志,告訴這個FormatMessage函數,我想要的特點.
第三個參數是DWORD(unsigned long)類型
第五個參數是LPTSTR(這個類型即可用與ANSI,也克用與Unicode).用來接收與MessageID 對應的Description.
注意:hLocal是HLOCAL類型也就是HANDLE類型,需要將他轉換到LPTSTR.
第六個參數是這個buffer的大小,由于設置了FORMAT_MESSAGE_ALLOCATE_BUFFER那么他就可以置0了
例如:
char szError[256];
DWORD dwError = GetLastError();
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
0,
0,
szError,
sizeof(szError),
NULL);
AfxMessageBox(szError);
=======================================================================================
FormatMessage功能就是將GetLastError得到的錯誤信息(這個錯誤信息是數字代號)轉化成字符串信息的函數
FormatMessage()
函數FormatMessage聲明如下:
WINBASEAPI
DWORD
WINAPI
FormatMessageA(
DWORD dwFlags,//錯誤信息類型標志
LPCVOID lpSource,//指定本地信息定義 其依賴于第一個參數的設置
DWORD dwMessageId,//指定被請求的消息標示,如果dwFlags設置為FORMAT_MESSAGE_FROM_STRING 這個參數將被忽略
DWORD dwLanguageId,//指定被請求的消息的語言標示
LPSTR lpBuffer,//用來保存格式話后的消息字符串的地址
DWORD nSize,//如果第一個參數為指定FORMAT_MESSAGE_ALLOCATE_BUFFER 這個參數就是字符串的最大長度
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): 拒絕訪問。