使用EventLog并非很容易的事。
需要以下几个步骤:
- 创建MessageFile(以.mc为扩展名的文本文件);格式有严格的规定
- 基本格式:MessageId=xxx
SymbolicName=IDS_EVT_MYDEFINE
Language=English
mydefine event string goes here.if there's parameters use %1 %2...
.
//must use . to end one event message define.
MessageId=xxx//next block...
.
- 如果使用中文,在文件最初定义
LanguageNames=(Chinese=0x804:MSG00804)//0x804为CodePage,MSG00804为定义文件名称(mc输出的.bin文件)。然后替换基本格式中的Language字段,如下Language=Chinese
- 如果支持多种语言,则如下定义:
LanguageNames=(English=0x409:MSG00409)
LanguageNames=(Japanese=0x411:MSG00411)
MessageId=0x1
Severity=Error
Facility=Runtime
SymbolicName=MSG_BAD_COMMAND
Language=English
You have chosen an incorrect command.
Language=Japanese
正しくないコマンド選択がされました。
.
- 文件必须以一个空行结束,即在最后一个信息定义块的.后加回车换行。
- 使用mc编译此文件,如果你的项目使用UNICODE,如下:mc myevt.mc;否则必须加入命令选项:mc myevt.mc -A。将生成的三个文件myevt.rc myevt.h MSG00804.bin拷贝到项目目录下。
- 在项目的资源文件MyProj.rc中加入#include "myevt.rc",在项目头文件MyProj.h中加入#include "myevt.h"。
- 在注册表中加入如下项:
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/EventLog/Application
项:MyProj
键:EventMessageFile REG_EXPAND_SZ,值:D:/MyProj/MyProj.Exe (你的应用程序路径)
键:TypeSupported REG_DWORD,值1(你编译过的资源文件中的序号)
- 在项目文件中使用EventLog的地方如下调用:
HANDLE h;
h = RegisterEventSource(
NULL,
// uses local computer
TEXT("SamplApp")); // source name
if (h == NULL)
ErrorExit("Could not register the event source.");
if (!ReportEvent(
h, // event log handle
EVENTLOG_ERROR_TYPE, // event type
0, // category zero
IDS_EVT_MYDEFINE, // event identifier 这里是myevt.h中定义的事件ID
NULL, // no user security identifier
1, // one substitution string
0, // no data
szMsg, // pointer to string array,
// 如果IDS_EVT_MYDEFINE中包含%1 2 3...将使用此数组填充
NULL)) // pointer to data
ErrorExit(TEXT("Could not report the event."));
DeregisterEventSource(h);
- 当然,仅仅进行第5步即可在EventLog中输出信息,但是,信息将如下显示:
事件 ID ( 0 )的描述(在资源( MyProj )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远端计算机显示消息。您可能可以使用 /AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。下列信息是事件的一部分: xxxxxx。
这样看起来很不舒服,如果是商用软件,这是不可接受的。
- 另外,资源也可以在一个DLL中实现,更改注册表相应项EventMessageFile即可。
更多的关于使用MC的信息参见:
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/tools/tools/about_message_text_files.htm