): 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\[servicename]
This key holds the following values:
(REG_EXPAND_SZ) EventMessageFile  value: [application filename]
(REG_DWORD)     TypesSupported    value: 7
Note: The [application filename] must contain the complete path + file specification.
The next thing to do is to write a file to hold the predefined message strings:
;// -- log_event.mc ------------------------------------------------------------
;// 
;// This file contains predefined messages
;//
;// ----------------------------------------------------------------------------
;
MessageIdTypedef=DWORD
;
;
;///////////////////////////////////////////////////////////////////////////////
;//
;// Information Messages
;//
;///////////////////////////////////////////////////////////////////////////////
;
MessageId=0
Severity=Informational
Facility=Application
;SymbolicName=INF_xxxx
Language=English
Hello world (%1!s!).
.
;
compile this file using the message compiler MC.EXE and also generate a header file to show the event-id's that you need to pass with the ReportEvent function.
mc -o log_event.mc
Now you have a log_event.rc resource file that you need to compile to get a linkable object file.
rc -r -dWin32 -fo log_event.tmp log_event.rc
Convert the object file using cvtres.exe and delete the temporary file
cvtres -i386 log_event.tmp -o log_event.rbj
del log_event.tmp
The resulting .RBJ file can be linked with your application.  Here's an example application that logs an event.
   with System;
   with Text_IO;
   with Win32;
   with Win32.Winbase;  use Win32.Winbase;
   with Win32.Winnt;    use Win32.Winnt;
   use type System.Address;
   use type Win32.DWORD;
   procedure Log_Event is
   pragma Linker_Options ("log_event.rbj");
      type LPSTR_Array is array (natural range <>) of aliased Win32.LPCSTR;
      WindowsNT    : Boolean;
      hEventSource : Win32.Winnt.HANDLE;
      lpszStrings  : aliased LPSTR_Array (1 .. 1);  -- Parameter(s) to the message
      fResult      : Win32.BOOL;
      dwEvent_Id   : Win32.DWORD := Win32.DWORD (16#40000000#);
      wType        : Win32.WORD  := Win32.Winnt.EVENTLOG_INFORMATION_TYPE;
      Service_Name : String := "Log_Event";
      Message      : String := "Event";
   begin
      WindowsNT := (Win32.Winbase.GetVersion < 16#80000000#);
      if not WindowsNT then
         Text_IO.Put_Line ("Eventlogging only supported on Windows NT");
      else
         declare
               --internal name of the service
            RegServiceName  : constant String := Service_Name & ascii.nul;
            CMessage        : constant String := Message & ascii.nul;
         begin
               -- Use event logging to log the error.
            hEventSource := Win32.Winbase.RegisterEventSource
                               (NULL,                         -- On local machine (otherwise supply 
                                                              -- UNC name of the NT server)
                                Win32.Addr (RegServiceName)); -- Name of source (in registry)
            lpszStrings(1) := Win32.Addr (CMessage);
            --lpszStrings(2) := Win32.Addr (...);
            if hEventSource /= System.null_address then
               fResult := Win32.Winbase.ReportEvent
                             (hEventSource,             -- handle of event source
                              wType,                    -- event type
                              0,                        -- event category
                              dwEvent_Id,               -- event ID
                              System.null_address,      -- current user's SID
                              lpszStrings'Length,       -- strings in lpszStrings
                              0,                        -- no bytes of raw data
                              lpszStrings(1)'access,    -- array of error strings
                              System.null_address);     -- no raw data
               fResult := Win32.Winbase.DeregisterEventSource(hEventSource);
            else
               Text_IO.Put_Line ("Unable to register the eventsource");
            end if;
         end;
      end if;
   end Log_Event;
Next compile and link this program.  In this case I used GNAT 3.11. Other compilers may have a different way to link 
resources to the executable.
gnatmake log_event
Now use the Regedit32 registry editor and create the key:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\Log_Event
values:
(REG_EXPAND_SZ) EventMessageFile  value: c:\...\Log_Event.exe
(REG_DWORD)     TypesSupported    value: 7