Question

Je fais un programme qui lit et stocke des données à partir de fichiers de Windows EventLog (.evt) en C ++. J'utilise les appels OpenBackupEventLog (ServerName, FileName) et ReadEventLog (...) . Aussi à l'aide ceci: PEVENTLOGRECORD

Quoi qu'il en soit, sans fournir tout le code, voici l'idée de base:
1. Je reçois une poignée dans le fichier .evt en utilisant OpenBackupEventLog () et passant dans un nom de fichier.
2. J'utilise ensuite ReadEventLog () pour remplir un tampon avec un nombre inconnu de messages EventLog.
3. Je traverse à travers le tampon et ajouter chaque message à un vecteur
4. Je continue à remplir les tampons (répéter les étapes 2 et 3) avant d'avoir atteint la fin du fichier.

Voici mon code pour remplir le vecteur:

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

Quoi qu'il en soit, chaque fois que je lance ce, il obtiendra tous les EventLogs dans le fichier, et le vecteur aura tout ce que je veux. Mais dès que cette ligne:

if(!ReadEventLog())

est appelée et renvoie true (alias ReadEventLog () retourne false), puis tous les champs dans mon vecteur se mis à zéro.

Le vecteur contiendra encore le nombre exact d'éléments, il est juste que tous les champs de la struct PEVENTLOGRECORD sont maintenant zéro.

Toute personne ayant une expérience meilleure débogage ont des idées?

Merci.

Edit: J'ai mis à jour le code par la suggestion de Michael Burr. Le code ci-dessus élimine maintenant le problème d'origine j'avais.

Edit 2: autre suggestion Répondre Michael Burr: En raison de la partie variable de la EVENTLOGRECORD, je vais faire une struct personnalisée qui a le EVENTLOGRECORD plus quelques autres variables que je suis intéressé par:

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

Tirer les parties variables est pas une tâche triviale, mais voici un excellent exemple pour vous aider à démarrer: Interrogation d'information sur l'événement

Était-ce utile?

La solution

Je suppose que votre vecteur (qui je pense devrait se lire comme vector<PEVENTLOGRECORD>, non vector(PEVENTLOGRECORD)) contient des pointeurs vers les données plutôt que des copies des données. Je pense que tout ce qui possède les données réelles est le libérer lorsque le ReadEventLog() indique qu'il n'y a pas plus de données.

Une solution possible est que vous devez stocker les données lui-même dans le vecteur plutôt que les pointeurs. Faire un vecteur vector<EVENTLOGRECORD> et stocker le contenu déréférencées du pointeur PEVENTLOGRECORD dans le vecteur (qui devrait créer une copie) à la place du pointeur lui-même:

allRecords.push_back(*currentRecord);

Mise à jour: En regardant de plus près dans MSDN, le EVENTLOGRECORD est l'un de ces structs longueur méchantes variables où le compilateur a connaissance seule la partie « en-tête ». Les données de longueur variable suit cet en-tête, mais à proprement parler ne fait pas partie de la struct dans la mesure où le compilateur est concerné. Ainsi, un vector<EVENTLOGRECORD> ne saisira pas la partie variable des données. Vous aurez besoin de trouver une classe personnalisée qui peut être initialisé avec un PEVENTLOGRECORD et sait comment traiter correctement les données variables, ou vous devrez copier le struct et ses données variables dans une taille appropriée, allouée dynamiquement tableau d'octets et de stocker un pointeur vers ce bloc alloué (mais ne pas libérer le bloc jusqu'à ce que le vecteur est fait avec avec elle - un pointeur intelligent pourrait aider).

Venir avec la classe qui peut intelligemment traiter les données d'enregistrement du journal des événements est peut-être un peu de travail à l'avant, mais je suppose que le travail serait rentable à long terme si vous faites un travail important avec les enregistrements. Vous trouverez peut-être une classe sur le net qui peut être utilisé ou utilisé comme point de départ pour votre propre (une recherche rapide trouvé CEventLogRecord http://www.naughter.com/serv.html , par exemple).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top