我正在制作一个程序,它从 C++ 中的 Windows EventLog 文件 (.evt) 读取和存储数据。我正在使用调用OpenBackupEventLog(ServerName, FileName)和ReadEventLog(...)。也使用这个:PEVENTLOGRECORD
无论如何,在不提供所有代码的情况下,基本思想如下:
1. 我使用 OpenBackupEventLog() 获取 .evt 文件的句柄并传入文件名。
2. 然后我使用 ReadEventLog() 用未知数量的 EventLog 消息填充缓冲区。
3. 我遍历缓冲区并将每条消息添加到向量
4. 我不断填充缓冲区(重复步骤 2 和 3)直到到达文件末尾。
这是我填充向量的代码:
vector<EVENTLOGRECORD> allRecords;
while(_status == ERROR_SUCCESS)
{
if(!ReadEventLog(...))
CheckStatus();
else
FillVectorFromBuffer(allRecords)
}
// Function FillVectorFromBuffer
FillVectorFromBuffer(vector(EVENTLOGRECORD) &allRecords)
{
int bytesExamined = 0;
PBYTE pRecord = (PBYTE)_lpBuffer; // This is one of the params in ReadEventLog()
while(bytesExamined < _pnBytesRead) // Another param from ReadEventLog
{
EVENTLOGRECORD currentRecord = (EVENTLOGRECORD)(pRecord);
allRecords.push_back(currentRecord);
pRecord += currentRecord->Length;
bytesExamined += currentRecord->Length;
}
}
无论如何,每当我运行它时,它都会获取文件中的所有事件日志,并且向量将拥有我想要的一切。但只要这一行:
如果(!ReadEventLog())
被调用并返回 true(又名 ReadEventLog() 返回 false),然后我的向量中的每个字段都设置为零。
该向量仍将包含正确数量的元素,只是 PEVENTLOGRECORD 结构中的所有字段现在都为零。
有更好调试经验的人有什么想法吗?
谢谢。
编辑:我已经按照 Michael Burr 的建议更新了代码。上面的代码现在消除了我原来遇到的问题。
编辑 2:解决 Michael Burr 的其他建议:由于 EVENTLOGRECORD 的可变部分,我将制作一个自定义结构,其中包含 EVENTLOGRECORD 以及我感兴趣的一些其他变量:
struct CustomRecord
{
EVENTLOGRECORD recordHeader;
string sourceName;
string computerName;
string message;
};
提取可变部分并非易事,但这里有一个很好的示例可以帮助您入门: Querying for Event Information