お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"NTのイベントログに書き込む"






//WindowsNTのイベントログにメッセージを書き込むサンプルです。

Delphiからイベントログに書き込む方法

 イベントログAPIは、メッセージリソースというリソースを持つDLLやEXEか
ら文字列を取得して、指定された文字列と一緒にイベントログに書き込みま
す。

 作成に必要なものは、Delphi, BRCC32.Exe(Delphi付属),MC.Exe(VC++付属)
です。

 Delphiでも文字列リソースが管理できます(D4から?)が、これがメッセー
ジリソースと互換性を持つのかどうかは不明です。

1.イベントログ用メッセージリソースの作成
 まず、以下の様にテキストファイルを作成します。拡張子は「.mc」にしま
す。

-----------------------------------------------------------------
;// LanguageNames=(English=1:Msg00001)--Default
LanguageNames=(Japanese=1041:MSG00002)

MessageIdTypedef=WORD

MessageId=1
SymbolicName=CATEGOLY_ONE
Language=Japanese
アプリケーション
.

MessageIdTypedef=DWORD
SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS
  Informational=0x1:STATUS_SEVERITY_INFORMATIONAL
  Warning=0x2:STATUS_SEVERY_WARNING
  Error=0x3:STATUS_SEVERY_ERROR
  )

;//
;//Message definitions
;//
MessageId=0
SymbolicName=MSG_SAMPLE_SUCC
Severity=Success Facility=Application
Language=Japanese
%1
.

MessageId=
SymbolicName=MSG_SAMPLE_INFO
Severity=Informational Facility=Application
Language=Japanese
%1
.

MessageId=
SymbolicName=MSG_SAMPLE_WARN
Severity=Warning Facility=Application
Language=Japanese
%1
.

MessageId=
SymbolicName=MSG_SAMPLE_ERRO
Severity=Error Facility=Application
Language=Japanese
%1
.
-------------------------------------------------------------------
メッセージリソースはカテゴリとタイプ(情報、警告など)をそれぞれ別に作
ります。ここでは、カテゴリはアプリケーションのみ、タイプは成功、情報、
警告、エラーの4つを定義しています。

「Language=Japanese」から「.(ピリオド)」までが定義文字列です。ここに
「%1」と入れると、APIで指定した文字列が代入されます。

例として、これを「sample.mc」として保存します。

次に、これをmc.exeでコンパイルします。これは、VC++に付属のもので、
Inpriseに問い合わせたところ、Delphi付属のツールには同様のものは無いそ
うです。

コマンドラインから、
C:\>mc sample.mc
と打つと、
sample.h
sample.rc
MSG00002.bin
ができます。最後のファイルは無視して下さい(^^;

次に、Delphi 3\BinディレクトリにあるBrcc32.exeを使います。これもコマン
ドラインから起動します。

C:\>Brcc32 -32 Sample.rc
と打つと、
sample.RES
というファイルが作成されます。

これでリソースの作成はOKです。次に、アプリケーションでサンプルを作成し
ましょう。

「新規アプリケーション」を作成し、ボタンとEditボックスを置きます。そし
て、以下のようにプログラムを書きます。
--------------------------------------------------------------------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
{$R sample.RES}

{作成したsample.RESファイルを$Rオプションでリンクする}

procedure TForm1.Button1Click(Sender: TObject);
const
  EVENTLOG_SUCCESS          =     $0000;
  EVENTLOG_ERROR_TYPE       =     $0001;
  EVENTLOG_WARNING_TYPE     =     $0002;
  EVENTLOG_INFORMATION_TYPE =     $0004;
//#define CATEGOLY_ONE                     ((WORD)0x00000001L)
  CATEGOLY_ONE              =     $00000001;
//#define MSG_SAMPLE_SUCC                  ((WORD)0x00000000L)
  MSG_SAMPLE_SUCC           =     $00000000;
//#define MSG_SAMPLE_INFO                  ((WORD)0x40000001L)
  MSG_SAMPLE_INFO           =     $40000001;
//#define MSG_SAMPLE_WARN                  ((WORD)0x80000002L)
  MSG_SAMPLE_WARN           =     $80000002;
//#define MSG_SAMPLE_ERRO                  ((WORD)0xC0000003L)
  MSG_SAMPLE_ERRO           =     $C0000003;
{上記のConst宣言の値は、一緒に出力されたsample.hファイルを参照するこ
と。メッセージごとに値がすべて異なるので、注意。}
var
LogHandle:THandle;
  VersionInfo : TOSVersionInfo;
  RegisterName, eMsg: PChar;
begin
  VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
  if Windows.GetVersionEx( VersionInfo ) then begin
    if VersionInfo.dwPlatformId >= VER_PLATFORM_WIN32_NT then begin
      RegisterName := StrAlloc(10);
      try
        StrPCopy(RegisterName, 'project1');
        LogHandle := RegisterEventSource(nil, RegisterName);
        if Loghandle<>0 then begin
          eMsg := StrAlloc(Length(Edit1.Text)+1);
          try
            StrPCopy(eMsg, Edit1.Text);
            ReportEvent(LogHandle, EVENTLOG_SUCCESS, CATEGOLY_ONE,
MSG_SAMPLE_SUCC,
              nil, 1, 0, @eMsg, nil);
{ReportEventの引数は、カテゴリ1、成功で固定にしているが、たとえば
RadioGroupで成功、情報、警告、エラーを選択できるように変更してもよい}
            DeregisterEventSource(LogHandle);
          finally
            StrDispose(eMsg);
          end;
        end;
      finally
        StrDispose(RegisterName);
      end;
    end;
  end;
end;

end.
--------------------------------------------------------------------
これまで作成したファイルをすべて同じディレクトリに入れて下さい。例とし
て、
c:\Program Files\Borland\Delphi 3\Samples\EventLog
というディレクトリにいれます。

そして、コンパイルします。

次に、レジストリにキーを作成します。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog\Applicat
ion
の下に、
project1
というキーを作成します。そして、その中に
EventMessageFile  "C:\Program Files\Borland\Delphi 3\Samples\
EventLog\Project1.Exe"
TypesSupported  0x00000007(7)
という値を作成します。それぞれ、文字列とDWordです。

ちなみに、セキュリティの関係上、Administrator権限が無いとこのレジスト
リにキーを作成できません。

以上です。あとは、アプリケーションを実行し、エディットボックスに文字を
書きこんで、ボタンを押して下さい。

「イベントビューワ」「ログ」「アプリケーション」に文字が入ります。

サンプルは、Lib/13 「会議室企画サンプル」に登録しておきます。

//  「DELPHIでOOを実践する会」会員  兼 MES19のダークサイダー    //
//  E-Mail: abetaka@rose.ocn.ne.jp               //
                                                  KGC01133 りゅー

Original document by りゅー          氏 ID:(KGC01133)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum