分享
 
 
 

如何读写WINDOWS2000的日志

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

如何读写WINDOWS2000的日志

作者:king_koo

下载本文示例工程

一些大型应用程序会把他们的一些事件写到日志里面去,比如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-UserSidLength0){;}//

mRet=ptr-DataOffset-ptr-StringOffset;

if(mRet0)//事件描述

{

pStrings=new char[mRet];

memcpy(pStrings,(LPBYTE)ptr+ptr-StringOffset,mRet);

uStepOfString=0;

for(int x=0;x<ptr-NumStrings;x++)

{

if(x==0)

{

strcpy(szExpandedString, (TCHAR *)pStrings + uStepOfString);

if(xNumStrings - 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)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有