Pregunta

Estoy haciendo un programa que lee y almacena los datos a partir de archivos de Windows EventLog (.evt) en C ++. Estoy utilizando las llamadas OpenBackupEventLog (ServerName, nombre de archivo) y ReadEventLog (...) . También el uso de este: PEVENTLOGRECORD

De todos modos, sin necesidad de suministrar todo el código, aquí es la idea básica:
1. Consigo un identificador para el archivo .evt usando OpenBackupEventLog () y pasando un nombre de archivo. Página 2. Luego utilizo ReadEventLog () para llenar un tampón con un número desconocido de mensajes EventLog. página 3. Me recorrer a través de la memoria intermedia y añadir a cada mensaje a un vector página 4. Sigo llenando tampones (repita los pasos 2 y 3) hasta que llegue al final del archivo.

Aquí está mi código para llenar el vector:

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

En cualquier caso, cada vez que corro esto, obtendrá todos los eventlogs en el archivo, y el vector tendrá todo lo que quiero que haga. Pero tan pronto como esta línea:

if(!ReadEventLog())

se llama y vuelve verdadera (también conocido como ReadEventLog () devuelve falso), entonces todos los campos en mi vector se establece en cero.

El vector contendrá todavía el número correcto de elementos, es sólo que todos los campos de la estructura PEVENTLOGRECORD ahora son cero.

Cualquier persona con experiencia mejor depuración tiene alguna idea?

Gracias.

Edit: He actualizado el código por sugerencia de Michael Burr. El código anterior ahora elimina el problema original que tenía.

Editar 2: Abordar otra sugerencia de Michael Burr: Debido a la parte variable del EVENTLOGRECORD, haré una estructura personalizada que tiene el EVENTLOGRECORD además de algunas otras variables que estoy interesado en:

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

Sacando las porciones variables no es una tarea trivial, pero en este caso es un ejemplo excelente para empezar: Consulta de Información del Evento

¿Fue útil?

Solución

supongo que su vector (que creo que debe decir lo vector<PEVENTLOGRECORD>, no vector(PEVENTLOGRECORD)) contiene punteros a los datos en lugar de copias de los datos. Creo que todo lo que posee los datos reales se liberándolo cuando el ReadEventLog() indica que no hay más datos.

Una solución posible es que usted debe almacenar los datos en sí en el vector en lugar de los punteros. Hacer que el vector a vector<EVENTLOGRECORD> y almacenar los contenidos sin referencia que el puntero de PEVENTLOGRECORD en el vector (que debe crear una copia) en lugar del propio puntero:

allRecords.push_back(*currentRecord);

Actualización: El vistazo más de cerca en MSDN, el EVENTLOGRECORD es una de esas estructuras de longitud variable desagradables donde el compilador sabe acerca de sólo la parte 'cabecera'. Los datos de longitud variable se deduce que la cabecera, pero estrictamente hablando no es parte de la estructura en lo que se refiere al compilador. Por lo que un vector<EVENTLOGRECORD> no capturará la parte variable de los datos. Tendrá que llegar a una clase personalizada que puede ser inicializado con un PEVENTLOGRECORD y sabe cómo tratar adecuadamente con los datos variables, o tendrá que copiar la estructura y de datos variables en un tamaño adecuado, dinámicamente asignada matriz de bytes y almacenar un puntero a ese bloque asignado (pero no liberar el bloque hasta que el vector se realiza con con él - un puntero inteligente podría ayudar aquí).

El subir con la clase que se pueden tratar de forma inteligente con los datos de registro de registro de eventos podría ser un poco de trabajo al principio, pero supongo que el trabajo sería rentable en el largo plazo, si está haciendo ningún trabajo significativo con los récords. Es posible encontrar una clase en la red que puede ser utilizado o se utiliza como punto de partida para su propia (una búsqueda rápida de encontrar CEventLogRecord http://www.naughter.com/serv.html , por ejemplo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top