Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige (https://www.delphipraxis.net/194313-tservice-logmessage-erzeugt-das-handle-ist-ungueltig-ereignisanzeige.html)

Hobbycoder 8. Nov 2017 06:59

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 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.

rwalper 8. Nov 2017 07:52

AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
 
Wie sieht denn die Funktion "LogMessage" aus?

Hobbycoder 8. Nov 2017 08:50

AW: TService.LogMessage erzeugt "Das Handle ist ungültig" in Ereignisanzeige
 
Das ist keine eigene, sondern die von TService.

SebastianZ 8. Nov 2017 08:59

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

Zitat von Hobbycoder (Beitrag 1385569)
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.

Hobbycoder 8. Nov 2017 09:17

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 siehe hier, sollte es ja auch so gehen.

Hobbycoder 8. Nov 2017 12:13

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

rwalper 8. Nov 2017 13:35

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.

Hobbycoder 8. Nov 2017 13:57

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).

Hobbycoder 8. Nov 2017 14:09

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