Zugriff auf Windows Ereignisanzeige (VCL C++ Builder)



  • Wer hat ein funktionierendes Mini-Beispiel für das Schreiben von Fehlermeldungen in das Windows-Ereignisprotokoll ?

    Delphie kennt eine Klasse TEventLogger, welche ich aber in der Hilfe zum Builder V.5 nicht finde.

    Die Anweisung TService1->LogMessage ("Dienst gestartet", EVENTLOG_INFORMATION_TYPE, NULL, NULL) fuehrt lediglich zu dieser Meldung in der Ereignisanzeige:

    "Die Beschreibung der Ereigniskennung (0) in (Pr_Testdienst.exe) wurde nicht gefunden. Der lokale Computer verfügt nicht über die zum Anzeigen der Meldungen von einem Remotecomputer erforderlichen Registrierungsinformationen oder DLL-Meldungsdateien. Ereignisinformationen: Klasse ist nicht vorhanden"



  • Die Beschreibung der Ereigniskennung muss in einer DLL oder auch in deinen Dienst vorhanden sein. Dazu mußt du erstmal mit Hilfe des Messagecompilers ein Messagemap erstellen und diese dann deinen Projekt zufügen.
    Bsp für eine solche Datei:

    **;#define CAT_INIT 1
    MessageId=0x1
    Language=English
    Start
    .
    ;#define CAT_ERROR 0xC000
    MessageId=0xC000
    Language=English
    Fehler
    .
    MessageId=0x1000
    SymbolicName=MC_START
    Language=English
    MyDienst erfolgreich gestartet
    .
    **

    Wichtig ist der Punkt zwischen den einzelnen Anweisungsblöcken.

    Dann muss die Messagemap mit dem Messagecompiler erzeugt werden:
    mc mymsg.txt

    Mc erstellt dann 3 neue Dateien:
    mymsg.bin, mymsg.h und mymsg.rc

    Die mymsg.rc mußt du deinen Projekt hinzufügen.

    Anschliessend mußt du noch dem ServiceControl-Manager mitteilen, wo er deine Anwendung mit der Messagemap finden kann. Das einfachste wäre, es dann zu tun, wenn der Dienst installiert werden soll, dafür gibt eine Event-Methode "ServiceBeforeInstall".
    In diese kannst du dann folgenden Code übernehmen:

    [cpp]
    void __fastcall TMySrv::ServiceBeforeInstall(TService *Sender)
    {
      //Installs the MessageFile included in this Service-Application to
      //Win- Registry
    
      TRegistry *Registry = new TRegistry;
      Registry->RootKey = HKEY_LOCAL_MACHINE;
    
      // Path to Registry-Key
      AnsiString s = "SYSTEM\\CurrentControlSet\\services\\eventlog\\application\\";
      s += Name;
    
      //Create the Key
      Registry->OpenKey(s,true);
    
      char dir[0xff];
    
      //Now get the Name and Path for our Service
      int len;
    
      len = GetModuleFileName(0,dir,0xfe);
    
      if (!len)
        ShowMessage("ErrorCode bei GetModuleFileName: "+IntToStr(GetLastError()));
      else
        //... and write it to the Registry if sucessful
        Registry->WriteString("EventMessageFile",String(dir));
    
      // Close the Key
      Registry->CloseKey();
    
      delete Registry;
    
    }[/cpp]
    

    Bei der Installation des Dienstes werden Admin-Rechte benötigt.
    😉

    Die Bezugsquelle für den Messagecompiler kann ich dir allerdings nicht nennen, ich habe ihn seinerzeit aus dem VS 6 benutzt, aber vielleicht gibt es den ja irgendwo als freien Download.



  • SUPI !! Werde ich gleich ausprobieren.

    Herzlichen Dank für die Hilfe !!!


Anmelden zum Antworten