博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FormatMessage函数的使用方法
阅读量:5908 次
发布时间:2019-06-19

本文共 3236 字,大约阅读时间需要 10 分钟。

使用FormatMessage时假设对一些參数不细致研究。那么就会出错误。首先说下这个函数
1 函数描写叙述
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);
<1>dwFlags
格式化选项。这个參数主要用来影响lpSource以及lpBuffer。须要注意的是FORMAT_MESSAGE_ALLOCATE_BUFFER,当指定它的时候。是系统为你分配内存。这个时候的lpBuffer參数须要做一些处理,假设传递的是LPSTR buf的话,则传递的參数应该是&buf(这里涉及到了函数栈的销毁问题,在《C++高质量编程中有过》解释)。假设没有指定FORMAT_MESSAGE_ALLOCATE_BUFFER的话,那么传递的就是一个字符数组。

<2>lpSource
消息定义的位置。依赖于dwFlags的设置,有两种情况
FORMAT_MESSAGE_FROM_HMODULE:
0x00000800 A handle to the module that contains the message table to search.
FORMAT_MESSAGE_FROM_STRING:
0x00000400 Pointer to a string that consists of unformatted message text. It will be scanned for inserts and formatted accordingly.
假设这两个都没有指定的话,那么lpSource參数就会被忽略
<3>dwMessageId 
错误ID。假设dwFlags中指定了FORMAT_MESSAGE_FROM_STRING,那么该值就会被忽略
<4>dwLanguageId 
语言ID,假设假设dwFlags中指定了FORMAT_MESSAGE_FROM_STRING,那么该值就会被忽略。

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)	//设置为本地默认语言MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US)	//设置为美语MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)	//简体中文
全部的语言宏定义都是在WinNT.h中能够看到。
<5>lpBuffer
输出的缓冲区,注意事项在dwFlags中说了,主要是根据FORMAT_MESSAGE_ALLOCATE_BUFFER来对应变化
<6>nSize
输出缓冲区的大小,假设没有指定FORMAT_MESSAGE_ALLOCATE_BUFFER,则是缓冲区自身的大小,假设指定了
FORMAT_MESSAGE_ALLOCATE_BUFFER,能够任意设置,设置为0也没事。
<7>Arguments

这个參数第一次是用的时候感觉是尤其复杂。这个參数跟dwFlags,lpSource都有关系。所以才是有点复杂。參数类型是va_list*,首先假设參数不是一个va_list*的指针,那么就得在dwFlags中使用FORMAT_MESSAGE_ARGUMENT_ARRAY ,而且传递一个DWORD_PTR类型的数组作为參数。

%n!string!的使用方法:

当中n是1-99的整数,假设不加后面的!string!的话就直接表示第一个,第二个參数。以此类推。
当加上!string!时,要注意中间的string是有一个*还是有两个*,在指定FORMAT_MESSAGE_ARGUMENT_ARRAY的时候。一个*则下一个元素是n+2,两个*的话就是n+3。在没有指定FORMAT_MESSAGE_ARGUMENT_ARRAY 的情况下,一个*就是n+1,两个星就是n+2.
比如:
LPWSTR pMessage = L"%1!*.*s! %4 %5!*s!";	DWORD_PTR pArgs[] = { (DWORD_PTR)4, (DWORD_PTR)1, (DWORD_PTR)L"Bill",           (DWORD_PTR)L"Bob", (DWORD_PTR)5, (DWORD_PTR)L"Bill" };                                   	const DWORD size = 100+1;    	WCHAR buffer[size];    if (!FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,                       pMessage,                        0,                       0,                       buffer,                        size,                        (va_list*)pArgs))    {        wprintf(L"Format message failed with 0x%x\n", GetLastError());        return;    }
这里面pArgs的4代表第一个插入元素的宽度,1代表精度(即Bill中的一个元素B)。6代表元素的宽度,每个字符串之间都是以空格为间隔。上面的程序执行得到的buffer就是“    B Bob  Bill”
7 再看两个样例区分下
<1>
LPSTR buf;	LONG x1 = RegCreateKey(HKEY_LOCAL_MACHINE,TEXT("sofware\\VC++MFC\\adminss"),&hKey);	FormatMessage(		FORMAT_MESSAGE_ALLOCATE_BUFFER |		FORMAT_MESSAGE_FROM_SYSTEM,		NULL ,		x1,		MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),		(LPTSTR)&buf,		3,		NULL);	LocalFree(buf);
注意这里buf以及參数dwFlags
<2>
TCHAR buf[100] = {0};	LONG x1 = RegCreateKey(HKEY_LOCAL_MACHINE,TEXT("sofware\\VC++MFC\\adminss"),&hKey);	FormatMessage(		FORMAT_MESSAGE_FROM_SYSTEM,		NULL ,		x1,		MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),		(LPTSTR)buf,		100,		NULL);
注意这里的buf以及參数dwFlags
8 VS提供的查看错误的工具
VS,工具-》错误查找,就能够打开错误对话框,然后在Key中输入值就能够查找错误ID相应的文字描写叙述了。这里的错误ID是能够是10进制,也能够是16进制,可是无论10进制还是16进制,仅仅要其相应的值相等那么错误描写叙述就一样。

转载地址:http://xnvpx.baihongyu.com/

你可能感兴趣的文章
cocos2d-x环境搭建(win7+cocos2d-x-3.0)
查看>>
[Hibernate] - Fetching strategies
查看>>
Oracle 监听配置详解(转载)
查看>>
MyEclipse 利用反向功能生成Java 实体类
查看>>
Flexslider - 响应式的 jQuery 内容滚动插件
查看>>
GPS获取Location 获取所在地点的经纬度
查看>>
Android开发-- 简单对话框
查看>>
数据库索引的作用和长处缺点
查看>>
SQL中declare申明变量
查看>>
Java 将自己定义的对象作为HashMap的key
查看>>
常用命令
查看>>
STL之容器适配器queue的实现框架
查看>>
DNS添加/修改/查询/删除A记录
查看>>
JVM 运行时数据区域
查看>>
JavaScript生成GUID的方法
查看>>
Oracle笔记 一、oracle的安装、sqlplus的使用
查看>>
sort命令
查看>>
历史上最伟大的 12 位程序员
查看>>
vector与ArrayList、hashmap与hashtable区别
查看>>
《BI那点儿事》数据流转换——百分比抽样、行抽样
查看>>