PowerBuilder – Writing to the Windows Event Log
Here are two ways to write to the Event log in Windows and indicate the source of the message.
Reportevent External Function and Eventcreate command line command
You can use the command shell to do this too but this has the drawback of not being able to assign the source of the event.
First you need the following External Functions:
Function ulong RegisterEventSource ( & ulong lpUNCServerName, & string lpSourceName & ) Library "advapi32.dll" Alias For "RegisterEventSourceW" Function boolean ReportEvent ( & ulong hEventLog, & uint wType, & uint wCategory, & ulong dwEventID, & ulong lpUserSid, & uint wNumStrings, & ulong dwDataSize, & string lpStrings[], & ulong lpRawData & ) Library "advapi32.dll" Alias For "ReportEventW" Function boolean DeregisterEventSource ( & ref ulong hEventLog & ) Library "advapi32.dll"
Then in PowerScript
integer li_messagelevel string ls_errmsg[] string ls_messagesource ulong lul_eventsource // the event message is here ls_errmsg[1] = "Event Log Entry " + String(now(), 'hh:mm:ss') // setting the source of the message ls_messagesource = this.classname() lul_eventsource = RegisterEventSource(0, ls_messagesource) IF IsNull(ls_eventsource) THEN ls_eventsource = -1 // set the level of the message li_messagelevel = 4 // Information, also 1 = Error, 2 = Warning IF lul_eventsource > 0 THEN // write to the log ReportEvent(lul_eventsource, li_messagelevel, 0, 0, 0, & UpperBound(ls_errmsg), 0, ls_errmsg, 0) DeregisterEventSource(lul_eventsource) END IF
Viewing the Log
Per the MSDN documentation, if the source name cannot be found the event logging service uses the Application log. Although events will be reported , the events will not include descriptions because there are no message and category message files for looking up descriptions related to the event identifiers.
Thanks to Roland Smith for most of the code for this functionality.
You are also able to use the ‘EVENTCREATE’ command line command.
From the Microsoft Technet page (found Here):
Enables an administrator to create a custom event in a specified event log. Syntax eventcreate [/s Computer [/u Domain\User [/p Password]] {[/l {APPLICATION|SYSTEM}]|[/so SrcName]} /t {ERROR|WARNING|INFORMATION|SUCCESSAUDIT|FAILUREAUDIT} /id EventID /d Description Top of page Parameters /s Computer : Specifies the name or IP address of a remote computer (do not use backslashes). The default is the local computer. /u Domain \ User : Runs the command with the account permissions of the user specified by User or Domain\User. The default is the permissions of the current logged on user on the computer issuing the command. /p Password : Specifies the password of the user account that is specified in the /u parameter. /l { APPLICATION | SYSTEM } : Specifies the name of the event log where the event will be created. The valid log names are APPLICATION and SYSTEM. /so SrcName : Specifies the source to use for the event. A valid source can be any string and should represent the application or component that is generating the event. /t { ERROR | WARNING | INFORMATION | SUCCESSAUDIT | FAILUREAUDIT } : Specifies the type of event to create. The valid types are ERROR, WARNING, INFORMATION, SUCCESSAUDIT, and FAILUREAUDIT. /id EventID : Specifies the event ID for the event. A valid ID is any number from 1 to 65535. /d Description : Specifies the description to use for the newly created event. /? : Displays help at the command prompt.
In PowerScript:
// command line event log integer li_rtn string ls_msg, ls_eventmsg ls_msg = 'Command Line Message' ls_EventMsg = 'EVENTCREATE /T ERROR /ID 100 /SO "My Application" /l APPLICATION /D "' +ls_msg + '" ' li_Rtn = Run (ls_EventMsg, Minimized!) IF li_Rtn <> 1 THEN messagebox('event log', 'error loging msg') END IF
And the message in the Event Log viewer
To use this the user must be an administrator on the machine or you have to provide the id/password combination of one.
Thanks to Kyle Griffis for this tip.