Я делаю программу, которая читает и сохраняет данные из файлов Windows EventLog (.evt) в C ++. Я использую вызовы OpenBackupEventLog (ServerName, FileName) и ReadEventLog (...) . Также используя это: PEVENTLOGRECORD
В любом случае, без предоставления всего кода, вот основная идея:
1. Я получаю дескриптор к файлу .evt, используя OpenBackupEventLog () и передавая имя файла.
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;
}
}
В любом случае, всякий раз, когда я запускаю это, он получает все EventLogs в файле, и вектор будет иметь все, что я хочу. Но как только эта строка:
if(!ReadEventLog())
вызывается и возвращает истину (aka ReadEventLog () возвращает ложь), тогда каждое поле в моем векторе устанавливается в ноль.
Вектор по-прежнему будет содержать правильное количество элементов, просто все поля в структуре PEVENTLOGRECORD теперь равны нулю.
Кто-нибудь с лучшим опытом отладки имеет какие-либо идеи?
Спасибо.
Редактировать: я обновил код в соответствии с предложением Майкла Берра. Приведенный выше код теперь устраняет исходную проблему, с которой я столкнулся.
Редактировать 2: Обращаясь к другому предложению Майкла Берра:
Из-за переменной части EVENTLOGRECORD я сделаю собственную структуру, которая имеет EVENTLOGRECORD плюс несколько других переменных, которые меня интересуют:
struct CustomRecord
{
EVENTLOGRECORD recordHeader;
string sourceName;
string computerName;
string message;
};
Извлечение переменных частей не является тривиальной задачей, но вот отличный пример для начала:
Запрос информации о событии