Reequipamiento de Windows registro de eventos para una aplicación Delphi 5
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.
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.
-
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;
-
Crea una instancia de la logger.
MyEventLog: = TEventLogger.Create ( 'MyApplication');
-
Para escribir en el registro de sucesos:
MyEventLog.LogMessage ( 'MyApplication empezar.'), EVENTLOG_INFORMATION_TYPE);
-
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: