Entwickler-Ecke

Windows API - EventLog Schreiben


FrEEzE2046 - Do 16.07.09 10:32
Titel: EventLog Schreiben
Hallo zusammen,

ich habe mir sehr viele Tutorials und Threads durchgelesen, komme aber einfach nicht darauf, was ich falsch mache.
Ich möchte im Prinzip einfach einen Informationseintrag in der Ereignisanzeige protokollieren.

Dafür habe ich mir zu erst eine TextDatei mit folgendem Inhalt erstellt:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
LanguageNames=(German=0x407:MSG00407)

MessageId=0x1
SymbolicName=First_CAT
Language=German
Erste Kategorie
.

MessageId=0x10
SymbolicName=Firt_Msg
Language=German
Eintrag: %1
.


und anschließend als *.mc-Datei abgespeichert. Diese habe ich dann mit dem Message Compiler kompiliert und die entstandene *.rc Datei anschließend mit dem Ressource Compiler in eine *.res-Datei gewandelt.

Diese habe ich per Compiler-Direktive in meine Main-Unit eingebunden.
Anschließend habe ich noch folgende Registrierungseinträge gesetzt:

Windows Registry Editor Version 5.00


Quelltext
1:
2:
3:
4:
5:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\report]
"EventMessageFile"="\"C:\\%PATH%\\report.exe\""
"TypesSupported"=dword:00000000
"CategoryCount"=dword:00000001
"CategoryMessageFile"="\"C:\\%PATH%\\report.exe\""



Mein Code sieht folgendermaßen aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
unit ErrorReport;

interface

uses
  Windows;

  function LogEvent( ComputerName: String; EventType, CategoryID: Integer; MessageID: Cardinal; Parameter: String): DWORD;
  function GetMachineName(): String;

  
implementation

  function LogEvent( ComputerName: String; EventType, CategoryID: Integer; MessageID: Cardinal; Parameter: String): DWORD;
  var
    hEventLog : THandle;
    MsgArray  : array[0..0of PChar;
  begin
    result    := 0;
    hEventLog := OpenEventLogA( PChar(ComputerName), PChar('report') );

    if( hEventLog <> 0 ) then
    begin
      MsgArray[0] := PChar(Parameter);

      if not( ReportEventA(hEventLog, EventType, CategoryID, MessageID, nil10, @MsgArray, nil) ) then
        result := GetLastError();
      CloseEventLog( hEventLog );
    end
    else
      result := GetLastError();
  end;

  function GetMachineName(): String;
  var
    Size: DWORD;
  begin
    Size := MAX_COMPUTERNAME_LENGTH + 1;
    SetLength( result, Size );
    if GetComputerNameA( PChar(result), Size ) then
      SetLength( result, Size )
    else
      result := '';
  end;

end.


Und so rufe ich das Ganze zum testen auf:


Delphi-Quelltext
1:
2:
3:
4:
5:
  LogEvent( GetMachineName(),
            EVENTLOG_SUCCESS,
            1,
            1,
            'Neue Datei gefunden' );




Ich bekomme aber immer folgenden Text in der Beschreibugn angezeigt:
Die Beschreibung der Ereigniskennung ( 1 ) in ( report ) wurde nicht gefunden. Der lokale Computer verfügt nicht über die zum Anzeigen der Meldungen von einem Remotecomputer erforderlichen Registrierungsinformationen oder DLL-Meldungsdateien. Möglicherweise müssen Sie das Flag /AUXSOURCE= zum Ermitteln der Beschreibung verwenden. Weitere Informationen stehen in Hilfe und Support. Ereignisinformationen: Neue Datei gefunden.


Ich habe auch schon versucht, das ganze als DLL zu kompilieren und diese dann in den Pfaden für die Registry anzugeben ... das führte aber zu selbigem Ergebnis.

Was mache ich falsch?


Delete - Do 16.07.09 11:54

Das kennst du auch schon: http://www.michael-puff.de/Artikel/ReportEvent.shtml


FrEEzE2046 - Do 16.07.09 15:19

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Das kennst du auch schon: http://www.michael-puff.de/Artikel/ReportEvent.shtml


Ja, ich habe mich unter anderem dort heran orientiert, als meine eigenen Versuche nicht klappen wollten. Allerdings besteht der Fehler weiterhin, obwohl ich alles so gemacht habe, wie es dort steht.