通过NotifyChangeEventLog获取到最新的日志事件句柄hEvent后,如何通过这个句柄来获得事件的具体信息呢?或者有其它好的办法也可以,谢谢!

解决方案 »

  1.   

    1、利用NotifyChangeEventLog   函数,可满足实时读日志文件的需求。   
      2、在实时处理线程函数的内部读取新增日志、完成数据统计。   
      3、以下范例   
        
      //==1==声明全局变量、函数   
      void   _ExecuteThread(CXXXDlg*   pcMF);   
      HANDLE   g_hExecuteThread;   
      HANDLE   g_hEventLog;   
      HANDLE   m_hGlobalEvent;     
        
      //==2==调用NotifyChangeEventLog   函数,同时启动处理线程   
      void   CXXXDlg::OnOK()     
      {   
          DWORD   dwThreadID=0;   
          //   Open   the   System   event   log.     
          g_hEventLog   =   OpenEventLog(   NULL,"System");   
          if   (g_hEventLog   ==   NULL)     
          {   
              AfxMessageBox("Could   not   open   the   System   event   log.");     
              return   ;   
          }   
        
          m_hGlobalEvent   =   CreateEvent(     
                      NULL,   
                      TRUE,   
                      FALSE, //   initial   state   is   unsignaled   
                      "GlobalEvent" //   object   name   
                      );     
          if   (m_hGlobalEvent   ==   NULL)     
          {     
              AfxMessageBox("Eevent   create   failed.");     
              return   ;                 
          }   
        
          NotifyChangeEventLog(g_hEventLog,m_hGlobalEvent);   
        
          g_hExecuteThread   =   ::CreateThread(   
      NULL,   0,     
      (LPTHREAD_START_ROUTINE)_ExecuteThread,     
      this,   0,   &dwThreadID); //Start   thread     
          // CDialog::OnOK();   
      }   
      //==3==线程函数如下   
      void   _ExecuteThread(CEventLogDemoDlg*   pcMF)   
      {   
          DWORD   dwWaitResult;     
          while   (1)   
          {   
              dwWaitResult   =   WaitForSingleObject(m_hGlobalEvent,INFINITE);   
              switch   (dwWaitResult)     
              {   
                  case   WAIT_OBJECT_0:     
                  {   
      //==   
      AfxMessageBox("I   got   it!   ");   
      ResetEvent(m_hGlobalEvent);   
      //==   
                  }   
                  break;     
              case   WAIT_TIMEOUT:     
                  //CloseEventLog(g_hEventLog);     
                  //CloseHandle(...);   
                  return   ;     
              case   WAIT_ABANDONED:     
                  //CloseEventLog(g_hEventLog);     
                  //CloseHandle(...);   
                  return   ;     
              }   
          }   
      }