消息文本文件

消息在消息文本文件中定义。 消息编译器为每个消息分配数字,并生成一个 C/C++包含文件,应用程序可以使用该文件通过符号常量访问消息。

消息文本文件中语句的一般语法如下所示:

关键字=

将忽略等号周围的空格,该值由下一个关键字/值对中的空格(包括换行符)分隔。 与关键字名称进行比较时,忽略大小写。 部分可以是使用 C/C++ 语法的数值整数常量、遵循 C/C++ 标识符规则的符号名称,或者文件名中包含 8 个字符或更少,且没有句点。

有关示例消息文件,请参阅 示例消息文本文件

评论

邮件文本文件中允许批注行。 分号(;)开始注释,该注释以行尾结束。 使用 C/C++ 单行注释指示器(//)遵循分号,以便消息编译器生成的头文件将在应用程序中编译。

;// This is a single-line comment.

对于块注释,请以分号开头每一行,然后在第一行的分号后面放置一个 C/C++打开的块注释指示器(/*),最后一行的分号后面放置关闭块注释指示器(*/)。

;/* This is a block comment.
;   It spans multiple lines.
;*/

标头部分

消息文本文件包含一个标头,用于定义供文件正文中的消息定义使用的名称和语言标识符。 标头包含以下语句的零个或多个。

语句语法 描述
MessageIdTypedef=类型 消息定义中使用的类型,如下所示:#define 名称((类型)0xnnnnnnnn
类型必须足够大才能容纳整个消息代码,例如 DWORD。 该类型也可以是应用程序源代码中定义的类型。 类型 的默认值为空,因此不使用类型强制转换。
可以在标头中指定此语句,并在消息定义节中尽可能多地指定此语句。
SeverityNames=(name=number[:name]) 消息定义中允许严重性的名称集。 与每个严重性名称关联的数字是一个数字,当向左移动 30 位时,为逻辑模式提供逻辑模式,以及用于形成消息代码的设施和消息 ID 值。 任何不适合 2 位的严重性值都是错误。 还可以为严重性代码提供符号名称。默认值定义如下:SeverityNames=( Success=0x0 Informational=0x1 Warning=0x2 Error=0x3)
FacilityNames=(name=number[:name]) 消息定义中的设施值允许的名称集。 与每个设施名称关联的数字是一个数字,当向左移动 16 位时,为逻辑 OR 提供严重性和消息 ID 值以形成消息代码的位模式。 任何不适合 12 位的设施值都是错误的。 这允许 4096 设施代码;前 256 个代码保留供系统使用。 还可以为设施代码提供符号名称。默认值定义如下:FacilityNames=(System=0x0FF Application=0xFFF)
LanguageNames=(name=numberfilename 消息定义中允许的语言值的名称集。 该数字用作资源表中的语言标识符。 指定的文件包含该语言的消息。 它通常是消息编译器生成的.bin文件。
示例值为:LanguageNames=(English=0x409:MSG00409)
有关语言标识符的列表,请参阅 https://go.microsoft.com/fwlink/p/?linkid=190280
OutputBase=数字 消息编译器写入头文件的消息常量输出基数。 如果存在,此值将替代 -d 开关。 此数字可以是 10(十进制)或 16(十六进制)。

消息定义

邮件文本文件包含标头节后面的零个或多个消息定义。 下表描述了消息定义语句。 MessageId 语句标记消息定义的开头。 严重性和 Facility 语句是可选的。

语句语法 描述
MessageId=[number|+number] 消息的标识符。 此语句是必需的,尽管该值是可选的。 如果未指定任何值,则使用的值是设施的上一个值,外加一个。 如果使用加号指定值,则使用的值是设施的上一个值,加上加号后面的数字。 指定的任何值必须适合 16 位。有关消息值如何从严重性、设施和消息 ID 形成的详细信息,请参阅 Winerror.h 中的图表。 此头文件定义系统的错误代码。
严重性=名称 标头中 SeverityNames 指定的值之一。 此语句是可选的。 如果未指定任何值,则使用的值是最后为消息定义指定的值。 第一个消息定义的默认值为 Severity=Success
facility=名称 标头中的 FacilityNames 指定的值之一。 此语句是可选的。 如果未指定任何值,则使用的值是最后为消息定义指定的值。 第一个消息定义的默认值为 Facility=Application
SymbolicName=名称 将 C/C++ 符号常量与消息代码相关联。 它在消息定义中使用,如下所示:#define 名称((类型)0xnnnnnnnn
OutputBase={number} 消息编译器写入头文件的消息常量输出基数。 如果存在,此值将替代 -d 开关。 此数字可以是 10(十进制)或 16(十六进制)。
Language=名称 标头中的 LanguageNames 指定的值之一。 此语句是可选的。 如果未指定任何值,则使用的值是最后为消息定义指定的值。 第一个消息定义的默认值如下所示:Language=English
消息文本 消息的文本。 它包含在消息二进制文件中。 它还包含在直接位于消息定义的注释块中的头文件中。
. 消息文本由包含行开头的单个句点的新行终止。

如果消息定义包含多种语言的消息文本,则每种语言都需要其自己的语言语句、消息文本以及用句点终止新行。 例如:

MessageId=0x1
Severity=Error
Facility=Runtime
SymbolicName=MSG_BAD_COMMAND
Language=English
You have chosen an incorrect command.
.

Language=Japanese
<Japanese message string goes here>
.

可以为事件查看器或应用程序使用的消息文本设置格式设置以下转义序列。 百分号字符(%)开始所有转义序列。 在百分比符号之后的任何其他字符都显示没有百分比符号。

% n[!format_specifier!]

描述插入。 每个插入都是 FormatMessage 函数中的 Arguments 数组中的条目。 n 的值可以是介于 1 和 99 之间的数字。 格式说明符是可选的。 如果未指定任何值,则默认值为 !s!。 有关格式说明符的信息,请参阅 wsprintf

格式说明符可用于精度或宽度的 * 。 指定时,它们使用 n+1 和 n+2 进行编号的插入。

%0

终止消息文本行而不带尾随换行符。 这可用于生成长行或终止提示消息,而无需尾随换行符。

%。

生成单个句点。 这可用于在行的开头显示句点,否则将终止消息文本。

%!

生成单个感叹号。 这可用于在插入后立即指定感叹号。

%%

生成单一百分比符号。

%n

在行尾发生硬换行符时生成一个硬换行符。 这可与 FormatMessage 一起使用,以确保消息适合特定宽度。

%b

生成空格字符。 这可用于确保行上的尾随空格数量适当。

%r

生成不带尾随换行符的硬回车符。