Delphi TEventLogger

MEINserver Service – Logmeldungen werden über TEventLogger ausgegeben.

Damit die Ereignisanzeige nicht mit den Worten beginnt:

Die Beschreibung für die Ereignis-ID „0“ aus der Quelle „MEINserver“ 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 Anzeigeinforma­tionen mit dem Ereignis gespeichert werden. Die folgenden Informationen wurden mit dem Ereignis gespeichert:

muss eine res-Datei erstellt und für die Ereignisanzeige zur Verfügung gestellt werden.

Die Datei meinServer_Mes­sage.mc erstellen. (Bitte den Punkt und die Leerzeile nach jedem beachten)

LanguageNames=(German=0x407:MSG00407)

MessageId=0x2
SymbolicName=Kategorie_1
Language=German
Kategorie 1
.

MessageId=0x10
SymbolicName=MSG_SERVER_MELDUNG
Language=German
MEINserver: %1
.

Mit Hilfe von mc.exe und brcc32.exe die Datei meinServer_Mes­sage.res erzeugen. (mc.exe stammt aus dem Microsoft Windows 10 SDK )

@"c:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86\mc.exe" meinServer_Message.mc
@brcc32 meinServer_Message.rc -fo meinServer_Message.res
@pause

Die Resourcendatei im Projekt einbinden

program meinServer;

uses
  SvcMgr,
  ...
  tools_web in '..\tools\tools_web.pas';

{$R *.res}
{$R meinServer_Message.res}

begin
  if not SvcMgr.Application.DelayInitialize or SvcMgr.Application.Installing then
    SvcMgr.Application.Initialize;
  SvcMgr.Application.CreateForm(TmeinServe, meinServer);
  SvcMgr.Application.Run;
end.

Beim Setup des Services muss die Message-Datei in die Registry eingetragen werden:

const
  cEventLogger_MEINserver = 'MEINserver';
  cEventLogger_MEINserver_Category = $02;
  cEventLogger_MEINserver_ID = $20;


procedure WriteRegistryFuerEventlog(reg: TRegistry);
const
  REG_CategoryCount = 'CategoryCount';
  REG_TypesSupported = 'TypesSupported';
  REG_EventMessageFile = 'EventMessageFile';
  REG_CategoryMessageFile = 'CategoryMessageFile';
  cCategoryCount = 1;
  cTypesSupported = 0;
var
  aMessageFile: string
begin
  aMessageFile := ExtractFilePath(Application.ExeName) + 'meinServer.exe';

  reg.RootKey := HKEY_LOCAL_MACHINE;
  if reg.OpenKey('SYSTEM\CurrentControlSet\Services\Eventlog\Application\' + cEventLogger_MEINserver, True) then
  begin
    if reg.ValueExists(REG_CategoryCount) then
    begin
      if reg.ReadInteger(REG_CategoryCount) <> cCategoryCount then
        reg.WriteInteger(REG_CategoryCount, cCategoryCount);
    end
    else
    begin
      reg.WriteInteger(REG_CategoryCount, cCategoryCount);
    end;
    if reg.ValueExists(REG_TypesSupported) then
    begin
      if reg.ReadInteger(REG_TypesSupported) <> cTypesSupported then
        reg.WriteInteger(REG_TypesSupported, cTypesSupported);
    end
    else
    begin
      reg.WriteInteger(REG_TypesSupported, cTypesSupported);
    end;
    if reg.ValueExists(REG_EventMessageFile) then
    begin
      if reg.ReadString(REG_EventMessageFile) <> aMessageFile then
        reg.WriteString(REG_EventMessageFile, aMessageFile);
    end
    else
    begin
      reg.WriteString(REG_EventMessageFile, aMessageFile);
    end;
    if reg.ValueExists(REG_CategoryMessageFile) then
    begin
      if reg.ReadString(REG_CategoryMessageFile) <> aMessageFile then
        reg.WriteString(REG_CategoryMessageFile, aMessageFile);
    end
    else
    begin
      reg.WriteString(REG_CategoryMessageFile, aMessageFile);
    end;
  end
  else
  begin
    abort;
  end;
end;

Anzeige der Meldungen in der Power-Shell

Get-EventLog -LogName Application -Source HEIMserver | format-table -wrap

Literatur