FormatMessage功能就是将GetLastError得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数
FormatMessage()
函数FormatMessage声明如下:
DWORD WINAPI FormatMessage(
__in DWORD dwFlags,
__in_opt LPCVOID lpSource,
__in DWORD dwMessageId,
__in DWORD dwLanguageId,
__out LPTSTR lpBuffer,
__in DWORD nSize,
__in_opt va_list *Arguments
);
参数说明:
dwFlags:
标志位,决定如何说明lpSource参数,dwFlags的低位制定如何处理换行功能在输出缓冲区,也决定最大宽度的格式化输出行。
可选参数:
标志
|
标志说明
|
FORMAT_MESSAGE_ALLOCATE_BUFFER
0x00000100
|
函数会分配一个足够大的缓冲区保存格式化消息,并且通过lpBuffer指向该
地址。
|
FORMAT_MESSAGE_ARGUMENT_ARRAY
0x00002000
|
Arguments参数不是指向va_list结构体,但是是一个指向保存参数的数据。
|
FORMAT_MESSAGE_FROM_HMODULE
0x00000800
|
lpSource参数是需要去搜索的一个包含消息表的模块线程。如果lpSource
是NULL,当前进程的应用图像会被搜索,这个标志不能同
FORMAT_ME
SSAGE_FROM_STRING使用。
|
FORMAT_MESSAGE_FROM_STRING
0x00000400
|
lpSource参数是一个指向以NULL结尾的字符串,字符串包含一个消息定义,
这个消息定义可以包含插入序列。此标志最好不要和
FORMAT_MESSAGE_F
ROM_HMODULE或者
FORMAT_MESSAGE_FROM_SYSTEM使用
|
FORMAT_MESSAGE_FROM_SYSTEM
0x00001000
|
函数会为了请求的信息而搜索系统的消息表资源。如果标志同时也指定了
FORMAT_MESSAGE_FROM_HMODULE,那么函数会先在lpSource指定
的模块中搜索请求的消息,如果搜索不到,就去搜索系统消息表资源。此
标志不能与
FORMAT_MESSAGE_FROM_STRING使用。
|
FORMAT_MESSAGE_IGNORE_INSERTS
0x00000200
|
消息定义中的插入序列会被一直忽略和跳过直到输出缓冲区不改变,并且
Arguments会被忽略。
|
lpSource:
根据dwFlags标志而定。
dwMessageId:
请求的消息的标识符。当dwFlags标志为
FORMAT_MESSAGE_FROM_STRING时会被忽略。
dwLanguageId:
请求的消息的语言标识符。
nSize:
如果
FORMAT_MESSAGE_ALLOCATE_BUFFER标志没有被指定,这个参数必须指定为输出缓冲区的大小,
如果指定,这个参数指定为分配给输出缓冲区的最小数。
Arguments:
保存格式化信息中的插入值的一个数组。
返回值:
如果函数调用成功,返回输出缓冲区的大小,除最后一个空字符。如果失败侧返回0。
编辑本段举列
// 系统错误信息提示。
// (蔡军生原编)周强 改进。周强:QQ 7607 36077
void TestErrorInfo(void)
{
//进行出错。
if (!CreateDirectory(_T("c:\\"),0))
{
TCHAR szBuf[128];
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
wsprintf(szBuf,
_T("%s 出错信息 (出错码=%d): %s"),
_T("CreateDirectory"), dw, lpMsgBuf);
LocalFree(lpMsgBuf);
//输出提示。
OutputDebugString(szBuf);
}
}
调用后输出下面的提示信息:
CreateDirectory 出错信息 (出错码=5): 拒绝访问。