AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
Thema durchsuchen
Ansicht
Themen-Optionen

TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige

Ein Thema von Hobbycoder · begonnen am 8. Nov 2017 · letzter Beitrag vom 8. Nov 2017
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#1

TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige

  Alt 8. Nov 2017, 06:59
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 Tutorial sehr gut beschrieben.

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:
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
Dann habe ich mir eine TestServerEventLog.mc mit folgendem Inhalt angelegt:
Code:
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
.
diese mit mc und brcc32 in eine TestAnwendungEnventLog.res übersetzt und in die Mainunit des Service eingebunden.

Und mit dieser Funktion
Delphi-Quellcode:
  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);
schreiben ich nun meinen Eintrag ins EreignisLog. Er kommt auch an, aber nicht so wie ich möchte.

Code:
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
Ich muss ja einen Fehler gemacht haben. Nur erkenne ich ihn nicht. Vielleicht hat jemand einen Tipp für mich.

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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
rwalper

Registriert seit: 6. Sep 2006
45 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige

  Alt 8. Nov 2017, 07:52
Wie sieht denn die Funktion "LogMessage" aus?
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#3

AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige

  Alt 8. Nov 2017, 08:50
Das ist keine eigene, sondern die von TService.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
SebastianZ

Registriert seit: 23. Jul 2009
89 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige

  Alt 8. Nov 2017, 08:59
Hi,

Delphi-Quellcode:
  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);

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.
Zu deinen Problemen:

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.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#5

AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige

  Alt 8. Nov 2017, 09:17
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

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 siehe hier, sollte es ja auch so gehen.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#6

AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige

  Alt 8. Nov 2017, 12:13
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:
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
.
Und in Delphi hab ich das hier:
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;
self.LogMessage(LizenzMessage, EVENTLOG_INFORMATION_TYPE, CAT_LIC, LIC_INFO); //self. weil, ist ja eine Serviceanwendung Und Laut XNResourceEditor ist die mc-Datei auch passig in meine exe gelinkt (s. Anhang).
Miniaturansicht angehängter Grafiken
2017-11-08-13_11_41-amservice.exe-xn-resource-editor.png  
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
rwalper

Registriert seit: 6. Sep 2006
45 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige

  Alt 8. Nov 2017, 13:35
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.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#8

AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige

  Alt 8. Nov 2017, 13:57
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).
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#9

AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige

  Alt 8. Nov 2017, 14:09
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
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz