FormatMessage函数的使用方法
使用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进制,仅仅要其相应的值相等那么错误描写叙述就一样。
FormatMessage函数的使用方法的更多相关文章
- (MTT)连续能量函数最小化方法
(MTT)连续能量函数最小化方法 Multitarget tracking Multi-object tracking 连续能量函数 读"A.Milan,S. Roth, K. Schind ...
- jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法
jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法 在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...
- PHP使用内置函数生成图片的方法详解
原文地址:http://www.poluoluo.com/jzxy/201605/475301.html 本文实例讲述了PHP使用内置函数生成图片的方法.分享给大家供大家参考,具体如下: 第一步:创建 ...
- JAVA 主函数(主方法)
主函数(主方法) 1.public (访问修饰符,公共的)代表该类或者该方法访问权限是最大的 2.static 代表主函数随着类的加载而加载 3.void 代表主函数没有具体的返回 ...
- 【转】Linux时间函数之gettimeofday()函数之使用方法
原文网址:http://blog.csdn.net/tigerjibo/article/details/7039434 一.gettimeofday()函数的使用方法: 1.简介: 在C语言中可以使用 ...
- objective-C学习笔记(四)函数成员:方法(函数)
函数分为: 全局函数(C语言函数) 成员函数(OBJC方法):实例方法 “-” 和类方法“+”的区别 //这里要区别静态变量(类变量).全局函数.常量的区别 OBJC里面,所有方法默认为公有方法.没 ...
- splice()函数的使用方法
splice()函数的使用方法,这是一个拗口的函数.用起来有点麻烦.图3所看到的是splice函数的功能.将一个列表插入到还有一个列表其中.list容器类定义了splice()函数的3个版本号: sp ...
- 模式识别 - libsvm该函数的调用方法 详细说明
libsvm该函数的调用方法 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26261173 须要载入(load)SVM ...
- 举例详解Python中的split()函数的使用方法
这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:sp ...
随机推荐
- [洛谷P2085]最小函数值
题目大意:有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,要求出所有函数的所有函数值中最小的m个(如有重复的要输出多个 ...
- [转载]-分布式之redis复习精讲
原创地址:https://www.cnblogs.com/rjzheng/p/9096228.html 看这篇文章前,我看的是另一个人博客上的文章.看到最后(评论这一块)很多人就指出这并非原创而是抄袭 ...
- python -迭代器与生成器 以及 iterable(可迭代对象)、yield语句
我刚开始学习编程没多久,对于很多知识还完全不知道,而有些知道的也是一知半解,我想把学习到的知识记录下来,一是弥补记忆力差的毛病,二也是为了待以后知识能进一步理解透彻时再回来做一个补充. 参考链接: 完 ...
- 【Codeforces Round #421 (Div. 2) A】Mister B and Book Reading
[题目链接]:http://codeforces.com/contest/820/problem/A [题意] 每天看书能看v页; 且这个v每天能增加a; 但是v有上限v1; 然后每天还必须往回看t页 ...
- spring AOP的Pointcut注解报错
error at ::0 can't find referenced pointcut spring使用的是4.1.0,在项目中直接复制旧的aspectjweave.jar报错了 然后换成aspect ...
- iOS framework配置脚本
# Sets the target folders and the final framework product. FMK_NAME=HovnVoipEngine FMK_VERSION=1.0 # ...
- POJ 3150 Cellular Automaton(矩阵高速幂)
题目大意:给定n(1<=n<=500)个数字和一个数字m,这n个数字组成一个环(a0,a1.....an-1).假设对ai进行一次d-step操作,那么ai的值变为与ai的距离小于d的全部 ...
- poj3169 差分约束系统
题意: 从1到n,n个数,从左向右依次排列. 给定两种形式的约束条件: 1.xi与yi的最大距离为dk 2.xi与yi的最小距离为dk 问满足这些限定条件的情况下,数1和n的最大距离是多少?(若约束条 ...
- 《Android编程权威指南》CriminalIntent项目梳理
相信很多新手或者初级开发人员都已经买了第2版的<Android编程权威指南>, 这本书基于Android Studio开发,对入门人员来说是很好的选择,但是很可惜的是, 在完成一个项目后, ...
- 冒泡排序算法 C#版
冒泡排序算法的运作如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.针对所 ...