・イベントログを使っての作業
<イベントログ書込み対象アプリケーション作成>
早速イベントログの書込みを行いたいところですが、その前にイベントログの書込み対象の 簡単なアプリケーションを作成したいと思います。アプリケーションの内容はダイアログ内の テキストボックスにファイル名を入力して、そのファイルが存在するかどうかというごく単純なアプリです。 このアプリの起動・終了と、入力したファイル名が存在するか・しないかをイベントログに 書き込もうと思います。
前頁のTestEventLogのソリューションにFileExistプロジェクトとして加えるので、
TestEventLogプロジェクトを開いた後、以下のように行ってください。
ツールバーのファイル(F)→新規作成(N)→プロジェクト(P)で「新しいプロジェクト」ダイアログボックスを
表示させて次のように設定してください。
プロジェクトの種類(P) :Visual C++
テンプレート(T) :MFCアプリケーション
プロジェクト名(N) :FileExist
ソリューション(S) :ソリューションに追加
→OK
アプリケーションウィザードが起動するので次のように設定してください。
→次へ アプリケーションの種類 アプリケーションの種類:ダイアログベース(D) (他はそのまま) →次へ ユーザーインターフェイス機能 メインフレームのスタイル:システムメニュー(S)のみチェック →次へ 高度な機能 (そのまま) →次へ 生成されたクラス (そのまま) →完了
以上でスケルトンが出来上がっているので、CFileExistDlgクラスとリソースを 加筆・修正していきます。
まずはダイアログリソースの作成から。 ツールバーからリソースビューを表示させ、IDD_FILEEXIST_DIALOGのダイアログリソースを 表示して以下のようにエディットコントロール1つ、コマンドボタン1つ、 スタティックテキスト2つを作成してください。
プロパティ | 設定値 | |
1 | ID | IDC_ED_FILEPATH |
2 | ID | IDC_BTN_EXEC |
3 | ID | IDC_STC_RESULT |
Client Edge | True | |
4 | ID | IDC_STC_NOTIFYEVT |
Client Edge | True |
次のメインダイアログのCFileExistDlgクラスの ヘッダ・実装ファイルに以下のように記述してください。
// FileExistDlg.h : ヘッダーファイル // #pragma once // CFileExistDlg ダイアログ class CFileExistDlg : public CDialog { // ・ // ・ // ・ protected: virtual void OnOK(); virtual void OnCancel(); void PreEndDialog(); //ダイアログ終了前処理 BOOL GetSID(PSID *ppSid); //現在のユーザのセキュリティ識別子取得 BOOL WriteEvent(WORD wType, //イベントログへの書込み WORD wCategory, DWORD dwEventID, WORD wNumStrings, DWORD dwDataSize, LPCTSTR *lpStrings, LPVOID lpRawData); public: afx_msg void OnBnClickedBtnExec(); //検索ボタンクリック時 protected: DECLARE_MESSAGE_MAP() }; |
<1.イベントログへの書込み>
アプリケーションの起動時・終了時とファイルの検索時(OnBnClickedBtnExec実行時) に上記のWriteEventによってイベントログに書き込んでいます。 WriteEvent内で、RegisterEventSourceとReportEventによって イベントの各項目をイベントログに 書き込んでいます。実際にイベントログに書き込むAPI、RegisterEventSource/ReportEventの定義は 次のようになっています。
HANDLE RegisterEventSource( LPCTSTR lpUNCServerName, // 操作を実行するサーバーの名前 LPCTSTR lpSourceName // 登録済みハンドルを取得するイベントソースの名前 );
BOOL ReportEvent( HANDLE hEventLog, // イベントログのハンドル(RegisterEventSourceで得たハンドル) WORD wType, // ログに書き込むイベントの種類 WORD wCategory, // イベントの分類 DWORD dwEventID, // イベント識別子 PSID lpUserSid, // ユーザーセキュリティ識別子(省略可能) WORD wNumStrings, // メッセージにマージする文字列の数 DWORD dwDataSize, // バイナリデータのサイズ(バイト数) LPCTSTR *lpStrings, // メッセージにマージする文字列の配列 LPVOID lpRawData // バイナリデータのアドレス );
実際にログに書き込むReportEventの各引数の内容は次のようになっています。
引数 | 指定内容 |
hEventLog | 前頁の前準備で レジストリに登録したイベントソース名(MyApp)を設定して得たハンドルを、 RegisterEventSourceの第二引数に指定して得たハンドル |
wType | エラー、警告などイベントの種類を指定する(winnt.h内の値) |
wCateogory | メッセージテキスト( MyAppMsg.MC)をmc.exeでコンパイルして できたMyAppMsg.hヘッダ内のカテゴリのIDを指定する |
dwEventID | メッセージテキスト( MyAppMsg.MC)をmc.exeでコンパイルして できたMyAppMsg.hヘッダ内のメッセージのIDを指定する |
lpUserSid | 現在のユーザ名を指定しますが、文字列として渡すのではなく セキュリティ識別子(SID)で渡さなければならないので、LookupAccountName APIを使って SIDを取得することになります。(上記GetSID関数を参照) |
wNumStrings | 前頁の メッセージファイルの例で%1のプレースホルダで示されているパラメータに埋め込む文字列を 指定する引数です。1つのメッセージあたり、%2、%3・・・とプレースホルダがあれば、 その数をwNumStringsに指定して、文字列の配列へのポインタを指定します。 |
lpStrings | |
dwDataSize | dwDataSizeとlpRawDataは任意のデータ (今回はファイル検索時にファイルの属性を指定)を設定します。dwDataSizeはlpRawDataのサイズを、 lpRawDataはログに記録するデータの領域へのポインタを指定します。 |
lpRawData |
記述例は、上記のWriteEventの定義、このメンバ関数が
使われているCFileExist::OnInitDialog、CFileExist::PreEndDialog、
CFileExist::OnBnClickedBtnExecをご覧ください。
また、カスタムパフォーマンスモニタの
作成時にもイベントログへの書込みを行っているのでご覧になってください。
以上でイベントログへの書込みのすべての作業が終了したので、FileExistプロジェクトを ビルドして実行後、任意のファイル検索をしてください。そのあと、イベントビューアでイベントログが 記録されていることを確認してください。