我想写一个实时读取Win2k Server系统日志的程序,主要是读取网络用户打印的信息,该Server是我公司的打印服务器,公司为了成本考虑,要统计用户打印的内容和数量。怎样实现比较方便,请高手指教!如解决,给分不是问题!!!
谢谢!

解决方案 »

  1.   

    用.net framework,有专门的系统日志处理类,很方便.
      

  2.   

    /* Write to event log. */
    ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
    DeregisterEventSource(hEventSource);
      

  3.   

    to Ah:
    我主要是想实时读日志文件,不需要写,请问这样可行吗?
    日志文件的格式是不是二进制?
    还有怎样知道Win2k的日志更新了?通过Windows消息还是函数?
    谢谢!
      

  4.   

    HANDLE OpenEventLog(
      LPCTSTR lpUNCServerName,  // server name
      LPCTSTR lpSourceName      // file name
    );BOOL ReadEventLog(
      HANDLE hEventLog,                // handle to event log
      DWORD dwReadFlags,               // how to read log
      DWORD dwRecordOffset,            // offset of first record
      LPVOID lpBuffer,                 // buffer for read data
      DWORD nNumberOfBytesToRead,      // bytes to read
      DWORD *pnBytesRead,              // number of bytes read
      DWORD *pnMinNumberOfBytesNeeded  // bytes required
    );BOOL ClearEventLog(
      HANDLE hEventLog,          // handle to event log
      LPCTSTR lpBackupFileName   // name of backup file
    );BOOL NotifyChangeEventLog(
      HANDLE hEventLog,  // handle to event log
      HANDLE hEvent      // handle to event object
    );
      

  5.   

    还有啊
    更多的相关API可以查MSDN
      

  6.   

    有MFC的源码例子吗?
    哪位高手帮帮忙!
      

  7.   

    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 ; 
        }
      }
    }
      

  8.   

    To bager:
    谢谢,我现在可以读出日志的ID,TYPE,Catogory,
    但不能读出日志的具体内容,即Data,
    MS的EVENTLOGRECORD的结构中是这样的:
    typedef struct _EVENTLOGRECORD { 
        DWORD  Length; 
        DWORD  Reserved; 
        DWORD  RecordNumber; 
        DWORD  TimeGenerated; 
        DWORD  TimeWritten; 
        DWORD  EventID; 
        WORD   EventType; 
        WORD   NumStrings; 
        WORD   EventCategory; 
        WORD   ReservedFlags; 
        DWORD  ClosingRecordNumber; 
        DWORD  StringOffset; 
        DWORD  UserSidLength; 
        DWORD  UserSidOffset; 
        DWORD  DataLength; 
        DWORD  DataOffset; 
        // 
        // Then follow: 
        // 
        // TCHAR SourceName[] 
        // TCHAR Computername[] 
        // SID   UserSid 
        // TCHAR Strings[] 
        // BYTE  Data[] 
        // CHAR  Pad[] 
        // DWORD Length; 
        // 
    } EVENTLOGRECORD; 
    有//的是什么意思,好象不能利用!
    读到内存的日志是不是二进制的?
    请指教!
      

  9.   

    我主要是统计Print事件里的信息。
    Print事件在注册表里是这样注册的:
    [EventMessageFile]
    SystemRoot%\System32\LocalSpl.dll;%SystemRoot%\System32\sp3res.dll
    能不能用上面的.dll去处理用ReadEventLog()读出的事件。
    应该用哪一个.dll文件?
    有代码参考吗?为公司解决问题,分数不是问题!
    问题解决后大送分!!!
    谢谢!!!
      

  10.   

    这两个文件都有可能用到,其具体内容你可以通过Reshacker工具查看(查看资源树中的消息框节点)