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.txtMc erstellt dann 3 neue Dateien:
mymsg.bin, mymsg.h und mymsg.rcDie 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 !!!