Вопрос

Я делаю программу, которая считывает и хранит данные из файлов windows eventlog (.evt) в C ++. Я использую звонки OpenbackupEventLog (ServerName, имя файла) а также 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;
   }
}

В любом случае, всякий раз, когда я запускаю это, он получит все события в файле, и у вектора будет все, что я хочу. Но как только эта линия:

if(!ReadEventLog())

Получится и возвращает true (он же readeventlog () возвращает false), тогда каждое поле в моем векторе устанавливается на ноль.

Вектор по -прежнему будет содержать правильное количество элементов, просто все поля в структуре Peventlogrecord теперь равны нулю.

У кого -нибудь с лучшим опытом отладки есть идеи?

Спасибо.

РЕДАКТИРОВАТЬ: Я обновил код по предложению Майкла Берра. Приведенный выше код теперь устраняет исходную проблему, которая у меня была.

РЕДАКТИРОВАТЬ 2: Обращаясь к другому предложению Майкла Берра: из -за переменной части события, я сделаю пользовательскую структуру, которая имеет событие, плюс несколько других переменных, которые меня интересуют:

struct CustomRecord
{
   EVENTLOGRECORD recordHeader;
   string sourceName;
   string computerName;
   string message;
};

Вытащить переменные порции не является тривиальной задачей, но вот отличный пример, который вы можете начать:Запрос информации о событиях

Это было полезно?

Решение

Я предполагаю, что ваш вектор (который, я думаю, должен читать как vector<PEVENTLOGRECORD>, нет vector(PEVENTLOGRECORD)) содержит указатели на данные, а не копии данных. Я думаю, что все, что владеет фактическими данными, выпускает их, когда ReadEventLog() Указывает, что нет больше данных.

Одним из возможных исправлений является то, что вы должны хранить сами данные в векторе, а не по указателям. Сделать вектор vector<EVENTLOGRECORD> и хранить содержимое привязки к указателю Peventlogrecord в вектор (который должен создавать копию) вместо самого указателя:

allRecords.push_back(*currentRecord);

Обновление: In In On Beerper In MSDN, EVENTLOGRECORD является одной из тех неприятных структур переменной длины, где компилятор знает только о части «заголовка». Данные переменной длины следует за этим заголовком, но строго говоря, не является частью структуры, что касается компилятора. Так что vector<EVENTLOGRECORD> не запечатлевает переменную часть данных. Вам нужно будет придумать пользовательский класс, который можно инициализировать с помощью PEVENTLOGRECORD и знает, как правильно справиться с данными переменной, или вам нужно скопировать структуру, и его переменные данные в соответствующий распределенный, динамически распределенный массив байтов и сохранить указатель на этот выделенный блок (но не освобождайте Блок до тех пор, пока вектор не будет сделан с ним - здесь может помочь умный указатель).

Придумать класс, который может разумно справляться с данными записи журнала событий, может быть немного работа, но я предполагаю, что эта работа окупится в долгосрочной перспективе, если вы выполняете какую -либо существенную работу с записями. Вы можете найти класс в сети, который можно использовать или использовать в качестве отправной точки для вашей собственной (быстрый поиск найден CEVENTOGRECORD из http://www.naughing.com/serv.html, Например).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top