c++寫入應用程式日志(Event Log )
分類: C++程式開發2010-12-03 14:16 410人閱讀 評論(0) 收藏 舉報
日志檔案是作業系統的一部分,那麼肯定有應用程式程式設計接口(API)來支援建立日志記錄
執行個體:
HANDLE h;
if ((h = RegisterEventSource(NULL,TEXT("MetaLive"))) == NULL)
{
return FALSE;
}
const char* ps = "pszS1pszS2pszS3";
WORD wType=EVENTLOG_ERROR_TYPE;//EVENTLOG_INFORMATION_TYPE;
DWORD dwID=5001;
int iStr = 1;
BOOL bRet;
DWORD dword;
if (h)
{
bRet=::ReportEvent(h,
wType,
0,
dwID,
NULL, // sid
iStr,
0,
&ps,
NULL);
dword=::GetLastError();
}
//
基于 Windows XP 的計算機将事件記錄在以下三種日志中:
1. 應用程式日志
應用程式日志包含由程式記錄的事件。例如,資料庫程式可能在應用程式日志中記錄檔案錯誤。寫入到應用程式
日志中的事件是由軟體程式開發人員确定的。
2. 安全日志
安全日志記錄有效和無效的登入嘗試等事件,以及與資源使用有關的事件(如建立、打開或删除檔案)。例如,
在啟用登入稽核的情況下,每當使用者嘗試登入到計算機上時,都會在安全日志中記錄一個事件。您必須以 Administrator
或 Administrators 組成員的身份登入,才能打開、使用安全日志以及指定将哪些事件記錄在安全日志中。
3. 系統日志
系統日志包含 Windows XP 系統元件所記錄的事件。例如,如果在啟動過程中未能加載某個驅動程式,則會在
系統日志中記錄一個事件。Windows XP 預先确定由系統元件記錄的事件。
本文,我們專注于第一類應用程式日志,介紹如何寫入一條EventLog。Windows使用ReportEvent 報告應用程式消息,
下面就對這個函數做點簡單的介紹。
HANDLE hEventLog, | // RegisterEventSource傳回的handle |
WORD wType, | // 要記錄的事件類型 |
WORD wCategory, | // 事件種類 |
DWORD dwEventID, | // 事件标示 |
PSID lpUserSid, | // 使用者安全标示(可選) |
WORD wNumStrings, | // 消息的字元串數 |
DWORD dwDataSize, | // 以位元組為機關的二進制資料的大小 |
LPCTSTR *lpStrings, | // 消息本身 |
LPVOID lpRawData | // 二進制資料 |
); |
Parameters
hEventLog
事件标志。這個是 RegisterEventSource 傳回的handle.
wType
事件的類型。可以是如下中的一個:
Value Meaning
EVENTLOG_ERROR_TYPE Error event
EVENTLOG_WARNING_TYPE Warning event
EVENTLOG_INFORMATION_TYPE Information event
EVENTLOG_AUDIT_SUCCESS Success Audit event
EVENTLOG_AUDIT_FAILURE Failure Audit event
wCategory
指出消息種類。這個地方是由源自己定義的,可以是任何值。
dwEventID
事件辨別。根據我的了解,這裡的辨別在使用時,會又源解釋為具體的含義。比如:2001表示檔案打開錯誤等等。
是以,要想設定完整的Event Log還需要在系統中注冊一個解釋的服務程式。示例程式并沒有設計這個服務,
讀者可以參考另外的那個VB程式。
lpUserSid
指向使用者安全标示。當不需要安全标示時,該參數可以為NULL.
wNumStrings
給定lpStrings 指向的數組中字元串組的數量。0表示目前沒有字元串組。
dwDataSize
給出将寫入Evenet Log的資料的大小,以位元組為機關。如果這個參數為0,表示目前沒有事件資料。
lpStrings
指向一個緩沖區,其中是一個以0為結尾的字元串數組,這個數組将會添加到消息中。即使dwDataSize 參數為0,
這個參數也必須是有效的指針(或者為NULL)。數組中每個字元串最大為32K 位元組。
lpRawData
指向包含二進制資料的緩沖區。即使dwDataSize 參數為0,該項也必須是一個有效的指針(或者為NULL).
Return Values
如果執行成功,傳回非零值,表示事件入口已經寫入日志。
如果執行不成功,傳回0.