• Start
  • über mich
  • Projekte
  • »Artikel«
  • Impressum
  • Qooxdoo
  • AJAX, eine saubere Sache
  • Das Dreamteam
  • Dublettenabgleichen
  • »Meldungen ins Eventlog«
  • Snippets

no software patents
get firefox browser

Wie bekomme ich einen Eintrag in Eventlog von Windows ?

Microsoft stellt hierzu API-Funktionen zur Verfügung. Um Speicherplatz im Eventlog zu sparen hat MS sich einen kleinen Trick ausgedacht. Die Texte die im Eventlog auftauchen sind nur Verweise auf eine Resource. Dieses Resource enthällt dann Standarttexte welche mit Platzhaltern aufgefüllt werden können.

Beispiel:

Das Programm <Platzhalter1> versuchte vergeblich sich mit dem Server <Platzhalter2> zu verbinden.

Nun braucht das Eventlog sich nur zu merken Nachricht Nr. X + Platzhalter1 + Platzhalter2. Um die Resource erzeugen zu können müssen sie sich den Message Compiler (MC.EXE) aus dem Microsoft Plattform SDK von der MS-Homepage runterladen.

Der Compiler wird mit einer Message Compiler Source File (<name>.MC) gefüttert. Bei dem Compiler liegt eine Hilfedatei bei welche die genaue Syntax erklärt. Ich werde jetzt hier nur auf ein kleines Beispiel eingehen.

LanguageNames=(German=0x407:MSG00407)
MessageId=1
SymbolicName=evt_Hauptprogramm
Language=German
Hauptprogramm
.

MessageId=1001
Language=German
Das Programm %1 versuchte vergeblich sich mit dem Server %2 zu verbinden.
.

Der erste Teil mit LanguageNames gibt an welche Sprache Verfügbar ist.

Die nächsten Zeilen definieren eine Kategorie für die Fehlermeldung. "evt_Hauptprogramm" ist eine Konstante die frei gewählt werden kann. Diese dient eigendlich dazu um eine Headerdatei für C(++) automatisch mit anzulegen, wo die Kategorie als Konstante zu der einfachen Benutzung abgelegt ist. Die Zeile kann auch weg gelassen werden.

"Hauptprogamm" ist die Kategorie welche auch frei vergeben werden kann.

MessageId ist eine eindeuteige Zahl welche eine Message identifiziert. Sie ist der Schlüssel der im Eventlog gespeichert wird. Wichtig sind der Punkt und die anschliessende Leerzeile. An diesen erkennt der Compiler das Ende eine Kategorie bzw. Nachricht. Der Unterschied zwischen Kategorie und Nachricht besteht darin, daß Kategorien von 1 bis n gehen und n später in der Registry vermerkt werden muss. Die Messageid muss kleiner als 65536 sein (16 bit). Eine Nachricht darf bis zu 99 Parameter haben (%1 .. %99)

Nun zu der Registry in dieser muss eintragen werden wo sie die Compilierte Resource befindet. Normalerweise ist dieses die Anwendung und/oder eine DLL.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application

Unterhalb dieses Schlüssel fügenen Sie einen weiteren Schlüssel hinzu, welchen sie frei wählen dürfen (z.b. meinefehlermeldungen). In ihren Schlüssel fügen sie nun noch folgende Werte hinzu:

NameArtWert
CategoryCountDWORD<Anzahl der Kategorien>
(in unseren Beispiel = 1)
TypesSupportedDWORD0
CategoryMessageFileString<Pfad zu der Exe/Dll>
EventMessageFileString<Pfad zu der Exe/Dll>

Nun der Delphicode um die Resource der Exe / Dll :

Die nachstehende Zeile fügen sie in die DPR ein. Hiermit kann Delphi die RC Datei automatisch in eine RES Datei umwandeln und diese dann linken.

{$R '<name>.res' '<name>.rc'}

Name ersetzten sie bitte durch den Namen ihrer MC Datei ohne der Endung ".MC".

Folgende Typen von Eventlogeinträge gibt es:

EVENTLOG_ERROR_TYPE
EVENTLOG_WARNING_TYPE
EVENTLOG_INFORMATION_TYPE
EVENTLOG_AUDIT_SUCCESS
EVENTLOG_AUDIT_FAILURE

Diese können als Konstante im Delphicode benutzt werden.

const
cSourceName :string = 'meinefehlermeldungen';

procedure LogMessage(typ, kategorienr :word; nachrichtnr:Cardinal; parameter1, parameter2:String);
var 
  log : THandle;
  pmsgArray : array[0..1] of PChar;
begin
  log:=OpenEventLog(nil, pchar(cSourceName));
  if log>0 then
  try
    pmsgArray[0]:=PChar(parameter1);
    pmsgArray[1]:=PChar(parameter2);
    ReportEvent(log, typ, kategorienr, nachrichtnr, nil, 2,0,@pmsgArray,nil);
  finally
    CloseEventLog(log);
  end;
end;

Das Array braucht nur so viele Elemente wie sie Parameter benutzen. In diesem Beispiel sind es nur 2. In der Funktion Reportevent gibt die 2 an, dass es sich um 2 Parameter handelt.

LogMessage(EVENTLOG_INFORMATION_TYPE, 1, 1001, 'Hallo', 'Ballo');

Diese Funktion fügt nun einen Eintrag dem Fehlerprotokoll hinzu.