24小时热门版块排行榜    

查看: 142  |  回复: 0
当前主题已经存档。

zsglly

木虫 (著名写手)

[交流] 如何读写WINDOWS2000的日志

一些大型应用程序会把他们的一些事件写到日志里面去,比如sql server,norton,iis等.我google了一下,
网上关于这方面的资料并不是很完整,于是整理加工了一下. 下面是我看msdn,用google及自己摸索得到的一点
体会,共享.

一.注册事件源.(需以administrator登陆本机才行)
你需要为你的应用程序注册一个事件源,以表明那些是属于你应用程序的事件.    HKEY hk;
ULONG disposition, allowed;
char szName[256];
strcpy(szName,"SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Application\\";
strcat(szName,"CMCard";
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,szName,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
NULL,&hk,&disposition))//为事件源建一个键
{   
printf("Unable to create registry key";
     return;
}
strcpy (szName,"%SystemRoot%\\System\\MYDLL.DLL";
if(RegSetValueEx(hk,"EventMessageFile",0,REG_EXPAND_SZ,(LPBYTE)szName,strlen(szName)+1))
{//为事件源指定一个解释事件的事件dll.
printf("Unable to create/set registryvalue (message DLL name)";
return;
}
allowed=EVENTLOG_ERROR_TYPE|EVENTLOG_WARNING_TYPE|EVENTLOG_INFORMATION_TYPE;
if (RegSetValueEx(hk,"TypesSupported",0,REG_DWORD,(LPBYTE)&allowed,sizeof(DWORD)))
{//为事件源指定类型
printf("Unable to create/set registry value (message types)";
return;
}
RegCloseKey(hk);

二.编写事件dll.(用于解释事件id表示的内容)
用mc.exe(vc自带)编译一个*.mc文件,生成*.h,*.rc,*.bin,再用他们生成一个资源dll(用vc生成一个空
win32dll框架,把他们加进来编译),放system目录下.
下面是一个mc文件的样板:;//begin==============================================================
;#ifndef __CMCARD_H__
;#define __CMCARD_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_CARD_STATUS_OK
Language=Chinese
CMCard的状态良好.
.

MessageId=1001 Severity=Success SymbolicName=CM_CARD_STATUS_BED
Language=Chinese
CMCard出错了,原因可能是%1.
.

;#endif  //__CMCARD_H__
;//end================================================================

说明:默认的语言是英语,此时"LanguageNames="那句可以省略;
%1表示从ReportEvent传来的参数;
注意注释时";"与";//"的不同用法.mc编译器会忽略";"后面的字符,但会把他们写到*.h文件里.

三.写日志的方法. //vc
BOOL syslog(DWORD dwID,char*str,WORD wType)//参数:事件id;事件附加信息;事件类型
{
HANDLE hd=RegisterEventSource(NULL,"CMCard";//指定/打开事件源
char* buff[1];
buff[0]=str;
int i;
if(hd){
i=ReportEvent(hd,wType,0,dwID,NULL,1,0,(LPCTSTR*)buff,NULL);//写日志
DeregisterEventSource(hd);//关闭事件源
if(i)return TRUE;
}
return FALSE;
}
''vb
Private Declare Function ReportEvent Lib "advapi32" Alias "ReportEventA" (ByVal hEventLog As Long, _
    ByVal wType As Long, ByVal wCategory As Long, ByVal dwEventID As Long, ByVal lpUserSid As Long, _
    ByVal wNumStrings As Long, ByVal dwDataSize As Long, lpStrings As Any, lpRawData As Any) As Long
''注意这个声明,与api text viewer的是不同的.注意As Any的妙用.
Function sysLog(byval lngID as long,byval strMsg As String,byval lngType as long) As Boolean
    Dim hd As Long
    Dim ret As Integer
    hd = RegisterEventSource("", "CMCard"
    If hd <> 0 Then
        ret = ReportEvent(hd, lngType, 0, lngID, 0&, 1, 0, strMsg, 0)
        DeregisterEventSource hd
    End If
    If ret <> 0 Then
        sysLog = True
    Else: sysLog = False
    End If
End Function

四 .读日志的例子. void CEventDlg::OnButton3()  
{//参考http://www.codeproject.com/system/sysevent.asp
HANDLE hdle;
EVENTLOGRECORD *ptr;
BYTE buff[4096];
DWORD read_len, next_len;
ptr=(EVENTLOGRECORD *)&buff;
hdle=OpenEventLog("", "Application";// System
if (hdle==NULL)
{
MessageBox("打开日志失败";
}
else  
{
long mRet;
char lpszSourceName[255]={0};
char lpszComputerName[255]={0};
unsigned uStepOfString;
char* pStrings;
char szExpandedString[1024]={0};
while(ReadEventLog(hdle,EVENTLOG_FORWARDS_READ|EVENTLOG_SEQUENTIAL_READ,
1,ptr,sizeof(buff),&read_len,&next_len))  
{
mRet=ptr->EventID;//事件id
mRet=ptr->EventType;//事件类型
mRet=ptr->TimeWritten;//
mRet=ptr->NumStrings;//
mRet=ptr->Length;//
mRet=sizeof(EVENTLOGRECORD);
strcpy(lpszSourceName, (LPTSTR)((LPBYTE)ptr +mRet));//事件源
mRet+= strlen(lpszSourceName) + 1;
strcpy(lpszComputerName, (LPTSTR)((LPBYTE)ptr + mRet));//机器名
mRet+= strlen(lpszComputerName) + 1;
if(ptr->UserSidLength>0){;}//
mRet=ptr->DataOffset-ptr->StringOffset;
if(mRet>0)//事件描述
{
pStrings=new char[mRet];
memcpy(pStrings,(LPBYTE)ptr+ptr->StringOffset,mRet);
uStepOfString=0;
for(int x=0;xNumStrings;x++)
{
if(x==0)
{
strcpy(szExpandedString, (TCHAR *)pStrings + uStepOfString);
if(x<(UINT)ptr->NumStrings - 1)strcat(szExpandedString, ",";
}
else strcat(szExpandedString, pStrings + uStepOfString);
uStepOfString = strlen(pStrings + uStepOfString) + 1;
}
delete [] pStrings;
}
MessageBox(lpszSourceName,szExpandedString);
}
CloseEventLog(hdle);
}
}
五.源代码的使用与运行结果
本文附带的示例工程对WIN2K日志的读写进行了演示,使用时先编译mydll,并拷贝到system目录下,然后编译event工程。运行结果可以使用事件查看器查看:


假如在指定的位置没有找到mydll,则会显示:

事件 ID ( 1001 )的描述(在资源( CMCard )中)无法找到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远端计算机显示消息。部分事件包含了下列信息: king_koo
Hello!.

六.后记

以上演示了读写win2k日志的基本方法,重在应用.想知道更理论/更详尽的东西,就只有再认真研究msdn了.
另:读日志好麻烦,谁知道更简捷的方法麻烦告诉我一声.欢迎指点/批评(king_koo@163.net)

[ Last edited by 幻影无痕 on 2006-11-29 at 07:42 ]
回复此楼

» 猜你喜欢

做人要厚道啊!厚道啊!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zsglly 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 一志愿武理085500机械专业总分300求调剂 +3 an10101 2026-03-24 7/350 2026-03-25 00:00 by 山鬼0-
[考研] 0805 316求调剂 +6 大雪深藏 2026-03-18 6/300 2026-03-24 22:13 by peike
[考研] 340求调剂 +4 话梅糖111 2026-03-24 4/200 2026-03-24 21:41 by yuyu98412
[考研] 材料与化工考研调剂 +7 孅華 2026-03-22 7/350 2026-03-24 21:04 by greychen00
[考研] 求调剂323材料与化工 +3 1124361 2026-03-24 3/150 2026-03-24 20:24 by peike
[考研] 一志愿北化315 求调剂 +3 akrrain 2026-03-24 3/150 2026-03-24 19:35 by 了了了了。。
[考研] 资源与环境 调剂申请(333分) +7 holy J 2026-03-21 7/350 2026-03-24 17:24 by xiaohai104
[考研] 307求调剂 +5 超级伊昂大王 2026-03-24 5/250 2026-03-24 15:46 by 星空星月
[材料工程] 一志愿C9材料与化工专业总分300求调剂 +4 曼111 2026-03-24 5/250 2026-03-24 15:44 by 星空星月
[考研] 一志愿河北工业大学0817化工278分求调剂 +7 jhybd 2026-03-23 12/600 2026-03-24 09:03 by jhybd
[考研] 一志愿中南大学化学学硕0703总分337求调剂 +5 niko- 2026-03-22 5/250 2026-03-23 22:01 by fuyu_
[考研] 一志愿武理材料工程348求调剂 +6  ̄^ ̄゜汗 2026-03-19 9/450 2026-03-23 19:53 by pswait
[考研] 寻找调剂 +4 倔强芒? 2026-03-21 4/200 2026-03-22 16:14 by 木托莫露露
[考研] 319求调剂 +4 小力气珂珂 2026-03-20 4/200 2026-03-22 15:53 by ColorlessPI
[考研] 336求调剂 +5 rmc8866 2026-03-21 5/250 2026-03-21 17:24 by 学员8dgXkO
[考研] 299求调剂 +5 shxchem 2026-03-20 7/350 2026-03-21 17:09 by ColorlessPI
[考研] 0805材料320求调剂 +3 深海物语 2026-03-20 3/150 2026-03-21 15:46 by 无际的草原
[考研] 22 350 本科985求调剂,求老登收留 +3 李轶男003 2026-03-20 3/150 2026-03-21 13:28 by 搏击518
[考研] 材料学学硕080502 337求调剂-一志愿华中科技大学 +4 顺顺顺mr 2026-03-18 5/250 2026-03-21 10:22 by luoyongfeng
[考研] 华东师范大学-071000生物学-293分-求调剂 +3 研究生何瑶明 2026-03-18 3/150 2026-03-21 01:30 by JourneyLucky
信息提示
请填处理意见