消息文本文件

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

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

=关键字 (keyword) value

忽略等号周围的空格,值由空格分隔, (包括下一个关键字 (keyword) /值对的换行符) 。 与关键字 (keyword) 名称进行比较时,将忽略大小写。 部分可以是使用 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=type 在消息定义中使用的类型,如下所示:#define name ( (type) 0xnnnnnnnn)
类型必须足够大,才能容纳整个消息代码,例如 DWORD。 该类型也可以是在应用程序源代码中定义的类型。 类型的默认值为空,因此不使用类型强制转换。
可以在标头中指定此语句,并根据需要在消息定义节中指定。
SeverityNames= (name=number[:name]) 消息定义中允许的严重性的名称集。 与每个严重性名称关联的数字是一个数字,当向左移动 30 位时,为逻辑或提供位模式,以及设施和消息 ID 值以形成消息代码。 任何不适合 2 位的严重性值都是错误。 还可以为严重性代码指定符号名称。默认值定义如下:SeverityNames= ( Success=0x0 Informational=0x1 Warning=0x2 Error=0x3)
FacilityNames= (name=number[:name]) 消息定义中允许用于设施值的名称集。 与每个设施名称关联的数字是一个数字,当向左移动 16 位时,向逻辑或提供位模式,其中包含严重性和消息 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=number 消息编译器写入头文件的消息常量的输出基数。 如果存在,此值将替代 -d 开关。 此数字可以是 10 (十进制) 或 16 (十六进制) 。

消息定义

消息文本文件在标头部分后包含零个或多个消息定义。 下表描述了消息定义语句。 MessageId 语句标记消息定义的开头。 严重性和设施语句是可选的。

语句语法 说明
MessageId=[number|+number] 消息的标识符。 此语句是必需的,尽管 该值是可选的。 如果未指定任何值,则使用的值是设施的前一个值,加一个值。 如果使用加号指定值,则使用的值是设施的前一个值,加上加号后的编号。 指定的任何值都必须适合 16 位。有关如何从严重性、设施和消息 ID 构成消息值的更多详细信息,请参阅 Winerror.h 中的图表。 此头文件定义系统的错误代码。
Severity=name 标头中 SeverityNames 指定的值之一。 此语句是可选的。 如果未指定任何值,则使用的值是上次为消息定义指定的值。 第一个消息定义的默认值为 Severity=Success
Facility=name 标头中由 FacilityNames 指定的值之一。 此语句是可选的。 如果未指定任何值,则使用的值是上次为消息定义指定的值。 第一个消息定义的默认值为 Facility=Application
SymbolicName=name 将 C/C++ 符号常量与消息代码相关联。 它在消息定义中使用,如下所示:#define name ( (type) 0xnnnnnnnn)
OutputBase={number} 消息编译器写入头文件的消息常量的输出基数。 如果存在,此值将替代 -d 开关。 此数字可以是 10 (十进制) 或 16 (十六进制) 。
Language=name 标头中 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

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