![]() |
TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
Hi,
ich versuch's noch mal mit passenderem Titel. Ziel ist es, mit einer ServiceApplication Einträge in das Eventlog von Windows zu schreiben, ohne dass die Meldung "Beschreibung für die Ereignis-ID "x" aus der Quelle "y" wird nicht gefunden....." kommt. Wie das geht hat Luckie in seinem ![]() Doch irgendwie bekomme ich es nicht hin, oder mache irgendwo einen entscheidenden Fehler. Denn nicht nur, dass diese Meldung nicht verschwindet, sondern unter im Ereigniseintrag steht auch noch "Das Handle ist ungültig". Hier mal was ich gemacht habe: Im AfterServiceInstall setze ich die Registry-Einträge:
Code:
Dann habe ich mir eine TestServerEventLog.mc mit folgendem Inhalt angelegt:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\TestAnwendung] "EventMessageFile"="C:\\Test\\TestService.exe" "CategoryMessageFile"="C:\\Test\\TestService.exe" "CategoryCount"=dword:00000005 "TypesSupported"=dword:00000007
Code:
diese mit mc und brcc32 in eine TestAnwendungEnventLog.res übersetzt und in die Mainunit des Service eingebunden.
LanguageNames=(German=0x407:MSG00407)
MessageID=0x1 Symbolicname=CAL Language=German Allgemein . MessageID=0x2 Symbolicname=CAN Language=German Anruf . MessageID=0x3 Symbolicname=CLI Language=German Lizenzinformation . MessageID=0x4 Symbolicname=CIN Language=German Informationen . MessageID=0x5 Symbolicname=CFE Language=German Fehler . Und mit dieser Funktion
Delphi-Quellcode:
schreiben ich nun meinen Eintrag ins EreignisLog. Er kommt auch an, aber nicht so wie ich möchte.
LizenzMessage:='Lizenzinformationen:'+#13#10;
LizenzMessage:='Seriennummer:'+#13#10; LizenzMessage:='Registriert für:'+#13#10; LizenzMessage:=Lizenz.Firma+#13#10; LizenzMessage:=Lizenz.Vorname+' '+Lizenz.Name+#13#10; LizenzMessage:=Lizenz.Strasse+#13#10; LizenzMessage:=Lizenz.PLZ+' '+Lizenz.Stadt+#13#10; LizenzMessage:='Telefon: '+Lizenz.Telefon+#13#10; LizenzMessage:='E-Mail: '+Lizenz.EMail+#13#10; LizenzMessage:='Seriennr: '+Lizenz.SerienNr+#13#10; LogMessage(LizenzMessage, EVENTLOG_INFORMATION_TYPE, 1, 4);
Code:
Ich muss ja einen Fehler gemacht haben. Nur erkenne ich ihn nicht. Vielleicht hat jemand einen Tipp für mich.
Die Beschreibung für die Ereignis-ID "4" aus der Quelle "TestAnwendung" wurde nicht gefunden. Entweder ist die Komponente, die dieses Ereignis auslöst, nicht auf dem lokalen Computer installiert, oder die Installation ist beschädigt. Sie können die Komponente auf dem lokalen Computer installieren oder reparieren.
Falls das Ereignis auf einem anderen Computer aufgetreten ist, mussten die Anzeigeinformationen mit dem Ereignis gespeichert werden. Die folgenden Informationen wurden mit dem Ereignis gespeichert: SerienNr: abcdef Das Handle ist ungültig Zusammenfassen noch mal die 3 Probleme: 1. Die Meldung "Die Beschreibung für die Ereignis-ID...." sollte nicht kommen 2. "Das Handle ist ungültig" sollte nicht kommen 3. Vom meinen übergebenen String wird nur die letzte Zeile geschrieben. Ich möchte aber mehr ausgeben. |
AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
Wie sieht denn die Funktion "LogMessage" aus?
|
AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
Das ist keine eigene, sondern die von TService.
|
AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
Zitat:
1. Ich vermute (habe die Funktion noch nie Verwendet) das hängt mit deinen Parametern zusammen. Du übergibst der Funktion ja die ID "4". 3. Du überschreibst bei deiner "LizenzMessage" immer den Wert, anstatt sie zusammen zu hängen. Funktionieren kann es zB so:
Delphi-Quellcode:
Zu 2. kann ich leider nichts sagen.
LizenzMessage:='Seriennummer:'+#13#10;
LizenzMessage:= LizenzMessage + 'Registriert für:'+#13#10; LizenzMessage:= LizenzMessage + Lizenz.Firma+#13#10; LizenzMessage:= LizenzMessage + Lizenz.Vorname+' '+Lizenz.Name+#13#10; LizenzMessage:= LizenzMessage + Lizenz.Strasse+#13#10; LizenzMessage:= LizenzMessage + Lizenz.PLZ+' '+Lizenz.Stadt+#13#10; LizenzMessage:= LizenzMessage + 'Telefon: '+Lizenz.Telefon+#13#10; LizenzMessage:= LizenzMessage + 'E-Mail: '+Lizenz.EMail+#13#10; LizenzMessage:= LizenzMessage + 'Seriennr: '+Lizenz.SerienNr+#13#10; |
AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
1. Ich vermute (habe die Funktion noch nie Verwendet) das hängt mit deinen Parametern zusammen. Du übergibst der Funktion ja die ID "4".
3. Du überschreibst bei deiner "LizenzMessage" immer den Wert, anstatt sie zusammen zu hängen. Funktionieren kann es zB so:
Delphi-Quellcode:
LizenzMessage:='Seriennummer:'+#13#10;
LizenzMessage:= LizenzMessage + 'Registriert für:'+#13#10; LizenzMessage:= LizenzMessage + Lizenz.Firma+#13#10; LizenzMessage:= LizenzMessage + Lizenz.Vorname+' '+Lizenz.Name+#13#10; LizenzMessage:= LizenzMessage + Lizenz.Strasse+#13#10; LizenzMessage:= LizenzMessage + Lizenz.PLZ+' '+Lizenz.Stadt+#13#10; LizenzMessage:= LizenzMessage + 'Telefon: '+Lizenz.Telefon+#13#10; LizenzMessage:= LizenzMessage + 'E-Mail: '+Lizenz.EMail+#13#10; LizenzMessage:= LizenzMessage + 'Seriennr: '+Lizenz.SerienNr+#13#10; Zu 2. kann ich leider nichts sagen.[/QUOTE] Du kannst es zwar nicht sehen, aber bezüglich deiner Lösung zu Punkt 3 schlage ich mir gerade mehrfach mit der Hand vor den Kopf ;-) Bei sowas hilft natürlich auch keine Brille :-D Zu 1.: Wenn ich keine ID übergehen wird automatisch die ID 0 verwendet. Was zur gleichen Meldung führt, nur eben mit der ID 0. Die Kategorien muss man ja in die Ressource verfügbar machen. Muss man das mit den Ereignis-ID's vielleiht auch? Aber das es ja bei anderen auch funktioniert hat ![]() |
AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht bin ich zu blöd, aber ich krieg's nicht hin.
Vielleicht hab ich ja irgendwo einen Denkfehler oder sowas wie das worauf Sebastian mich hingewiesen hat. Nochmal meine komplette mc-Datei:
Code:
Und in Delphi hab ich das hier:
SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS
Informational=0x1:STATUS_SEVERITY_INFORMATIONAL Warning=0x2:STATUS_SEVERITY_WARNING Error=0x3:STATUS_SEVERITY_ERROR ) FacilityNames=(System=0x0:FACILITY_SYSTEM Runtime=0x2:FACILITY_RUNTIME Stubs=0x3:FACILITY_STUBS Io=0x4:FACILITY_IO_ERROR_CODE ) LanguageNames=(German=0x407:MSG00407) MessageIdTypedef=WORD MessageID=0x1 Symbolicname=CAT_ALL Language=German Allgemein . MessageID=0x2 Symbolicname=CAT_CALL Language=German Anruf . MessageID=0x3 Symbolicname=CAT_LIC Language=German Lizenzinformation . MessageID=0x4 Symbolicname=CAT_INFO Language=German Informationen . MessageID=0x5 Symbolicname=CAT_ERR Language=German Fehler . MessageIdTypedef=DWORD MessageID=0x1000 Symbolicname=LIC_INFO Language=German Lizenzinformationen . MessageID=0x1001 Symbolicname=LIC_EXP Language=German Lizenzinformationen . MessageID=0x2000 Symbolicname=CALL_SiG Language=German Anruf signalisieren . MessageID=0x2001 Symbolicname=CALL_DBL Language=German Anruf bereits erfasst . MessageID=0x2002 Symbolicname=CALL_CAPI Language=German Anruf an CAPI . MessageID=0x2003 Symbolicname=CALL_PROCESS Language=German Anruf verarbeiten . MessageID=0x3000 Symbolicname=ERR_CAPI Language=German Capi Fehler . MessageID=0x3001 Symbolicname=ERR_PATH Language=German Speicherpfad kann nicht erstellt weren . MessageID=0x3002 Symbolicname=ERR_NOCAPI Language=German Keine CAPI gefunden . MessageID=0x3003 Symbolicname=ERR_UDP Language=German UDP_Empfangs_Port ist 0 .
Delphi-Quellcode:
const
CAT_ALL :WORD =$1; CAT_CALL :WORD =$2; CAT_LIC :WORD =$3; CAT_INFO :WORD =$4; CAT_ERR :WORD =$5; LIC_INFO :DWORD =$00001000; LIC_EXP :DWORD =$00001001; CALL_SIG :DWORD =$00002000; CALL_DBL :DWORD =$00002001; CALL_CAPI :DWORD =$00002002; CALL_PROCESS :DWORD =$00002003; ERR_CAPI :DWORD =$00003000; ERR_PATH :DWORD =$00003001; ERR_NOCAPI :DWORD =$00003002; ERR_UDP :DWORD =$00003003;
Delphi-Quellcode:
Und Laut XNResourceEditor ist die mc-Datei auch passig in meine exe gelinkt (s. Anhang).
self.LogMessage(LizenzMessage, EVENTLOG_INFORMATION_TYPE, CAT_LIC, LIC_INFO); //self. weil, ist ja eine Serviceanwendung
|
AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
Ich verwende die Funktion "LogMessage" aus dem Luckies Tutorial, dass Du oben verlinkt hast, seit Jahren ohne Probleme.
Vielleicht wäre es einen Versuch wert, diese Funktion statt TService.LogMessage zu nehmen. |
AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
Das gleiche Ergebnis. In muss also irgendwo einen logischen Fehler gemacht haben. Ich weiß nur nicht wo. Ich such mir schon den ganzen Tag nen Wolf. Habe mittlerweile so ziemlich alle Seiten gelesen, die ich im Internet finden konnte, wo das Thema auch nur ansatzweise angerissen wird. Ich komm nicht dahinter.
Ich werde gleich noch mal meine ganzen MessageID's fortlaufend durchnummerieren mit 1 beginnend, für den Fall, dass da irgendwas klemmt, aber soweit ich das sehen, sollte doch auch in den MessageID's der mc-Datei DWORD verwendet werden. Eine andere Erklärung finde ich nicht. Recourse wird korrekt eingelinkt. Die Registry-Einträge passen auch (das merke ich daran, dass meine Service.exe immer vom Eventlog-Dienst geöffnet ist, und ich sie erst überschreiben kann, wenn ich nach dem uninstall den Eventlog-Dienst neustarte). |
AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
Ich habe auch grad noch mal versucht, ob's vielleicht funktioniert, wenn ich die Resouce in eine DLL packe. Ist aber das gleiche. Ich beiße hier gleich in den Tisch :evil:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz