bluesky_lcj

导航

C言語で、ReportEvent イベントログへイベントを書き込み(簡単なサンプル)

Cの宣言:
BOOL ReportEvent(
 HANDLE hEventLog,
 WORD EventType,
 WORD Category,
 DWORD EventId,
 PSID UserSid,
 WORD StringNum,
 DWORD DataSize,
 LPCTSTR *StringArray,
 LPVOID Data);


説明:
hEventLogで指定されたイベントログに対して、イベントを書き込む。
本関数はNTで使用可能。

引数の意味は以下の通り。 hEventLog 書き込み先のイベントログを識別するハンドル。RegisterEventSourceで取得したものでなければならない。
EventType イベントのタイプ。後述の表を参照。
Category イベントのカテゴリ。
EventId イベントのID。
UserSid ユーザのSID。NULLを指定可能。
StringNum 埋込み文字列の数。
DataSize 付加情報のサイズ。
StringArray 埋込み文字列の配列。
Data 付加情報。


EventTypeには、以下のいずれかのフラグを指定可能。 EVENTLOG_ERROR_TYPE エラーイベント。
EVENTLOG_WARNING_TYPE 警告イベント。
EVENTLOG_INFORMATION_TYPE 情報イベント。
EVENTLOG_AUDIT_SUCCESS 監査成功イベント。
EVENTLOG_AUDIT_FAILURE 監査失敗イベント。


戻り値は、関数の実行に成功したか否かを表す真偽値である。


Cのサンプル:
イベントログにイベントを書き込む。 本サンプルを実行するには、まずtest.mcをメッセージコンパイラでコンパイルする(DOSプロンプトで「mc test.mc」を実行)。次に、生成されたtest.rcファイルをプロジェクトに追加し、コンパイルを行なう。(生成されたヘッダファイルやバイナリファイルなども参照可能でなければならない)。次に、レジストリのHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Applicationというキーに"Test"という名前のサブキーを作成し(通常管理者権限が必要)、REG_EXPAND_SZ型の"EventMessageFile"という名前のレジストリ値と、REG_DWORD型の"TypesSupported"という名前のレジストリ値を作成する。EventMessageFileの値は、作成したEXEのファイルパスである。TypesSupportedは5としておく。最後に、EXEを実行すると二つのイベントがApplicationログに記録される。
-------------------------------- test.mc --------------------------------
LanguageNames = (English=0x409:MSG00409)
LanguageNames = (Japanese=0x411:MSG00411)

MessageId = 1
Severity = Error
Facility = Application
SymbolicName = MSG_MEMORY_ERROR
Language = English
Memory Error.
.
Language = Japanese
メモリエラー。
.

MessageId = 2
Severity = Informational
Facility = Application
SymbolicName = MSG_FILE_NOT_FOUND

Language = English
File %1 is not equal to %2.
.
Language = Japanese
ファイル"%1"は"%2"と異なる。
.

-------------------------------- test.c --------------------------------
#include "test.h"

/* イベントログへ書き込み */
void WriteLog(void)
{
 HANDLE hEventLog;
 BOOL bResult;
 char *FileNotFoundArgs[] = {
  "src.dat",
  "dest.dat"
 };

 /* イベントログのオープン */
 hEventLog = RegisterEventSource(NULL, "Test");
 if(hEventLog == NULL) printf("event log can not open.\n");

 /* イベントログへ書き込みその1 */
 bResult = ReportEvent(
  hEventLog,
  EVENTLOG_ERROR_TYPE,
  0,
  MSG_MEMORY_ERROR,
  NULL,
  0,
  0,
  NULL,
  NULL);

 if(!bResult) printf("event1 can not write.\n");

 /* イベントログへ書き込みその2 */
 bResult = ReportEvent(
  hEventLog,
  EVENTLOG_INFORMATION_TYPE,
  0,
  MSG_FILE_NOT_FOUND,
  NULL,
  2,
  0,
  FileNotFoundArgs,
  NULL);  

 if(!bResult) printf("event2 can not write.\n");

 /* イベントログのクローズ */
 DeregisterEventSource(hEventLog);
}

 

posted on 2009-04-07 16:17  bluesky_lcj  阅读(3606)  评论(0编辑  收藏  举报