Frage

Ich erstelle ein Programm, das Daten von Windows EventLog -Dateien (.evt) in C ++ liest und speichert. Ich benutze die Anrufe OpenBackupeVentLog (Servername, Dateiname) und ReadEventLog (...). Auch dies verwenden: PEVENTLOGRECORD

Wie auch immer, ohne den gesamten Code zu liefern, hier ist die Grundidee:
1. Ich erhalte einen Handle in die .evt -Datei mit OpenBackupeVentLog () und übergeben Sie einen Dateinamen.
2. Ich verwende dann ReadEventLog (), um einen Puffer mit einer unbekannten Anzahl von EventLog -Nachrichten zu füllen.
3. Ich bin durch den Puffer und füge jede Nachricht einem Vektor hinzu
4. Ich fülle Puffer weiter (Wiederholung der Schritte 2 und 3), bis ich das Ende der Datei erreiche.

Hier ist mein Code zum Ausfüllen des Vektors:

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;
   }
}

Wie auch immer, wenn ich dies ausführe, wird alle EventLogs in der Datei einbezogen, und der Vektor hat alles, was ich möchte. Aber sobald diese Zeile:

if(!ReadEventLog())

Wird angerufen und kehrt true zurück (auch bekannt als ReadEventLog () gibt falsch zurück), dann wird jedes Feld in meinem Vektor auf Null gesetzt.

Der Vektor enthält weiterhin die korrekte Anzahl von Elementen. Es ist nur so, dass alle Felder in der Peventlogrecord -Struktur jetzt Null sind.

Hat jemand mit besserer Debugging -Erfahrung Ideen?

Vielen Dank.

Bearbeiten: Ich habe den Code gemäß Vorschlag von Michael Burr aktualisiert. Der obige Code beseitigt jetzt das ursprüngliche Problem, das ich hatte.

Bearbeiten 2: Behandeln Sie den anderen Vorschlag von Michael Burr: Aufgrund des variablen Teils des EventLogrecord werde ich eine benutzerdefinierte Struktur erstellen, die das EventLogradrus plus einige andere Variablen enthält, an denen ich interessiert bin:

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

Das Herausziehen der variablen Portionen ist keine triviale Aufgabe, aber hier ist ein hervorragendes Beispiel, um Ihnen den Einstieg zu erleichtern:Abfragen nach Ereignisinformationen

War es hilfreich?

Lösung

Ich würde vermuten, dass Ihr Vektor (was ich denke, als lesen sollte vector<PEVENTLOGRECORD>, nicht vector(PEVENTLOGRECORD)) Enthält Zeiger auf die Daten und nicht auf Kopien der Daten. Ich denke, dass alles, was die tatsächlichen Daten besitzen ReadEventLog() Zeigt an, dass es keine Daten mehr gibt.

Eine mögliche Korrektur ist, dass Sie die Daten selbst im Vektor und nicht in den Zeigern speichern sollten. Machen Sie den Vektor a vector<EVENTLOGRECORD> und speichern Sie den Derferensinhalt des PeventlogreRecord -Zeigers in den Vektor (der eine Kopie erstellen sollte) anstelle des Zeigers selbst:

allRecords.push_back(*currentRecord);

UPDATE: Auf msdn genauer ansehen, die EVENTLOGRECORD ist eine dieser bösen Strukturen mit variabler Länge, bei denen der Compiler nur den "Header" -Teil weiß. Die Daten der variablen Länge folgen dieser Header, ist jedoch für den Compiler nicht Teil der Struktur. Also a vector<EVENTLOGRECORD> Erfasst den variablen Teil der Daten nicht. Sie müssen eine benutzerdefinierte Klasse finden, die mit a initialisiert werden kann PEVENTLOGRECORD und weiß, wie man ordnungsgemäß mit den variablen Daten umgeht, oder Sie müssen die Struktur kopieren, und es handelt sich um variable Daten in ein ordnungsgemäß dynamisch zugeteiltes Array von Bytes und speichert einen Zeiger auf diesen zugewiesenen Block (aber befreien Sie das nicht Blockieren, bis der Vektor damit fertig ist - ein intelligenter Zeiger könnte hier helfen).

Wenn Sie die Klasse entwickeln, die intelligent mit den Event -Protokoll -Datensatzdaten umgehen kann, ist es möglicherweise ein bisschen Arbeit im Voraus, aber ich würde vermuten, dass sich die Arbeit langfristig auszahlen würde, wenn Sie bedeutende Arbeiten mit den Aufzeichnungen erledigen. Möglicherweise finden Sie eine Klasse im Netz, die als Ausgangspunkt für Ihren eigenen verwendet oder verwendet werden kann http://www.naughter.com/serv.html, zum Beispiel).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top