现在做的项目中有这个功能,查了一整天才弄懂了点,没接触过,连资料也不好找。参照资料和自己所做的程序,写篇简易的文档。
写操作系统的日志文件
1.
以
MC
为扩
展名
创
建一个包含消息描述的文本文件。
该
文件的格式非常特
别,简单介绍一下
(
具体
细节
参
见
Platform SDK
文档
)
①
基本格式:
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
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="那句可以省略;
%1,%2等表示从ReportEvent传来的参数;
注意注释时";"与";//"的不同用法.mc编译器会忽略";"后面的字符,但会把他们写到*.h文件里.
③
如果支持多种语言,则如下定义
LanguageNames=(English=0x409:MSG00409)
LanguageNames=(Chinese=0x411:MSG00411)
MessageId=0x1
Severity=Error
Facility=Runtime
SymbolicName=MSG_BAD_COMMAND
Language=English
You have chosen an incorrect command.
Language=Chinese
.
④
文件必须以一个空行结束,即在最后一个信息定义块的 '
.'
后加回车换行
2.
使用
mc
编译此文件
.
①
mc.exe
是
VC
带的工具
(
我装了
.NET
)
,路径
参考
:
C:/Program Files/Microsoft Visual Studio .NET 2003/Common7/Tools/Bin
②
进
dos
,使用
mc
编译文件。如果你的项目使用
UNICODE
,如下:
mc myevt.mc
;否则必须加入命令选项:
mc myevt.mc -A
。将生成的三个文件
myevt.rc myevt.h MSG00804.bin
。
3
.制作好这三个文件之后。制作
DLL
。(只用过通过制作
DLL
的方法来写
log
,所以只记录这方面内容。)
用
vc
生成一个空
win32dll
框架
,
将生成的三个文件
加
进
来
编译。得到一个
DLL
文件。
4.
在注册表中添加自己的键:
HKEY_LOCAL_MACHINE
/SYSTEM/CurrentControlSet/Services/EventLog/Application/
myevt
(自定)
,
设上值:
d:/
myevt
.dll
(
DLL
文件位置),可用
API
函数(
RegCreateKeyEx
,
RegSetValueEx
)。
5.
用
RegisterEventSource(
NULL,"
myevt
"
)
打开事件源,返回一句柄,然后以此句柄
ReportEvent
,即完成日志的写入。可在事件管理器中察看:右键我的电脑
→
管理
→
系统工具
→
事件视图。具体事件是属于“应用程序”,“系统”还是“安全”,则看
ReportEvent
时的参数了。
介绍完毕,非常混乱,附上自己做的实例,希望对大家有所帮助:
附录:
Ⅰ.mc
文件:
MyEvent.mc
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
;//begin==============================================================
;#ifndef __ERRLOG_H__
;#define __ERRLOG_H__
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_ERR_LOG_FAILED
Language=
Chinese
●
错误输出的内容是
:「%1」.
●
错误的原因是
:「%2」.
.
;#endif //__ERRLOG_H__
;//end================================================================
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
Ⅱ.
程序
#define
KEY_NAME _T("Acr_ErrLog")
/* Key
名
*/
#define
EVENT_ID 1000
/*
事件
ID
*/
#define
ENTRY _T("EventMessageFile") /*
子键
*/
#define
REG_PATH _T("SYSTEM//CurrentControlSet//Services//EventLog/
//Application//
My_Event
")
/*
注册表路径
*/
static
int
RegSet()
;
Main()
{
char
szTempMsg
[10] =
“
文件打开出错
”
;
char
szErr
[10] =
“
没有权限
”
;
if
( ACR_RET_NORMAL == RegSet() )
{
WriteEventLog( szTempMsg, szErr );
}
}
/*
参照上面说明
4
:在注册表中添加自己的键,
设上值
*/
int
RegSet()
{
HKEY hkKey;
LONG lResult; /*
返回值
*/
DWORD dwDisposition; /*
Key
是否已经存在的标志
*/
char szFilePath[MAX_PATH]; /*
DLL
文件的位置
*/
/*
打开指定的注册表
Key
,如果
Key
不存在的话新建一个
。
*/
lResult = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
REG_PATH,
/*
参照
define */
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkKey,
&dwDisposition );
if( lResult )
{
return ACR_RET_SYSERROR;
}
/* DLL
文件路径取得
*/
GetAppPath( szFilePath );
strcat( szFilePath, _T("//") );
strcat( szFilePath, _T("
MyEvent
.dll
") );
/* 指定されたレジストリキーに所属する、
指定されたレジストリエントリのデータを設定します。 */
if( ERROR_SUCCESS != RegSetValueEx( hkKey,
ENTRY,
/*
参照
define */
0,
REG_EXPAND_SZ,
(LPBYTE)szFilePath,
(DWORD)_tcslen( szFilePath )+1) )
{
return ACR_RET_SYSERROR;
}
RegCloseKey( hkKey );
return ACR_RET_NORMAL;
}
/*
功能参照上面说明
5
。参数为要写入日志的内容,
1
为错误内容,
2
是错误原因
*/
void
WriteEventLog( char* szMsg, char* szErr )
{
HANDLE hEventLog;
char *szEventLogArgs[2]; /*
写入的内容
*/
/*
内容处理
*/
if( NULL != szMsg )
{
szEventLogArgs[0] = szMsg;
}
else
{
szEventLogArgs[0] = _T("NULL");
}
if( NULL != szErr )
{
szEventLogArgs[1] = szErr;
}
else
{
szEventLogArgs[1] = _T("NULL");
}
/*
打开事件源
*/
hEventLog = RegisterEventSource( NULL, KEY_NAME );
if( NULL != hEventLog )
{
/*
内容写入
*/
ReportEvent( hEventLog,
EVENTLOG_INFORMATION_TYPE,
0,
SPCM030_EVENT_ID,
NULL,
2,
0,
szEventLogArgs,
NULL );
}
DeregisterEventSource(hEventLog);
}