Question

Pour autant que je sache, la fonction ReportEvent nécessite Fichiers texte de message associés via le registre pour recevoir des messages correctement formatés.Existe-t-il des identifiants d'événement communs ou un moyen simple de signaler un événement sans aucun fichier texte de message associé?

Ou peut-être, y a-t-il une source d'événements commune spéciale que je peux utiliser dans mon application?Quelque chose comme RegisterEventSource (NULL, "Application")?

Était-ce utile?

La solution

Non, il vous suffit de suivre les règles et de définir les fichiers texte de vos messages, de les intégrer dans des ressources, de les lier à votre application, etc.

L'exemple fourni sur MSDN vous guide à travers tout ce dont vous avez besoin pourfaire.

Autres conseils

Essayez ceci, cela a fonctionné pour moi avant ..

http://www.codeproject.com/KB/system/xeventlog.aspx

Vous n'êtes pas obligé d'enregistrer vos messages dans HKLM. (Ce qui est une bonne chose, car vous ne pouvez pas enregistrer de messages si vous n'êtes pas un administrateur).

Mais cela ne vous empêche pas d'écrire des événements dans le journal des événements de l'application Windows. Le seul inconvénient est qu'à partir de Windows Vista, vous obtiendrez simplement du texte laid avec lui.

HRESULT LogToEventLog(String Source, String EventText, int EventType, DWORD EventID)
{
   /*
      EventType is one of:
         EVENTLOG_ERROR_TYPE       = $0001;
         EVENTLOG_WARNING_TYPE     = $0002;
         EVENTLOG_INFORMATION_TYPE = $0004;
         EVENTLOG_AUDIT_SUCCESS    = $0008;
         EVENTLOG_AUDIT_FAILURE    = $0010;

      Source is your name for your app or feature, e.g.:
         "My Cool App"
         "Outlook"    
         "ESENT"
         "Chrome"
   */

   HANDLE h = RegisterEventSource(null, Source); //null --> local computer
   if (h == 0) 
      return HResultFromWin32(GetLastError);
   try
   {       
      PChar[1] ss;
      ss[0] = PChar(EventText);

      if (!ReportEvent(
            h,         // event log handle
            EventType, // event type
            0,         // category zero
            EventID,   // event identifier
            null,      // no user security identifier
            1,         // one substitution string
            0,         // no data
            @ss,       // pointer to string array
            null       // pointer to data
      ))
      {
         return HResultFromWin32(GetLastError);
      }
   }
   finally
   {
      DeregisterEventSource(h);
   }
   return S_OK;
}

Vous pouvez désormais enregistrer les événements dans le journal des événements de l'application:

LogToEventLog("Stackoverflow", "Question 5399066 was answered by Ian Boyd", 
      EVENTLOG_INFORMATION_TYPE, 0x45);

Voler l'inscription de quelqu'un d'autre

Malheureusement, à partir de Windows Vista, Windows émettra de vilaines plaintes selon lesquelles vous n'avez pas enregistré l'événement au préalable:

La description de l'ID d'événement 69 de la source Stackoverflow ne peut pas être a trouvé. Soit le composant qui déclenche cet événement n'est pas installé sur votre ordinateur local ou l'installation est corrompue. Vous pouvez installer ou réparez le composant sur l'ordinateur local.

Si l'événement provient d'un autre ordinateur, les informations d'affichage devait être enregistré avec l'événement.

Les informations suivantes ont été incluses avec l'événement:

Ian Boyd a répondu à la question 5399066

Mais vous n'avez pas à vivre avec. Ce n'est pas parce que vous n'avez pas enregistré de fichier source de message dans HKLM que personne d'autre ne l'a fait.

Notez, par exemple, un message de la source Outlook dans le journal des événements:

  • Source : Outlook
  • EventID : 0x40000020
  • Données d'événement : D:\win32app\Exchange\Outlook2003.pst
  • Message : The store D:\win32app\Exchange\Outlook2003.pst has detected a catalog checkpoint.

Vous pouvez vérifier les informations d'enregistrement pour Outlook dans:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application \ Outlook

Et voyez:

MessageEventFile: REG_SZ = "D:\Programs\MICROS~4\Office14\1033\MAPIR.DLL"

Si vous jetez un œil dans les ressources du binaire MAPIR.dll, vous verrez sa Table des messages :

1 MESSAGETABLE
{
0x12,       "Connection stats for server (%1).  Rpcs Attempted (%2), Rpcs Succeeded (%3), Rpcs Failed (%4), Rpcs Canceled (%5), Rpc UI shown (%6), Avg request time (%7) ms, Min request time (%8) ms, Max request time (%9) ms.\r\n"
0x14,       "Cancelable RPC started.\r\n"
0x15,       "Cancelable RPC shutdown.\r\n"
0x40000010,     "Cancelable RPC dialog shown for server (%1), total wait time was (%2) ms, result was (%3).\r\n"
0x40000011,     "User canceled request against server (%1) after waiting (%2) ms.\r\n"
0x40000013,     "Rpc call (%1) on transport (%2) to server (%3) failed with error code (%4) after waiting (%5) ms; eeInfo (%6).\r\n"
0x40000016,     "There was a problem reading one or more of your reminders. Some reminders may not appear.\r\n"
0x40000017,     "Unable to update public free/busy data.\r\n"
0x4000001A,     "%1\r\n"
0x4000001B,     "%1\r\n"
0x4000001D,     "The store %1 is being re-pushed to the indexer for the following reason: %2.\r\n"
0x4000001E,     "Starting reconciliation for the store %1 for the following reason: %2.\r\n"
0x4000001F,     "The store %1 has detected a catalog rebuild.\r\n"
0x40000020,     "The store %1 has detected a catalog checkpoint.\r\n"
...
}

Vous pouvez voir que l'ID d'événement 0x40000020 est associé à une chaîne de formatage:

"Le magasin% 1 a détecté un point de contrôle de catalogue. \ r \ n"

Vous pouvez détourner l'enregistrement d'Outlook:

LogToEventLog("Outlook", "Your mom", EVENTLOG_INFORMATION_TYPE, $40000020);

et vous obtiendrez votre événement ajouté au journal des événements sans tous les horribles avertissements:

 entrez la description de l'image ici

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