我想写一个实时读取Win2k Server系统日志的程序,主要是读取网络用户打印的信息,该Server是我公司的打印服务器,公司为了成本考虑,要统计用户打印的内容和数量。怎样实现比较方便,请高手指教!如解决,给分不是问题!!!
谢谢!
谢谢!
解决方案 »
- 问个关于BASS库的问题
- 请教一下:基于mfc的对话框程序里,用了一个树形控件CTreeCtrl,能否对每个结点设置属性:比如有的结点只允许修改名称,有的结点修改后弹出对话框来修改参数
- 遇到一个奇怪的问题?
- DBGrid打包问题
- 如何向dll动态库中传递一个结构体数组为参数(在线等待)
- WM_DRAWITEM消息不能起作用
- _cdecl是不是这个英文declare, 它与_stdcall又和区别?
- 拿到个Offer
- ticks,tickcount()????(50分送!!)
- 请教一个组件(COM)的问题,非常急!
- 用了ActiveSkin换了皮肤的程序,怎样才能在没有安装过该软件的系统上运行?
- 关于写文件!在线等!!
ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
DeregisterEventSource(hEventSource);
我主要是想实时读日志文件,不需要写,请问这样可行吗?
日志文件的格式是不是二进制?
还有怎样知道Win2k的日志更新了?通过Windows消息还是函数?
谢谢!
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
);
更多的相关API可以查MSDN
哪位高手帮帮忙!
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 ;
}
}
}
谢谢,我现在可以读出日志的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;
有//的是什么意思,好象不能利用!
读到内存的日志是不是二进制的?
请指教!
Print事件在注册表里是这样注册的:
[EventMessageFile]
SystemRoot%\System32\LocalSpl.dll;%SystemRoot%\System32\sp3res.dll
能不能用上面的.dll去处理用ReadEventLog()读出的事件。
应该用哪一个.dll文件?
有代码参考吗?为公司解决问题,分数不是问题!
问题解决后大送分!!!
谢谢!!!