views:

785

answers:

3

I'm looking for a (fairly pain-free) means of adding some Windows Application Event-Log support to a small legacy Delphi 5 application. We just want it to log when it starts-up, shuts-down, fails to connect to a database etc.

Several of the solutions/components I've seen seem to suggest that we'll need to make a resource DLL which the Windows Event Log Viewer will link to when trying to read our 'entries'. While this doesn't seem too onerous, I guess it's something else to keep in mind if/when we further develop the application in future - we'll need to keep this DLL up to date.

At some point in the future we will want to turn the application into a service, probably written in D2007.

So can anyone recommend a suitable route for adding events to the event log in D5? I'm looking for specific 'we used this and it was okay' comments rather than a Google trawl (which I can do myself!) Free or paid-for, really don't mind - but something that I could migrate to D2007 in the future is important.

+1  A: 

I use standard VCL for this in Delphi 6, I can't tell you whether or not this is available in Delphi 5. Try it for yourself and let us know if this stuff is there in D5.

  1. Declare a global/form variable of type TEventLogger. This is declared in the SvcMgr unit so this unit will need to be added to your uses list. If this is a normal application (i.e. not a Service) then make sure SvcMgr is added after the Forms unit.

    MyEventLog: TEventLogger;

  2. Create an instance of the logger.

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

  3. To write to the event log:

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

  4. Don't forget to release it at the end:

    MyEventLog.Free;

There is other stuff you need to do to register the application with the Windows Event Log so that the message appears without this in front of it:

The description for Event ID ( 1000 ) in Source ( Microsoft Internet Explorer ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. The following information is part of the event:

_J_
Thanks - between this and Peter McMinn's answer I've got going. I'll come back and post an update with some info about setting up the registry/resource DLL once I've got it all working. Thanks again!
robsoft
+2  A: 

For simple event logging in D5, I have used the following code to add messages to the Applications log.

  • Add "SvcMgr" to the uses clause
  • Use this code to add your text message and an ID number (last parameter on LogMessage lines)

    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;
    
Peter McMinn
Thanks Peter - worked a treat. I'm just getting my head around what I need to do with the registry and resource DLLs to make it all clean and tidy. Cheers, Rob
robsoft
Could you please tell which Windows Lib contains these functions? I really doubt it is smart idea to add whole unit !!! to use only few !!! functions within it ... Is it advapi32.dll or winnt.dll ... or which? Thanks in advance ...
HX_unbanned
A: 

Thanks to J and Peter's responses, I got my code writing into the event log straight away. There is a little bit more to do, particularly if you want your events to appear 'nicely' in the event log without a standard windows message about not being able to find the description (as per the bottom of J's post).

I followed the tips here to making a suitable DLL and entering it into the registry, and very quickly had it all sorted out.

This was all in Delphi5, as per the question, but I've seen nothing that makes me think it wouldn't also work in D2007.

robsoft
I accepted this as my answer simply because it wraps-up J and Peter's response and links to the other bits and pieces you have to do. I'm not going to gain any rep from it :-)
robsoft