Я делаю программу, которая считывает и хранит данные из файлов EventLog Windows (.evt) в C++. Я пользуюсь звонками OpenBackupEventLog(ServerName, FileName) и ReadEventLog(...). Также с помощью этого: PEVENTLOGRECORDПочему мой вектор <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())
вызывается и возвращает истинное (ака ReadEventLog() возвращает ложь), то каждое поле в моем вектор получает значение ноль.
Вектор по-прежнему будет содержать правильное количество элементов, просто все поля в структуре PEVENTLOGRECORD теперь равны нулю.
У кого-нибудь с лучшим опытом отладки есть идеи?
Спасибо.
Редактировать: Я обновил код на предложение Майкла Берра. Вышеприведенный код теперь устраняет исходную проблему, с которой я столкнулся.
Edit 2: Адресация других предложений Майкла Барра: Из-за переменную часть EVENTLOGRECORD, я буду делать пользовательские структуру, которая имеет EVENTLOGRECORD плюс несколько других переменные, которые я заинтересован в:
struct CustomRecord
{
EVENTLOGRECORD recordHeader;
string sourceName;
string computerName;
string message;
};
Вытащив переменной части не тривиальная задача, но вот отличный пример, чтобы вы начали: Querying for Event Information
Пожалуйста, внесите фактический код. 'vector (PEVENTLOGRECORD)' даже не будет компилироваться. –
Всякий раз, когда я помещаю a, он исчезает. – Eric
Я вижу, что вы использовали блок «» для его форматирования - вместо этого выберите блок кода программы и отступьте его, нажав Ctrl-K или нажав кнопку «фигурные скобки» над окном редактирования. –