根據(jù)一個(gè)錯(cuò)誤碼返回一個(gè)錯(cuò)誤訊息
DWORD FormatMessage(
DWORD dwFlags,
LPCVOID lpSource,
DWORD dwMessageId,
DWORD dwLanguageId,
LPTSTR lpBuffer,
DWORD nSize,
va_list* Arguments
);
dwFlags:
# FORMAT_MESSAGE_ALLOCATE_BUFFER // 此函數(shù)會(huì)分配內(nèi)存以包含描述字串。
# FORMAT_MESSAGE_FROM_SYSTEM, // 在系統(tǒng)的id映射表中尋找描述字串
# FORMAT_MESSAGE_FROM_HMODULE // 在其他資源模塊中尋找描述字串
# FORMAT_MESSAGE_FROM_STRING // 消息ID是個(gè)字串,不是個(gè)DWORD
通常為:FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM
lpSource:
# 指定了FORMAT_MESSAGE_FROM_HMODULE的話,此參數(shù)表示模塊的HANDLE
# 指定了FORMAT_MESSAGE_FROM_STRING的話,此參數(shù)表示id字串
通常為:NULL
dwMessageId:
消息ID;如果指定FORMAT_MESSAGE_FROM_STRING,將被忽略。
dwLanguageId:
消息描述所用的語言
通常為:0表示自動(dòng)選擇
lpBuffer:
#如果未指定FORMAT_MESSAGE_ALLOCATE_BUFFER,則為自己提供的緩沖區(qū)
#否則為系統(tǒng)LocalAlloc分配,需要被用戶LocalFree
nSize:
#如果未指定FORMAT_MESSAGE_ALLOCATE_BUFFER,則為自己提供的緩沖區(qū)大小
#否則為系統(tǒng)LocalAlloc分配之最小緩沖區(qū)大小
Arguments:
通常不使用
下面是個(gè)例子:
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);
第一個(gè)參數(shù)是標(biāo)志,告訴這個(gè)FormatMessage函數(shù),我想要的特點(diǎn).
第三個(gè)參數(shù)是DWORD(unsigned long)類型
第五個(gè)參數(shù)是LPTSTR(這個(gè)類型即可用與ANSI,也克用與Unicode).用來接收與MessageID 對應(yīng)的Description.
注意:hLocal是HLOCAL類型也就是HANDLE類型,需要將他轉(zhuǎn)換到LPTSTR.
第六個(gè)參數(shù)是這個(gè)buffer的大小,由于設(shè)置了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得到的錯(cuò)誤信息(這個(gè)錯(cuò)誤信息是數(shù)字代號)轉(zhuǎn)化成字符串信息的函數(shù)
FormatMessage()
函數(shù)FormatMessage聲明如下:
WINBASEAPI
DWORD
WINAPI
FormatMessageA(
DWORD dwFlags,//錯(cuò)誤信息類型標(biāo)志
LPCVOID lpSource,//指定本地信息定義 其依賴于第一個(gè)參數(shù)的設(shè)置
DWORD dwMessageId,//指定被請求的消息標(biāo)示,如果dwFlags設(shè)置為FORMAT_MESSAGE_FROM_STRING 這個(gè)參數(shù)將被忽略
DWORD dwLanguageId,//指定被請求的消息的語言標(biāo)示
LPSTR lpBuffer,//用來保存格式話后的消息字符串的地址
DWORD nSize,//如果第一個(gè)參數(shù)為指定FORMAT_MESSAGE_ALLOCATE_BUFFER 這個(gè)參數(shù)就是字符串的最大長度
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
調(diào)用函數(shù)的例子如下:
#001 //系統(tǒng)錯(cuò)誤信息提示。
#002 //蔡軍生 2007/11/28 QQ:9073204 深圳
#003 void TestErrorInfo(void)
#004 {
#005 //進(jìn)行出錯(cuò)。
#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 出錯(cuò)信息 (出錯(cuò)碼=%d): %s"),
#023 _T("CreateDirectory"), dw, lpMsgBuf);
#024
#025 LocalFree(lpMsgBuf);
#026
#027 //輸出提示。
#028 OutputDebugString(szBuf);
#029 }
#030
#031 }
調(diào)用后輸出下面的提示信息:
CreateDirectory 出錯(cuò)信息 (出錯(cuò)碼=5): 拒絕訪問。