收录日期:2020/10/28 11:20:35 时间:2016/07/04 16:42:39 标签:基础类
下面是一个读取系统日志的例子,我有些看不懂。其中long mRet什么意思??~为什么能把结构里面的值附给一个long型??
我觉得很奇怪!~~我从“while(ReadEventLog(hdle,EVENTLOG_FORWARDS_READ|EVENTLOG_SEQUENTIAL_READ,
                        1,ptr,sizeof(buff),&read_len,&next_len)) "之后不是很看得懂能否谁帮我解释下!!
        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)) 
                {
                        [color=#FF0000]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;x<ptr->NumStrings;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);
        }
}
“结构里面的值”就是变量,当然可以赋给其它变量。
UP!
问题是这里面的值不断的付给mRet..mRet里面的内容不是被修改了么?
up
这只是一段示例代码,告诉你如何取记录中的各项内容。
mRet=ptr->EventType;//事件类型 
mRet=ptr->TimeWritten;// 
mRet=ptr->NumStrings;// 
mRet=ptr->Length;// 
这几行就表示取出了EventType、TimeWritten、NumStrings、Length,没有实际意义。
up,结构体里的值就是变量。

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)) //此时ptr中已经有第一条Application的日志

mRet=ptr->EventID;//事件id 
mRet=ptr->EventType;//事件类型 
mRet=ptr->TimeWritten;// 
mRet=ptr->NumStrings;// 
mRet=ptr->Length;// 
//以上6句为无用操作
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); //将事件描述复制到pStrings中
uStepOfString=0; 
for(int x=0;x <ptr->NumStrings;x++) 
{ //将事件描述拼接到szExpandedString中
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; //释放new的空间

MessageBox(lpszSourceName,szExpandedString); //用MessageBox将日志内容显示出来,接着读下一条日志

CloseEventLog(hdle); //关闭日志句柄

/*
ReadEventLog读的缓冲区是这样的,我以"|"进行分割,"|"实际并不存在:
| EVENTLOGRECORD | 事件源 | \0 | 机器名 | \0 | ... | 事件描述 | ...

 */
strcpy(lpszSourceName, (LPTSTR)((LPBYTE)ptr +mRet));//事件源

其中的(LPTSTR)((LPBYTE)ptr +mRet)这句话应该是eventlogrecord结构体以后的地址是事件原的名字,那么为什么之后的读取字符会自动停止?是因为碰到了\0是么??
strcpy(lpszSourceName, (LPTSTR)((LPBYTE)ptr +mRet));//事件源
这句话的意思是自己是这样理解的。。在ptr开头的地址+ eventlogrecord地址之后开始读取事件源,系统把字符指针指向这里,然后开始读取并且复制给lpzsourcename...
引用 9 楼 etdzheng 的回复:
strcpy(lpszSourceName, (LPTSTR)((LPBYTE)ptr +mRet));//事件源
这句话的意思是自己是这样理解的。。在ptr开头的地址+ eventlogrecord地址之后开始读取事件源,系统把字符指针指向这里,然后开始读取并且复制给lpzsourcename...

是这样的,一直遇到0为止。参见我上面的

 | EVENTLOGRECORD | 事件源 | \0 | 机器名 | \0 | ... | 事件描述 | ...
该回复于2008-07-30 00:36:41被版主删除
这只是一段示例代码,告诉你如何取记录中的各项内容。 
mRet=ptr->EventType;//事件类型 
mRet=ptr->TimeWritten;// 
mRet=ptr->NumStrings;// 
mRet=ptr->Length;// 
这几行就表示取出了EventType、TimeWritten、NumStrings、Length,没有实际意

对于没有 .dsp 和 .dsw 的VC工程如何编译? ViewPoint.问题 请问各位高手;用JFreeChart作柱图时,怎样设置柱的宽度? 谁写过象这个页面的程序呀? 数据库管理系统与操作系统之间的关系是什么? 空间申请问题 关于nokia的多边形和三角型为和显示不出来的问题。 如何利用3DMAX和Viewpoint虚拟现实技术制作一个产品模型,其过程是什么? 请教关于串口通讯的问题 原代码急要。在线求购!!!!! \"到达文件尾\"错误如何解决?? 出了点问题,在线等 关于仿真的问题 dll错在那里?高分相送 vb+activereports2.0 一个超级得意的问题!! aspnet_wp.exe的问题。急啊! 高人救命,richedit保存到sqlsever数据库出错!!! JBuilderX+Tomcat4.1建立简单的J2EE程序,求助? 菜鸟问题:如何得到当前数据库的名称? 请问怎样用jar命令生成双击就可以执行的JAVA程序 SQL Server里的CHARINDEX,Access里用什么来代替? 怎样自定义listbox中选中的颜色???? VC编写的动态链接库如何在C++Builder中使用? SAPI初學者的問題 如何在不使用MFC的程序里跟踪语句输入到指定的文件? 使用框架后,如何退出 怎样在OnBeforeNavigate2 中设置htmlview运行的http代理? RMI和EJB都能够远程调用吗?如果能够,那么他们有什么区别? 史济民的vfp教材有问题?