Pregunta

Estoy buscando un (relativamente sin dolor) mediante la adición de un poco de apoyo de aplicaciones de Windows de eventos del registro de una pequeña herencia Delphi 5 aplicación. Sólo queremos que ingrese cuando empieza arriba, cierra hacia abajo, no se puede conectar a una base de datos, etc.

Varias de las soluciones / componentes que he visto parecen sugerir que tendremos que hacer una DLL de recursos, que Windows Event Log Viewer unirá a al intentar leer nuestras entradas ''. Si bien esto no parece demasiado oneroso, supongo que es algo más que tener en cuenta si / cuando desarrollamos aún más la aplicación en el futuro - vamos a necesitar para mantener esta DLL hasta la fecha.

En algún momento en el futuro vamos a querer convertir la aplicación en un servicio, probablemente escrito en D2007.

Así que cualquier persona puede recomendar una ruta adecuada para añadir eventos al registro de eventos en D5? Busco específica ' Se utilizó este y estaba bien los comentarios en lugar de una red de arrastre Google (que puedo hacer yo mismo!) Gratuito o de pago-por, realmente no importa - pero algo que podría migrar a D2007 en el futuro es importante.

¿Fue útil?

Solución 4

Gracias a J y las respuestas de Pedro, tengo mi código de la escritura en el registro de eventos de inmediato. Hay un poco más por hacer, sobre todo si desea que sus eventos aparezcan 'muy bien' en el registro de eventos sin un mensaje estándar de Windows por no ser capaz de encontrar la descripción (de acuerdo con la parte inferior de J 'poste s).

He seguido los consejos aquí a hacer una DLL adecuado y entrar en el registro, y muy pronto lo tenía todo resuelto.

Esto fue todo en Delphi5, según la pregunta, pero no he visto nada que me hace pensar que no sería también trabajar en D2007.

Otros consejos

Resumen: escribir en el registro de sucesos de Windows usando Delphi


Si usted está escribiendo un servicio de Windows y la necesidad de escribir al registro de eventos de Windows de la máquina local, entonces se puede llamar TService. Mensaje de registro como aquí .

//TMyTestService = class(TService)

procedure TMyTestService.ServiceStart(Sender: TService; var Started: Boolean);
begin
  LogMessage('This is an error.');
  LogMessage('This is another error.', EVENTLOG_ERROR_TYPE);
  LogMessage('This is information.', EVENTLOG_INFORMATION_TYPE);
  LogMessage('This is a warning.', EVENTLOG_WARNING_TYPE);
end;

Para cualquier otro tipo de aplicaciones que puede utilizar el administrador de servicios. TEventLogger indocumentado clase de ayuda para TService a escribir el registro de eventos de Windows de la máquina local como se mencionó aquí , aquí y aquí .

uses
  SvcMgr;

procedure TForm1.EventLoggerExampleButtonClick(Sender: TObject);
begin
  with TEventLogger.Create('My Test App Name') do
  begin
    try
      LogMessage('This is an error.');
      LogMessage('This is another error.', EVENTLOG_ERROR_TYPE);
      LogMessage('This is information.', EVENTLOG_INFORMATION_TYPE);
      LogMessage('This is a warning.', EVENTLOG_WARNING_TYPE);
    finally
      Free;
    end;
  end;
end;

También puede utilizar la API de Windows ReportEvent función como se ha mencionado aquí y aquí .

He creado una clase simple para que sea más fácil, es disponible en GitHub .

//----------------- EXAMPLE USAGE: ---------------------------------

uses
  EventLog;

procedure TForm1.EventLogExampleButtonClick(Sender: TObject);
begin
  TEventLog.Source := 'My Test App Name';

  TEventLog.WriteError('This is an error.');
  TEventLog.WriteInfo('This is information.');
  TEventLog.WriteWarning('This is a warning.');
end;

//------------------------------------------------------------------


unit EventLog;

interface

type
  TEventLog = class
  private
    class procedure CheckEventLogHandle;
    class procedure Write(AEntryType: Word; AEventId: Cardinal; AMessage: string); static;
  public
    class var Source: string;
    class destructor Destroy;

    class procedure WriteInfo(AMessage: string); static;
    class procedure WriteWarning(AMessage: string); static;
    class procedure WriteError(AMessage: string); static;

    class procedure AddEventSourceToRegistry; static;
  end;

threadvar EventLogHandle: THandle;

implementation

uses Windows, Registry, SysUtils;

class destructor TEventLog.Destroy;
begin
  if EventLogHandle > 0 then
  begin
    DeregisterEventSource(EventLogHandle);
  end;
end;

class procedure TEventLog.WriteInfo(AMessage: string);
begin
  Write(EVENTLOG_INFORMATION_TYPE, 2, AMessage);
end;

class procedure TEventLog.WriteWarning(AMessage: string);
begin
  Write(EVENTLOG_WARNING_TYPE, 3, AMessage);
end;

class procedure TEventLog.WriteError(AMessage: string);
begin
  Write(EVENTLOG_ERROR_TYPE, 4, AMessage);
end;

class procedure TEventLog.CheckEventLogHandle;
begin
  if EventLogHandle = 0 then
  begin
   EventLogHandle := RegisterEventSource(nil, PChar(Source));
  end;
  if EventLogHandle <= 0 then
  begin
    raise Exception.Create('Could not obtain Event Log handle.');
  end;
end;

class procedure TEventLog.Write(AEntryType: Word; AEventId: Cardinal; AMessage: string);
begin
  CheckEventLogHandle;
  ReportEvent(EventLogHandle, AEntryType, 0, AEventId, nil, 1, 0, @AMessage, nil);
end;

// This requires admin rights. Typically called once-off during the application's installation
class procedure TEventLog.AddEventSourceToRegistry;
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('\SYSTEM\CurrentControlSet\Services\Eventlog\Application\' + Source, True) then
    begin
      reg.WriteString('EventMessageFile', ParamStr(0)); // The application exe's path
      reg.WriteInteger('TypesSupported', 7);
      reg.CloseKey;
    end
    else
    begin
      raise Exception.Create('Error updating the registry. This action requires administrative rights.');
    end;
  finally
    reg.Free;
  end;
end;

initialization

TEventLog.Source := 'My Application Name';

end.

ReportEvent admite la escritura una entrada de registro a registro de eventos ya sea una máquina de local o remoto. Para un ejemplo ver a distancia de John Kaster EDN artículo .


Nota que también tendría que crear un archivo de mensajes y registrar su origen del evento de lo contrario todos sus mensajes de registro va a empezar con algo como esto:

  

La descripción para xxx ID de evento de xxxx origen no puede ser   encontró. En el componente que provoca este evento no está instalado en   el equipo local o la instalación está dañada. Puede instalar   o reparar el componente en el equipo local.

     

Si el evento se originó en otro equipo, la información en pantalla   tuvo que ser salvado con el evento.

     

La siguiente información se incluye con el evento:

1, Para más información sobre cómo crear un archivo de mensajes ver de Finn Tolderlund tutorial o de Michael Hex artículo o puede utilizar un MC existente y RES incluidos en el proyecto de GitHub.

2, insertar un archivo los RES en su aplicación mediante la inclusión de los MessageFile.res en su archivo DPR. Como alternativa, puede crear un archivo DLL para los mensajes.

program MyTestApp;

uses
  Forms,
  FormMain in 'FormMain.pas' {MainForm},
  EventLog in 'EventLog.pas';

{$R *.res}
{$R MessageFile\MessageFile.res}

begin
  Application.Initialize;

3, el registro una vez-off requiere derechos de administrador escribir en el registro por lo que nosotros normalmente se realiza como parte del proceso de instalación de la aplicación.

//For example
AddEventSourceToRegistry('My Application Name', ParamStr(0));
//or
AddEventSourceToRegistry('My Application Name', 'C:\Program Files\MyApp\Messages.dll');

//--------------------------------------------------

procedure AddEventSourceToRegistry(ASource, AFilename: string);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('\SYSTEM\CurrentControlSet\Services\Eventlog\Application\' + ASource, True) then
    begin
      reg.WriteString('EventMessageFile', AFilename);
      reg.WriteInteger('TypesSupported', 7);
      reg.CloseKey;
    end
    else
    begin
      raise Exception.Create('Error updating the registry. This action requires administrative rights.');
    end;
  finally
    reg.Free;
  end;
end;

Si usted tiene necesidad de registro de eventos de Windows y otros requisitos de registro también se puede utilizar marcos de registro como log4d y TraceTool


aquí si quieres escribir en el registro de eventos ventana en el IDE de Delphi.

Para sencilla registro de eventos en D5, he utilizado el código siguiente para agregar mensajes a las solicitudes de registro.

  • Añadir "del administrador de servicios" a la cláusula uses
  • Utilice este código para añadir su mensaje de texto y un número de identificación (último parámetro en las líneas Mensaje de registro)

    with TEventLogger.create('My Application Name') do
    begin
      try
        LogMessage('Information Message!', EVENTLOG_INFORMATION_TYPE, 0, 1);
        LogMessage('Error Message!', EVENTLOG_ERROR_TYPE, 0, 2);
        LogMessage('Warning Message!', EVENTLOG_WARNING_TYPE, 0, 3);
        LogMessage('Audit Success Message!', EVENTLOG_AUDIT_SUCCESS, 0, 4);
        LogMessage('Audit Failure Message!', EVENTLOG_AUDIT_FAILURE, 0, 5);
      finally
        free;
      end;
    end;
    

Yo uso VCL estándar para esto en Delphi 6, no puedo decir si es o no está disponible en Delphi 5. Pruébelo usted mismo y hacernos saber si este material es allí en D5.

  1. Declarar una variable global / forma de tipo TEventLogger. Esto se declara en la unidad del administrador de servicios por lo que tendrá que ser añadido a la lista de usos de esta unidad. Si se trata de una aplicación normal (es decir, no un servicio), entonces Asegúrese de añadirle administrador de servicios después de la unidad de las formas.

    MyEventLog: TEventLogger;

  2. Crea una instancia de la logger.

    MyEventLog: = TEventLogger.Create ( 'MyApplication');

  3. Para escribir en el registro de sucesos:

    MyEventLog.LogMessage ( 'MyApplication empezar.'), EVENTLOG_INFORMATION_TYPE);

  4. No se olvide de liberar al final:

    MyEventLog.Free;

Hay otras cosas que hay que hacer para registrar la aplicación con el registro de eventos de Windows para que aparezca el mensaje sin que esto delante de él:

La descripción identificador de suceso (1000) en el origen (Microsoft Internet Explorer) no se puede encontrar. El equipo local no puede tener los archivos de información de registro o DLL de mensajes necesarios para mostrar mensajes desde un equipo remoto. La siguiente información es parte del evento:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top