Почему мой вектор загадочно очищается?
-
13-10-2019 - |
Вопрос
Я делаю программу, которая считывает и хранит данные из файлов 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, Например).