使用FormatMessage时假设对一些參数不细致研究。那么就会出错误。首先说下这个函数

1 函数描写叙述

  1. DWORD WINAPI FormatMessage(
  2. _In_ DWORD dwFlags,
  3. _In_opt_ LPCVOID lpSource,
  4. _In_ DWORD dwMessageId,
  5. _In_ DWORD dwLanguageId,
  6. _Out_ LPTSTR lpBuffer,
  7. _In_ DWORD nSize,
  8. _In_opt_ va_list *Arguments
  9. );

<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,那么该值就会被忽略。

  1. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) //设置为本地默认语言
  2. MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US) //设置为美语
  3. 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.



比如:

  1. LPWSTR pMessage = L"%1!*.*s! %4 %5!*s!";
  2. DWORD_PTR pArgs[] = { (DWORD_PTR)4, (DWORD_PTR)1, (DWORD_PTR)L"Bill",
  3. (DWORD_PTR)L"Bob", (DWORD_PTR)5, (DWORD_PTR)L"Bill" };
  4. const DWORD size = 100+1;
  5. WCHAR buffer[size];
  6.  
  7. if (!FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
  8. pMessage,
  9. 0,
  10. 0,
  11. buffer,
  12. size,
  13. (va_list*)pArgs))
  14. {
  15. wprintf(L"Format message failed with 0x%x\n", GetLastError());
  16. return;
  17. }

这里面pArgs的4代表第一个插入元素的宽度,1代表精度(即Bill中的一个元素B)。6代表元素的宽度,每个字符串之间都是以空格为间隔。上面的程序执行得到的buffer就是“    B Bob  Bill”





7 再看两个样例区分下

<1>

  1. LPSTR buf;
  2. LONG x1 = RegCreateKey(HKEY_LOCAL_MACHINE,TEXT("sofware\\VC++MFC\\adminss"),&hKey);
  3. FormatMessage(
  4. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  5. FORMAT_MESSAGE_FROM_SYSTEM,
  6. NULL ,
  7. x1,
  8. MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
  9. (LPTSTR)&buf,
  10. 3,
  11. NULL);
  12. LocalFree(buf);

注意这里buf以及參数dwFlags

<2>

  1. TCHAR buf[100] = {0};
  2. LONG x1 = RegCreateKey(HKEY_LOCAL_MACHINE,TEXT("sofware\\VC++MFC\\adminss"),&hKey);
  3. FormatMessage(
  4. FORMAT_MESSAGE_FROM_SYSTEM,
  5. NULL ,
  6. x1,
  7. MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
  8. (LPTSTR)buf,
  9. 100,
  10. NULL);

注意这里的buf以及參数dwFlags



8 VS提供的查看错误的工具

VS,工具-》错误查找,就能够打开错误对话框,然后在Key中输入值就能够查找错误ID相应的文字描写叙述了。这里的错误ID是能够是10进制,也能够是16进制,可是无论10进制还是16进制,仅仅要其相应的值相等那么错误描写叙述就一样。

FormatMessage函数的使用方法的更多相关文章

  1. (MTT)连续能量函数最小化方法

    (MTT)连续能量函数最小化方法 Multitarget tracking Multi-object tracking 连续能量函数 读"A.Milan,S. Roth, K. Schind ...

  2. jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法

    jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法   在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...

  3. PHP使用内置函数生成图片的方法详解

    原文地址:http://www.poluoluo.com/jzxy/201605/475301.html 本文实例讲述了PHP使用内置函数生成图片的方法.分享给大家供大家参考,具体如下: 第一步:创建 ...

  4. JAVA 主函数(主方法)

    主函数(主方法) 1.public     (访问修饰符,公共的)代表该类或者该方法访问权限是最大的 2.static    代表主函数随着类的加载而加载 3.void    代表主函数没有具体的返回 ...

  5. 【转】Linux时间函数之gettimeofday()函数之使用方法

    原文网址:http://blog.csdn.net/tigerjibo/article/details/7039434 一.gettimeofday()函数的使用方法: 1.简介: 在C语言中可以使用 ...

  6. objective-C学习笔记(四)函数成员:方法(函数)

    函数分为:  全局函数(C语言函数) 成员函数(OBJC方法):实例方法 “-” 和类方法“+”的区别 //这里要区别静态变量(类变量).全局函数.常量的区别 OBJC里面,所有方法默认为公有方法.没 ...

  7. splice()函数的使用方法

    splice()函数的使用方法,这是一个拗口的函数.用起来有点麻烦.图3所看到的是splice函数的功能.将一个列表插入到还有一个列表其中.list容器类定义了splice()函数的3个版本号: sp ...

  8. 模式识别 - libsvm该函数的调用方法 详细说明

    libsvm该函数的调用方法 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26261173 须要载入(load)SVM ...

  9. 举例详解Python中的split()函数的使用方法

    这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下   函数:sp ...

随机推荐

  1. tload---显示系统负载

    tload命令以图形化的方式输出当前系统的平均负载到指定的终端.假设不给予终端机编号,则会在执行tload指令的终端机显示负载情形. 语法 tload(选项)(参数) 选项 -s:指定闲时的刻度: - ...

  2. Django初学习程序大致流程

  3. C. Diverse Permutation(Codeforces Round #275(div2)

    C. Diverse Permutation time limit per test 1 second memory limit per test 256 megabytes input standa ...

  4. Android中System.currentTimeMillis()

    函数: System.currentTimeMillis(): 功能:产生一个当前的毫秒,这个毫秒事实上就是自1970年1月1日0时起的毫秒数,Date()事实上就是相当于Date(System.cu ...

  5. 智课雅思短语---二、exert positive/ negative effects on…

    智课雅思短语---二.exert positive/ negative effects on… 一.总结 一句话总结:对…产生有利/不利的影响 1.the advantages far outweig ...

  6. Mac OSX 平台安装 MongoDB

    Mac OSX 平台安装 MongoDB MongoDB 提供了 OSX 平台上 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/download ...

  7. 15.C语言多线程实现变色龙以及cmd窗口标题变化

    #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> #include <Wind ...

  8. vue-router学习例子分享

    http://blog.csdn.net/bboyjoe/article/details/52804988 <!DOCTYPE html> <html lang="en&q ...

  9. mysql 5.6 安装教程

    首先是下载 mysql-installer-community-5.6.14.0.msi ,大家可以到 mysql 官方网去下载,也可以到笔者所提供的地址去下载,下载方法在这里就不多说了,我想大家都明 ...

  10. OpenJDK源码研究笔记(十一):浅析Javac编译过程中的抽象语法树(IfElse,While,Switch等语句的抽象和封装)

    浅析OpenJDK源码编译器Javac的语法树包com.sun.source.tree. 抽象语法树,是编译原理中的经典问题,有点难,本文只是随便写写. 0.赋值语句 public interface ...