Entwickler-Ecke

Windows API - Format_Message bei Auslesen von Event Logs


Jim_Knopf - Do 06.07.06 15:24
Titel: Format_Message bei Auslesen von Event Logs
Hallo zusammen! :-)

Ich bin gerade dabei eine Prozedur zu schreiben, die Windows Event Logs ausliest und die Records anschliessend schön aufbereitet in HTML ausgeben soll.
Um die kompletten Messagestrings für jeden Event zu erhalten benötigt man ja diverse Msg-dlls aus dem System32 Ordner.
Nun will ich mit der win-api function FORMAT_MESSAGE die Strings erzeugen.




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
hModule := LoadLibraryEx(MessageFileFN, 0,  LOAD_LIBRARY_AS_DATAFILE);

if hModule <> 0 then

    NumCharsMsg := FormatMessage(

      FORMAT_MESSAGE_ALLOCATE_BUFFER or
      FORMAT_MESSAGE_FROM_HMODULE or
      FORMAT_MESSAGE_ARGUMENT_ARRAY,
      Pointer(hModule),
      EventID,
      0,
      Pchar(@MsgBuf),
      0,
      ArgsBuffer);


Das funktioniert auch solange die EventIds zweistellig sind. Aber alle größeren EventIds (und die meisten sind 4-stellig) liefert mir FormatMessage immer 0 zurück und ei GetLastError bringt Fehler Nummer 317, welcher folgendes bedeutet:

The system cannot find message text for message number 0x%1 in the message file for %2. ERROR_MR_MID_NOT_FOUND


Vielen dank,

Gruss,
Jim Knopf


Jim_Knopf - Do 06.07.06 15:52

Update:


Ich seh gerade dass es nicht an der Anzahl der Stellen der EventIds liegt, sondern an der Source des Events.
Nur die Source "Windows Update Agent" liefert Ergebnisse, alle anderen Sourcen funktionieren nicht.

Der zugehörige EventMessageFile zum Windows Update Agent ist laut Registry C:\WINDOWS\system32\wuaucpl.cpl

Andere EventMessageFiles/Dlls wie z.B. C:\WINDOWS\system32\netevent.dll, C:\WINDOWS\system32\w32time.dll oder c:\windows\System32\spmsg.dll funktionieren nciht..... :-/


Delete - Do 06.07.06 16:17

Meines Wissens entsprechen die EventIDs keinen Windows Fehlercode (Sagt ja schon der Name: EventID.), wie in GetLastError liefert. Mit FormatMessage dürfte da nichts zu holen sein. Für EventIDs kenne ich nur diese Seite: http://www.eventid.net/