《解读Windows 核心编程》 之 FormatMessage()的用法

本文详细介绍了Windows API函数FormatMessage的功能及使用方法。该函数能够将错误代码转换为易读的错误信息字符串,支持多种来源和语言。文章还提供了一个具体的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FormatMessage是一个Windows API函数。它的功能就是将GetLastError函数得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数。


DWORD WINAPI FormatMessage (
                            DWORD dwFlags, // source and processing options
                            LPCVOID lpSource, // message source
                            DWORD dwMessageId, // message identifier
                            DWORD dwLanguageId, // language identifier
                            LPTSTR lpBuffer, // message buffer
                            DWORD nSize, // maximum size of message buffer
                            va_list *Arguments // array of message inserts
                            );

参数解释:

dwFlags
标志位,决定如何说明lpSource参数,dwFlags的低位制定如何处理换行功能在输出缓冲区,也决定最大宽度的格式化输出行。
可选参数:
标志 标志说明
FORMAT_MESSAGE_ALLOCATE_BUFFER
函数会分配一个足够大的缓冲区保存格式化消息,并且通过lpBuffer指向该
地址。
FORMAT_MESSAGE_ARGUMENT_ARRAY
Arguments参数不是指向va_list结构体,但是是一个指向保存参数的数据。
FORMAT_MESSAGE_FROM_HMODULE
lpSource参数是需要去搜索的一个包含消息表的模块线程。如果lpSource
是NULL,当前进程的应用图像会被搜索,这个标志不能同 FORMAT_ME
SSAGE_FROM_STRING使用。
FORMAT_MESSAGE_FROM_STRING
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
消息定义中的插入序列会被一直忽略和跳过直到输出缓冲区不改变,并且
Arguments会被忽略。
lpSource
根据dwFlags标志而定。
dwMessageId
请求的消息的标识符。当dwFlags标志为 FORMAT_MESSAGE_FROM_STRING时会被忽略。
dwLanguageId
请求的消息的语言标识符。
LPTSTR lpBuffer
接收错误信息描述的缓冲区指针。
nSize
如果 FORMAT_MESSAGE_ALLOCATE_BUFFER标志没有被指定,这个参数必须指定为输出缓冲区的大小,如果指定,这个参数指定为分配给输出缓冲区的最小数。 [1]
Arguments
保存格式化信息中的插入值的一个数组。

返回值:
如果函数调用成功,返回输出缓冲区的大小,除最后一个空字符。如果失败则返回0。

实例:
// 系统错误信息提示。
void TestErrorInfo(void)
{
	//进行出错。
	if (!CreateDirectory(_T("c:\\"),0))
	{
		TCHAR szBuf[128];
		LPVOID lpMsgBuf;
		DWORD dw = GetLastError();
		FormatMessage(
		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): 拒绝访问。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚坏叔叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值