FormatMessage

【勇芳软件工作室】汉化HomePreviousNext

FormatMessage函数格式化消息字符串。该函数需要一个消息定义作为输入。消息定义可以来自传递到函数中的缓冲区。它可以来自已加载模块中的消息表资源。或者呼叫者可以要求该函数在系统的消息表资源中搜索消息定义。该函数基于消息标识符和语言标识符在消息表资源中查找消息定义。该函数将格式化的消息文本复制到输出缓冲区,如果请求,则处理任何嵌入的插入序列。

DWORD FormatMessage(

DWORD 【dwFlags中】,//源和处理选项
LPCVOID 【// pointer to message source】,//指向消息源的指针
DWORD 【dwMessageId】,//请求的消息标识符en
DWORD 【dwLanguageId】,//所请求消息的语言标识符
LPTSTR 【lpBuffer】,//指向消息缓冲区的指针
DWORD 【服务提供商】,//消息缓冲区的最大大小
va_list的 【*参数】//消息插入数组的地址
); 

参数

【dwFlags中】

包含一组位标志,用于指定格式化过程的各个方面以及如何解释【// pointer to message source】参数。【dwFlags中】的低位字节指定函数如何处理输出缓冲区中的换行符。低位字节也可以指定格式化输出行的最大宽度。

您可以指定以下位标志的组合:

含义
FORMAT_MESSAGE_ALLOCATE_BUFFER 
 指定【lpBuffer】参数是指向PVOID指针的指针,并且【服务提供商】参数指定要为输出消息缓冲区分配的最小字节数(ANSI版本)或字符(Unicode版本)。该函数分配一个足够大的缓冲区以容纳格式化的消息,并将指针指向由【lpBuffer】指定的地址分配的缓冲区。当不再需要时,调用者应使用LocalFree函数来释放缓冲区。
FORMAT_MESSAGE_IGNORE_INSERTS 
 指定消息定义中的插入序列将被忽略,并将其传递给输出缓冲区。此标志对于获取稍后格式化的消息很有用。如果设置此标志,则【参数】参数将被忽略。
FORMAT_MESSAGE_FROM_STRING 
 指定【// pointer to message source】是一个指向空终止消息定义的指针。消息定义可以包含插入序列,就像消息表资源中的消息文本一样。不能与FORMAT_MESSAGE_FROM_HMODULE或FORMAT_MESSAGE_FROM_SYSTEM一起使用。
FORMAT_MESSAGE_FROM_HMODULE 
 指定【// pointer to message source】是一个包含要搜索的消息表资源的模块句柄。如果此【// pointer to message source】句柄为NULL,则将搜索当前进程的应用程序映像文件。不能与FORMAT_MESSAGE_FROM_STRING一起使用。
FORMAT_MESSAGE_FROM_SYSTEM 
 指定该函数应在系统消息表资源中搜索所请求的消息。如果使用FORMAT_MESSAGE_FROM_HMODULE指定了该标志,则如果在【// pointer to message source】指定的模块中找不到该消息,该函数将搜索系统消息表。不能与FORMAT_MESSAGE_FROM_STRING一起使用。

如果指定了此标志,应用程序可以传递GetLastError函数的结果来检索系统定义错误的消息文本。

FORMAT_MESSAGE_ARGUMENT_ARRAY 
 指定GetLastError一个va_list的结构的【不】参数,而只是一个指向表示参数的32位值数组的指针。

【dwFlags中】的低位字节可以指定格式化输出行的最大宽度。使用FORMAT_MESSAGE_MAX_WIDTH_MASK常量和按位布尔运算来设置和检索此最大宽度值。

下表显示了FormatMessage如何解释低位字节的值。

含义
0没有输出行宽限制。该函数将消息定义文本中的换行符存储到输出缓冲区中。
非FORMAT_MESSAGE_MAX_WIDTH_MASK以外的非零值非零值是输出行中的最大字符数。该函数忽略消息定义文本中的常规换行符。该函数不会分割一个由空格划分的字符串。该函数将消息定义文本中的硬编码换行符存储到输出缓冲区中。硬编码换行符用%n转义序列编码。
FORMAT_MESSAGE_MAX_WIDTH_MASK该函数忽略消息定义文本中的常规换行符。该函数将消息定义文本中的硬编码换行符存储到输出缓冲区中。该函数不会生成新的换行符。

【// pointer to message source】

指定消息定义的位置。此参数的类型取决于【dwFlags中】参数中的设置。

【dwFlags中】设置参数类型
FORMAT_MESSAGE_FROM_HMODULE【// pointer to message source】是包含要搜索的消息表的模块的hModule。
FORMAT_MESSAGE_FROM_STRING【// pointer to message source】是一个LPTSTR,指向未格式化的消息文本。它将被扫描进行插入并相应格式化。

如果【dwFlags中】中没有设置这些标志,则忽略【// pointer to message source】.

【dwMessageId】

指定所请求消息的32位消息标识符。如果【dwFlags中】包含FORMAT_MESSAGE_FROM_STRING,则忽略此参数。

【dwLanguageId】

指定所请求消息的32位语言标识符。如果【dwFlags中】包含FORMAT_MESSAGE_FROM_STRING,则忽略此参数。

如果您在此参数中传递特定LANGID,则FormatMessage将仅返回该LANGID的消息。如果该函数无法找到该LANGID的消息,则返回ERROR_RESOURCE_LANG_NOT_FOUND。如果您传入零,FormatMessage按以下顺序寻找LANGID的邮件:

语言中立

2.Thread LANGID,基于线程的区域设置值

3.根据用户的默认语言环境值,使用默认LANGID

4.系统默认LANGID,基于系统默认的语言环境值

5.US英文

如果FormatMessage没有找到任何上述LANGID的消息,它将返回任何存在的语言消息字符串。如果即使失败,它返回ERROR_RESOURCE_LANG_NOT_FOUND。

【lpBuffer】

指向格式化(和空终止)消息的缓冲区。如果【dwFlags中】包含FORMAT_MESSAGE_ALLOCATE_BUFFER,则该函数将使用LocalAlloc函数分配缓冲区,并将缓冲区的地址放置在【lpBuffer】中指定的地址。

【服务提供商】

如果未设置FORMAT_MESSAGE_ALLOCATE_BUFFER标志,则此参数指定可存储在输出缓冲区中的最大字节数(ANSI版本)或字符(Unicode版本)。如果设置了FORMAT_MESSAGE_ALLOCATE_BUFFER,则此参数指定要为输出缓冲区分配的最小字节数或字符数。

【参数】

指向用作格式化消息中的插入值的32位值数组。格式字符串中的%1表示【参数】数组中的第一个值; %2表示第二个参数;等等。

每个32位值的解释取决于与消息定义中的插入相关联的格式信息。默认值是将每个值作为指向空终止字符串的指针。

默认情况下,【参数】参数的类型为va_list的*,它是一种语言和实现特定的数据类型,用于描述可变数量的参数。如果没有类型为va_list的*的指针,则指定FORMAT_MESSAGE_ARGUMENT_ARRAY标志,并将指针传递给32位值的数组;那些值被输入到格式化为插入值的消息中。每个插入必须在数组中具有相应的元素。

返回值

如果函数成功,则返回值是存储在输出缓冲区中的字节数(ANSI版本)或字符(Unicode版本),不包括终止空字符。

如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.

备注

FormatMessage功能可用于获取GetLastError返回的系统错误代码的错误消息字符串,如以下示例代码所示。

LPVOID lpMsgBuf;

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,

NULL,

GetLastError(),

MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //默认语言

(LPTSTR)& lpMsgBuf,

0,

NULL

);

//显示字符串。

MessageBox(NULL,lpMsgBuf,“GetLastError”,MB_OK | MB_ICONINFORMATION);

//释放缓冲区

LocalFree( lpMsgBuf );

在消息文本中,支持动态格式化消息的几个转义序列。这些转义序列及其含义如下表所示。所有转义序列以百分比字符(%)开头。

逃脱序列含义
%0终止消息文本行,不带尾随换行符。此转义序列可用于构建长行或终止消息本身,而不带尾随的换行符。它对于提示信息很有用。
%【n】!【printf格式的字符串】!标识插入。【n】的值可以在1到99之间。的printf格式的字符串(必须用感叹号括起来)是可选的,如果未指定,则默认为!s!.
 的printf格式字符串可以包含精度或宽度分量的*说明符。如果*指定为一个组件,则FormatMessage函数使用插入%【n】 +1;如果为两个组件指定了*,它使用%【n】?? +2。
 不支持浮点的printf格式说明符__ e,E,f和g __。解决方法是使用的sprintf函数将浮点数格式化为临时缓冲区,然后将该缓冲区用作插入字符串。

百分比字符后面的任何其他非字符字符在输出消息中格式化,而不包含百分比字符。以下是一些例子:

格式化字符串产生的结果
%%格式化的消息文本中单个百分比登录。
%n当格式化字符串出现在行的末尾时,硬线路断开。当FormatMessage提供常规换行符,以便邮件适合某个宽度时,此格式字符串很有用。
%【空间】格式化消息文本中的空格。此格式字符串可用于确保消息文本行中相应数量的尾随空格。
%.格式化消息文本中的单个时间段。此格式字符串可用于在行的开始处包含单个句点,而不终止消息文本定义。
%!格式化消息文本中的一个感叹号。此格式字符串可用于在插入后立即包含感叹号,而不会将其错误地标识为的printf格式字符串的开头。

也可以看看

LoadString, LocalFree