事件标识符(事件日志记录)

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

格式

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

  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."