事件識別碼 (事件記錄)

事件識別碼可唯一識別特定事件。 每個 事件來源 都可以定義自己的編號事件,以及它們在其訊息檔中對應的描述字串。 事件檢視器可以將這些字串呈現給使用者。 他們應該協助使用者瞭解發生錯誤的內容,並建議採取哪些動作。 引導使用者解決自己的問題,而不是系統管理員或支援技術人員的描述。 如需詳細資訊,請參閱 錯誤訊息指導方針

格式

下圖說明事件識別碼的格式。

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

在下列範例中,適合在 pszDescription 中使用 pszString1 或 pszString2 來插入字串。

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