首页  编辑  

利用Event Log

Tags: /超级猛料/API.Windows应用程序接口/其他相关/   Date Created:

最简单的一个函数了:

function WriteEventLog ( const FromApp , Msg : string ; const EventID : DWORD = 0 ; const EventLog_Type : Word = 4 ): Boolean ;

{

Windows Event Log

}

var

 EHwnd : THandle ;

 Buffer : Pchar ;

begin

 Result := False ;

 EHwnd := RegisterEventSource ( nil , PChar ( FromApp ));

  if EHwnd = 0 then exit ;

 Buffer := pchar ( Msg );

 Result := ReportEvent ( EHwnd , EventLog_Type , 0 , EventID , nil , 1 , 0 , @ Buffer , nil );

 DeregisterEventSource ( EHwnd );

end ;

function RegisterEventlogSource ( const FromApp , ResourceFile : string ): Boolean ;

begin

 Result := RegWriteInteger ( HKEY_LOCAL_MACHINE , 'SYSTEM\CurrentControlSet\Services\Eventlog\Application\' + FromApp ,

                  'TypesSupported' , 7 )

            and RegWriteString ( HKEY_LOCAL_MACHINE , 'SYSTEM\CurrentControlSet\Services\Eventlog\Application\' + FromApp ,

                  'EventMessageFile' , ResourceFile );

end ;

调用演示:

procedure TForm1.FormCreate(Sender:TObject);

begin

 WriteEventLog(Application.Title,'Load Program');

end;

如果直接使用,在事件查看器中,会添加一大段的无用废话:

事件 ID ( 0 )的描述(在资源( MyAPP )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远端计算机显示消息。您可能可以使用 /AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。

如果要去掉这些,必须注册消息源:

注册表下面必须注册HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application下建立一个主键,并在其下建立EventMessageFile和TypesSupported,TypesSupported为DWORD值,默认可以设置为7,即包含Error、Warrning、Information三种类型的信息。EventMessageFile为消息文件,该文件必须包含一个消息表,其中每一个消息有一个ID,该ID和EventID对应!

消息表格式如下:

用mc.exe(vc自带)编译一个*.mc文件,生成*.h,*.rc,*.bin,再用他们生成一个资源dll(用vc生成一个空

win32dll框架,把他们加进来编译),放system目录下.

下面是一个mc文件的样板:;

//begin==============================================================

/// 语言

LanguageNames=(Chinese=2052:MSG0052)

SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS

              Informational=0x1:STATUS_SEVERITY_INFORMATIONAL

              Warning=0x2:STATUS_SEVERITY_WARNING

              Error=0x3:STATUS_SEVERITY_ERROR

             )

/// 一个消息定义

MessageId=1000

Severity=Success

SymbolicName=CM_CARD_STATUS_OK

Language=Chinese

在这里编写你的消息!

.

/// 一个消息定义

MessageId=1001

Severity=Success

SymbolicName=CM_CARD_STATUS_BED

Language=Chinese

在这里编写你的消息

.

;//end================================================================

说明:默认的语言是英语,此时"LanguageNames="那句可以省略;

%1表示从ReportEvent传来的参数;

注意注释时";"与";//"的不同用法.mc编译器会忽略";"后面的字符,但会把他们写到*.h文件里.

编写完成后,执行如下命令行,得到 Delphi 可使用的资源文件 McMsgs.res

  mc McMsgs.mc

  brc32 -r -foMcMsgs.res -v -32 McMsgs.rc

 然后在项目的单元中加入 {$R McMsgs.res} 就可以了。

如果你想偷懒,不做这些工作,可以把你的程序的消息DLL注册为msi.dll,并把EventID设置为1000即可。