イベント識別子 (イベント ログ)

イベント識別子は、特定のイベントを一意に識別します。 各 イベント ソース は、独自の番号付きイベントと、メッセージ ファイルにマップされる説明文字列を定義できます。 イベント ビューアーは、これらの文字列をユーザーに提示できます。 ユーザーが問題を理解し、実行するアクションを提案するのに役立つ必要があります。 管理者やサポート技術者ではなく、自分の問題を解決するユーザーに説明を指示します。 詳細については、「 エラー メッセージのガイドライン」を参照してください。

フォーマット

次の図は、イベント識別子の形式を示しています。

  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 パラメーターのメッセージ文字列を解析します。 メッセージに 1 つ以上のパラメーターが含まれている場合は、ソースの ParameterMessageFile レジストリ値を読み込みます。 メッセージ文字列内の各パラメーターについて、識別子を取得し、 FormatMessage に渡してパラメーター文字列を取得します。 メッセージ文字列のパラメーターを、 FormatMessage が返したパラメーター文字列に置き換えます。

挿入文字列

挿入文字列は、説明文字列のプレースホルダーの値を入力するために使用される、言語に依存しない省略可能な文字列です。 文字列はローカライズされないため、これらのプレースホルダーは、数値、ファイル名、ユーザー名などの言語に依存しない文字列を表すためにのみ使用することが重要です。 文字列の長さは 32 キロバイト ( 1 文字) を超えてはなりません。

複数の文字列を使用して、より大きな説明を作成しないでください。 挿入文字列は、テキストではなくデータとして扱う必要があります。 たとえば、次の例では、pszString1 と pszString2 を pszDescription の挿入文字列として使用しないでください。

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

次の例では、pszDescription の挿入文字列に pszString1 または pszString2 を使用するのが適切です。

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