最简单的一个函数了:
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即可。