事件标识符 (事件日志)

事件标识符唯一标识特定事件。 每个 事件源 都可以定义其自己的编号事件及其在其消息文件中映射到的描述字符串。 事件查看者可以向用户显示这些字符串。 它们应帮助用户了解问题所在,并建议采取哪些操作。 指导用户解决自己问题的说明,而不是由管理员或支持技术人员提供。 有关详细信息,请参阅 错误消息指南

格式

下图说明了事件标识符的格式。

  3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 +---+-+-+-----------------------+-------------------------------+
 |Sev|C|R|     Facility          |               Code            |
 +---+-+-+-----------------------+-------------------------------+

Sev

严重性。 严重性定义如下:

00 - 成功
01 - 信息性
10 - 警告
11 - 错误

C

客户位。 此位的定义如下:

0 - 系统代码
1 - 客户代码

R

保留位。

设施

设施代码。 此值可以FACILITY_NULL。

代码

设施的状态代码。

消息定义

消息在事件消息文件中定义。 事件消息文件中的说明字符串按事件标识符编制索引,使事件查看器能够基于事件标识符显示任何事件的特定于事件的文本。 所有说明都是本地化的,并且依赖于语言。 有关生成消息文件的详细信息,请参阅 消息文本文件

说明字符串可能包含格式为 %n 的插入字符串占位符,其中 %1 指示第一个插入字符串,等等。 例如,下面是 .mc 文件中的示例条目:

MessageId=0x4
Severity=Error
Facility=System
SymbolicName=MSG_CMD_DELETE
Language=English
File %1 contains %2, which is in error.
.

在这种情况下, ReadEventLog 返回的缓冲区包含插入字符串。 EVENTLOGRECORD 结构的 NumStrings 成员指示插入字符串的数目。 EVENTLOGRECORD 结构的 StringOffset 成员指示第一个插入字符串在缓冲区中的位置。 调用 FormatMessage 函数时,可以传递指向缓冲区中每个字符串的地址的DWORD_PTRs数组,该数组会将字符串插入消息中。

说明字符串还可以包含参数消息文件中参数字符串的占位符。 占位符的格式为 %%n,其中 %%1 由标识符为 1 的参数字符串替换,依此而行。 但是,需要将参数字符串插入 FormatMessage 返回的消息字符串。 通常,调用 FormatMessage 以获取事件的消息字符串。 然后分析 %%n 参数的消息字符串。 如果消息包含一个或多个参数,请加载源的 ParameterMessageFile 注册表值。 对于消息字符串中的每个参数,获取标识符并将其传递给 FormatMessage 以获取参数字符串。 将消息字符串中的 参数替换为 FormatMessage 返回的参数字符串。

插入字符串

插入字符串是可选的独立于语言的字符串,用于填充说明字符串中占位符的值。 由于字符串未本地化,因此这些占位符仅用于表示与语言无关的字符串(如数值、文件名、用户名等)至关重要。 字符串长度不得超过 32 KB - 1 个字符。

避免使用多个字符串来创建更大的说明。 插入字符串应被视为数据,而不是文本。 例如,在下面的示例中,pszString1 和 pszString2 不应用作 pszDescription 的插入字符串。

LPSTR pszString1 = "successfully"; 
LPSTR pszString2 = "not"; 
LPSTR pszDescription = "The user was %1 added to the database.";

在以下示例中,适合将 pszString1 或 pszString2 用于 pszDescription 中的插入字符串。

LPSTR pszString1 = "c:\\testapp1.c"; 
LPSTR pszString2 = "c:\\testapp2.c"; 
LPSTR pszDescription = "Access denied. Attempted to open the file %1."