Domanda

Sto facendo un programma che legge e memorizza i dati da file di Windows EventLog (.evt) in C ++. Sto usando le chiamate OpenBackupEventLog (ServerName, nome del file) e ReadEventLog (...) . Anche utilizzare questo: PEVENTLOGRECORD

In ogni caso, senza fornire tutto il codice, qui è l'idea di base:
1. Ho un handle al file .evt utilizzando OpenBackupEventLog () e passando in un nome di file. Pagina 2. Ho quindi utilizzare ReadEventLog () per riempire un buffer con un numero imprecisato di messaggi EventLog. Pagina 3. Ho attraversare attraverso il buffer e aggiungere ogni messaggio ad un vettore Pagina 4. Continuo a riempire i buffer (ripetere i punti 2 e 3) fino a raggiungere la fine del file.

Ecco il mio codice per il riempimento del vettore:

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

In ogni caso, ogni volta che corro questo, otterrà tutti i EventLogs nel file, e il vettore avrà tutto quello che voglio. Ma non appena questa linea:

if(!ReadEventLog())

viene chiamato e ritorna vero (aka ReadEventLog () restituisce false), allora ogni campo nel mio vettore viene impostato a zero.

Il vettore conterrà ancora il numero corretto di elementi, è solo che tutti i campi della struct PEVENTLOGRECORD ora sono pari a zero.

Chiunque abbia esperienza migliore di debug ha qualche idea?

Grazie.

Edit: Ho aggiornato il codice per ogni suggerimento di Michael Burr. Il codice di cui sopra ora elimina il problema originale che stavo avendo.

Modifica 2: Affrontare altro suggerimento di Michael Burr: A causa della parte variabile della EVENTLOGRECORD, farò una struct personalizzato che ha l'EVENTLOGRECORD più alcune altre variabili che Sono interessato a:

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

Tirando fuori le porzioni variabili non è un compito banale, ma qui è un ottimo esempio per iniziare: Interrogazione per informazioni sull'evento

È stato utile?

Soluzione

Direi che il vettore (che a mio avviso va letta come vector<PEVENTLOGRECORD>, non vector(PEVENTLOGRECORD)) contiene puntatori ai dati piuttosto che copie dei dati. Credo che tutto ciò che possiede il dato reale è di rilasciarlo quando la ReadEventLog() indica che non ci sono più dati.

Una possibile soluzione è che si dovrebbe archiviare i dati stessi nel vettore piuttosto che i puntatori. Fare il vettore di un vector<EVENTLOGRECORD> e memorizzare il contenuto dereferenziate del puntatore PEVENTLOGRECORD nel vettore (che dovrebbe creare una copia) al posto del puntatore stesso:

allRecords.push_back(*currentRecord);

Aggiornamento: a ben guardare in MSDN, il EVENTLOGRECORD è una di quelle brutte le strutture a lunghezza variabile in cui il compilatore conosce circa solo la parte 'intestazione'. Dati di lunghezza variabile consegue che di testa, ma strettamente parlando non è parte della struct quanto il compilatore è interessato. Quindi un vector<EVENTLOGRECORD> non cattura la parte variabile dei dati. Avrete bisogno di trovare una classe personalizzata che può essere inizializzato con un PEVENTLOGRECORD e sa come trattare correttamente con i dati variabili, o è necessario copiare lo struct ed è dati variabili in un dimensionata correttamente, in modo dinamico-allocati array di byte e memorizzare un puntatore a tale blocco allocato (ma non liberare il blocco finché il vettore è fatto con con esso - un puntatore intelligente potrebbe aiutare qui).

Venendo con la classe in grado di affrontare in modo intelligente con i dati del record registro eventi potrebbe essere un po 'di lavoro davanti, ma direi che il lavoro avrebbe pagato nel lungo periodo se si sta facendo qualsiasi lavoro significativo i record. Si potrebbe trovare una classe in rete che può essere utilizzato o utilizzato come punto di partenza per il proprio (una rapida ricerca ha trovato CEventLogRecord da http://www.naughter.com/serv.html , per esempio).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top