To install WinEvent, run the supplied installation
      file and follow the prompts. 
    
     There are no WinEvent files that need to be
      distributed with your program.
      
    
     Included in the WinEvent package is a simple example
      program that demonstrates all of inEvent's features. This example is in
      the \Clarion\Examples\Winevent\Windemo directory and is called WinDemo. 
      
      There is also an example of a barcode collector program, which uses a RS
      232 Barcode reader attached via a USB cable. This is stored in \Clarion\Examples\Winevent\Barcode
      
    
     Many years ago a problem surfaced in Clarion 6
      programs running on Windows 7. The program would crash if the Right-Alt
      key on the 
      keyboard was pressed. Two (freeware) templates emerged (one by Carl
      Barnes, and one by Marius van den Berg) which solved the problem.
      
      In 2017 a similar problem emerged again, this time with Clarion programs
      running on Windows 10 (version 1607 or later). 
      
      While both templates from the Clarion 6 days are still available, and work
      well, this seemed like a good addition to WinEvent as well. 
      
      The option can be turned on (or off) globally. Local windows can be set to
      either use the global setting (Default) or explicitly turn the feature on
      or off.
    
    
      WinAlert functions
      
      Comms Functions
      
      Taskbar Functions
      
      Window Behaviour Functions
      
      Windows System Functions
      
      Time & Date Functions
      
      File Functions
      
      Registry Functions
      
      DLL Functions
      
      SMS Functions
      
      Debugging& Error Reporting Functions
      
      Queue Functions
      
      Other Functions
      
      WinAlert
       WinAlert (<Long
          FromMessage>, <Long ToMessage>, <Long Action>, <Long
          pField>, <Long pControlType> )  
          
          Parameters
        
          
            
              | Parameter | Description | 
            
              | FromMessage | The [first] Windows message to alert. | 
            
              | ToMessage | The last Windows message to alert. If this parameter is
                omitted then only the FromMessage is alerted. | 
            
              | Action | This defines the action required when the alerted message(s)
                are received. If this parameter is omitted then it defaults to
                PostUser + PassOn. 
 | 
            
              | pField | Only alert the message for a specific control on the window. | 
            
              | pControlType | Only alert the message for all the controls of this type on
                the window | 
          
        
        Description
        
        This function works in a very similar way to the normal Clarion 
ALERT
          function. Where the 
ALERT function
        traps keystrokes, the 
WINALERT function
        traps Windows Messages.
        
        However in addition to merely spotting the messages you can also specify
        the action required when the message comes along. The messages are
        automatically trapped for the current window. In other words you must
        open the Window before alerting the Windows messages for that window.
        
        
NOTE : If all the parameters are omitted
        then the WinAlerts for that window are removed. This must be done before
        closing a window if any messages were alerted for that window.
        
        The actions are split into two groups, and a single action from each
        group (i.e. up to 2 actions) are allowed. The actions are as follows:
        
        
Group 1
        
          
            
              | Equate | Meaning | 
            
              | Return0 | Return 0 to the function that sent the message. | 
            
              | Return1 | Return 1 to the function that sent the message. | 
            
              | PassOn | Pass the message on to the Clarion window for processing. | 
          
        
        Group 2
        
          
            
              | Equate | Meaning | 
            
              | PostUser | Post a User Event to the Accept loop. | 
            
              | PostClarion | Post an equivalent Clarion Event (if the is one) to the Accept
                loop. This action is only available in the registered version of
                the library. | 
          
        
        Depending on the message, and the effect you require, the above options
        should cater for all eventualities. The only case where additional
        coding would be necessary would be when the action includes PostUser.
        This posts a user event (usually 500h, but can be changed) to the Accept
        loop. On receiving this event you can then call the function 
Winevent()
          to determine the actual event. WinEvent is described more fully
        below, but behaves essentially the same as the regular Clarion EVENT()
        function.
        
        
Complication
        
        If more than one Windows message is alerted, and both alerted messages
        are received in close succession, then Winevent() returns only the last
        received of the messages. It should be noted here, that this applies
        only to alerted messages. Un-alerted messages (and there are plenty of
        those) have no effect whatsoever.
        
        
Returns
        
        Nothing
        
        
Examples
        
        code
            open(window)
            WinAlert(WM_QueryEndSession,Return0)
              WinAlert() 
            Close(Window) 
        
        code
            open(window)
            WinAlert(WE::WM_KEYUP, WE::WM_KEYUP , PostUser + PassOn, ?SomeText )
        
            
            WinAlert()
            close(window)
         
        See Also
        
        WinChangeUserEvent () : To change the
        User event posted back to your App. 
      
 
      Winevent, WinControl, WinParam1, WinParam2
       Winevent()
          WinControl()
          WinParam1()
          WinParam2()
        
        Parameters
        
        None
        
        
Description
        
        The WinEvent function is used when a User Event is received to determine
        which Windows message caused the event. It is not cleared after use and
        remains available until the next Alerted Windows message is received.
        The WinParam1 and WinParam2 functions return the windows parameters for
        that message. The WinControl function returns the handle of the specific
        window that received the message. You can then use this handle to check
        which control received the event.
        
        
Complication
        
        If more than one Windows message is alerted, and both alerted messages
        are received in close succession, then Winevent() returns only the last
        received of the messages.
        
        
Returns
        
        The last alerted Windows message received.
        
        
Example
        
          
            
              | Example | 
            
              | code case Event() - WinMessageEvent
 of 0 ! WinMessageEvent
 case Winevent()
 of WM_MouseMove
 ! something goes here -
                  can also use WinParam1() and WinParam2() here
 end
 of 5502 ! WM_SYSCOMMAND
 of 5506 ! WM_WTSSESSION_CHANGE
 end
 | 
          
        
        
        See Also
        
        WinAlert : For alerting windows messages
        
WinSysEvent : For handling the wm_SYSCOMMAND
        windows message.
        
WinWtsEvent : For handling the
        wm_WTSSESSION_CHANGE windows message. 
 
      WinChangeUserEvent
       WinChangeUserEvent
          (WinMessageEvent)
        
        Parameters
        
          
            
              | Parameter | Description | 
            
              | WinMessageEvent short | The Event to post when an alerted windows message is received. | 
          
        
        
        Description
        
        WinMessageEvent is an equate defined in the WM.CLW file. If you want to
        change it from it's default value of 500h then change it in this file,
        and call the WinChangeUser function early in your application. Once
        changed, it remains changed for all alerted windows messages.
        
        
Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | code WinChangeUser(WinMessageEvent)
 | 
          
        
       
      WinSysEvent
       WinSysEvent(byte
          pClearAfterRead=0)
        WinSysParam1()
        WinSysParam2()
        
        Parameters
        
          
            
              | Parameter | Description | 
            
              | byte pClearAfterRead | Default FALSE.  If set TRUE the WinSysEvent is reset to zero
                after reading. | 
          
        
        
        Description
        
        An extension of the WinEvent function. WinSysEvent is used instead of
        WinEvent when a wm_SYSCOMMAND message is alerted. WinEvent is still used
        for other windows messages. If the pClearAfterRead is not TRUE then
        WinSysEvent remains available until the next wm_SYSCOMMAND Windows
        message is received. The WinSysParam1 and WinSysParam2 functions return
        the windows parameters for that message. 
        
        
Returns
        
        ulong : wm_SYSCOMMAND
        
        
Example
        
          
            
              | Example | 
            
              | code case Event() - WinMessageEvent
 of 0 ! WinMessageEvent
 of 5502 ! WM_SYSCOMMAND
 if WinSysEvent(TRUE) = WM_SYSCOMMAND
 if WinSysParam1() = 61824 ! SC_CONTEXTHELP
 QuestionMarkPressed = TRUE
 end
 end
 of 5506 ! WM_WTSSESSION_CHANGE
 end
 | 
          
        
        See Also
        
        WinAlert : For alerting windows messages
        
WinEvent : For handling standard windows
        messages.
        
WinWtsEvent : For handling the
        wm_WTSSESSION_CHANGE windows message. 
 
      WinWtsEvent
       WinWtsEvent(byte
          pClearAfterRead=0), WinWtsID()
        
        Parameters
        
          
            
              | Parameter | Description | 
            
              | byte pClearAfterRead | Default FALSE.  If set TRUE the WinWtsEvent is reset to zero
                after reading. | 
          
        
        
        Description
        
        An extension of the WinEvent function. WinWtsEvent is used instead of
        WinEvent when a wm_WTSSESSION_CHANGE message is alerted. WinEvent is
        still used for other windows messages. If the pClearAfterRead is not
        TRUE then WinWtsEvent remains available until the next
        wm_WTSSESSION_CHANGE Windows message is received. The WinWtsID function
        returns the session ID linked to the event. 
        
        
Returns
        
        WTS session change event.
        
          
            
              | Value | Meaning | 
            
              | WTS_CONSOLE_CONNECT 0x1
 | A session was connected to the console session. | 
            
              | WTS_CONSOLE_DISCONNECT 0x2
 | A session was disconnected from the console session. | 
            
              | WTS_REMOTE_CONNECT 0x3
 | A session was connected to the remote session. | 
            
              | WTS_REMOTE_DISCONNECT 0x4
 | A session was disconnected from the remote session. | 
            
              | WTS_SESSION_LOGON 0x5
 | A user has logged on to the session. | 
            
              | WTS_SESSION_LOGOFF 0x6
 | A user has logged off the session. | 
            
              | WTS_SESSION_LOCK 0x7
 | A session has been locked. | 
            
              | WTS_SESSION_UNLOCK 0x8
 | A session has been unlocked. | 
            
              | WTS_SESSION_REMOTE_CONTROL 0x9
 | A session has changed its remote controlled status. To
                determine the status, call GetSystemMetrics
                and check the SM_REMOTECONTROL metric. | 
          
        
        Example
        
          
            
              | Example | 
            
              | code case Event() - WinMessageEvent
 of 0 ! WinMessageEvent
 of 5502 ! WM_SYSCOMMAND
 of 5506 ! WM_WTSSESSION_CHANGE
 case WinWtsEvent(TRUE)
 of 5 ! WTS_SESSION_LOGON
 NewSessionID = WinWtsID()
 end
 end
 | 
          
        
        See Also
        
        WinAlert : For alerting windows messages
        WinEvent : For handling standard windows messages.
        WinSysEvent : For handling the wm_SYSCOMMAND windows message. 
      
 
       NewPort
       NewPort (string
          pmode, long pInBytes=512, long pOutBytes=512,byte pUseEvents=0)
        
        Description
        
        Opens a port for sending or receiving.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | mode ( string ) | This is a mode string such as would be accepted by the Dos
                MODE command.
 | 
            
              | pInBytes | Input buffer in bytes. If omitted then the default is 512
                bytes. | 
            
              | pOutBytes | Output buffer in bytes. If omitted then the default is 512
                bytes. | 
            
              | pUseEvents | Note: This feature is experimental and may
                not work. When set (TRUE) the current window
                will receive com events.
 Comms transmit buffer empty event = WinEventMessage
                  + 5601
 Comms characters received = WinEventMessage
                  + 5602
 Comms handshaking lines changed = WinEventMessage
                  + 5602
 | 
          
        
        
        Returns
        
        Long. < 0 if an error has occurred. Otherwise a port number which
        will be used by all the other functions.
        
        
Examples
        
          
            
              | Example | 
            
              | PortId = NewPort('Com1:9600,n,8,1') PortId = NewPort('Com2:9600,n,8,1',1024)
 PortId = NewPort('Com3:9600,n,8,1',1024,1024)
 | 
          
        
        
        Tip : The window structure must have
        the SYSTEM attribute. If it does not then 
ReadPort
        will fail. 
        
        
See Also
        
        ReadPort, 
WritePort, 
CountPort, 
ResetPort,
        
ClosePort, 
KillAllPorts
       
      CountPort
       CountPort(long
          PortId, long pWhichWay= buffer:in)
        
        Description
        
        Counts the number of characters in the incoming, or outgoing, port
        buffer.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | PortId | This is the port number as returned by the NewPort
                function. | 
            
              | pWhichWay | One of buffer:in or buffer:out.
                If omitted or invalid then the default is buffer:in. | 
          
        
        
        Returns: long
        
        The number of bytes in the buffer.
        
        
Example
        
          
            
              | Example | 
            
              | result = CountPort(PortId) result = CountPort(PortId,buffer:in)
 result = CountPort(PortId,buffer:out)
 | 
          
        
        
        See Also 
        
        NewPort, 
ReadPort, 
WritePort, 
        
ResetPort, 
ClosePort,
        
KillAllPorts
        
       
      ResetPort
       ResetPort (mode
          string)
        
        Description
        
        Resets the parameters for a port while the port is open. Note that this
        function can only be called for a port that has already been opened
        using the NewPort command.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | mode (string) | This is a mode string such as would be accepted by the Dos
                MODE command. | 
          
        
        
        Returns
        
        Long. < 0 if an error occurred. Otherwise 0.
        
        
Example
        
          
            
              | Example | 
            
              | result = ResetPort('Com1:9600,n,8,1') | 
          
        
        
        See Also 
        
        
NewPort, 
ReadPort, 
WritePort,
        
CountPort,  
ClosePort,
        
KillAllPorts
       
      ClosePort
       ClosePort(PortId
          long)
        
        Description
        
        Closes a port so it can be used by another program.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | PortId (long) | This is the port number as returned by the NewPort function. | 
          
        
        
        Returns : long
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | pid = NewPort ('Com1:9600,n,8,1') 
 ClosePort(Pid)
 | 
          
        
        See Also 
        
        NewPort, 
ReadPort, 
WritePort,
        
CountPort, 
ResetPort,
        
KillAllPorts
        
        
       
      KillAllPorts
      
      WritePort
       WritePort(PortId
          long, *String pBuffer, Length long)
        WritePort(PortId long, String pBuffer,
          Length long)
        WritePort(PortId long, StringTheory
          pBuffer)
        
        Description
        
        Writes a string into the transmission buffer.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | PortId (long) | This is the port number as returned by the NewPort function. | 
            
              | pBuffer (string) | This is the handle for the string to send. Note: don't use
                string functions like clip, sub, etc when passing this string. | 
            
              | Length (long) | This is the number of bytes to send. If 0 then the string is
                clipped and sent. 
 | 
            
              | pBuffer (StringTheory) | If the second parameter is a StringTheory object, then the
                length parameter does not need to be passed. | 
          
        
        Returns: long
        
        < 0 if an error. Otherwise number of bytes sent.
        
        
Example
        
          
            
              | Example | 
            
              | pid = NewPort ('Com1:9600,n,8,1') buf = 'abcdefghij'
 bytessent = WritePort(pid,buf,10)
 
 !
 if WritePort(pid,buf,10) >= 0
 
 end
 
 
 bytessent = WritePort(pid,buf,10)
 if bytessent
 
 end
 | 
          
        
        
        See Also 
        
        NewPort, 
ReadPort, 
CountPort,
        
ResetPort, 
ClosePort,
        
KillAllPorts
        
       
      ReadPort
       ReadPort (PortId
          long, *String string, Length long)
        
        Description
        
        Read bytes out of the receive buffer.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | PortId (long) | This is the port number as returned by the NewPort function. | 
            
              | String (string) | This is the handle of the string in which to put the received
                bytes. Note: don't use string functions like clip, sub, etc when
                passing this string. | 
            
              | Length (long) | This is the maximum number of bytes to receive. If 0 then the
                receive string will be filled if possible. | 
          
        
        Returns: long
        
        < 0 if an error. Otherwise number of bytes received. If 0 then the
        receive buffer is empty.
        
        
Example
        
          
            
              | Example | 
            
              | pid = NewPort ('Com1:9600,n,8,1') bytesreceived = ReadPort(pid,buf,0)
 | 
          
        
        
        Tip: The window structure must have the
        SYSTEM attribute. If it does not then ReadPort will fail.
        
Tip: To monitor the port in the
        background (i.e. without hogging processing time) - you can put the
        ReadPort in a timer event (Timer set to at least 100 - unless for
        mission critical timing applications). If the ReadPort returns a 0 then
        just skip the code for handling the buffer code. In 32bit, windows has
        an almost unlimited COMPort buffer, so you don't have to worry about
        comms going missing (if it's not monitored in a tight loop). 
        
        
See Also
        
        NewPort, 
WritePort, 
CountPort, 
ResetPort,
        
ClosePort, 
KillAllPorts
        
       
      SetHandShake
       SetHandShake
          (PortId long, HandShake long)
        
        Description
        
        To Set or Remove port handshaking
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | PortId (long) | This is the port number as returned by the NewPort function. | 
            
              | HandShake (long) | This is one of the following : 0 = No Handshaking ; 1 =
                Xon/Xoff ;  2 = DSR/DTR ; 3 = CTS/RTS | 
          
        
        Returns: long
        
        0 if an error. 
        >0 if successful. 
        -1 if invalid PortId
        
        
Example
        
          
            
              | Example | 
            
              | pid = NewPort('Com1:9600,n,8,1') result = SetHandShake(pid,1)
 | 
          
        
       
      CtsHigh
       CtsHigh (Pid Long)
        
        Description
        
        Returns the current status of the CTS (Clear to Send) line. For advanced
        programming only.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | PortId (long) | This is the port number as returned by the NewPort function. | 
          
        
        
        Returns  
        
        1 if high. 0 if low.
        
        
Example  
        
          
            
              | Example | 
            
              | pid = NewPort('Com1:9600,n,8,1') result = CtsHigh(pid)
 | 
          
        
       
      DsrHigh
       DsrHigh(Pid Long)
        
        Description
        
        Returns the current status of the DSR (Data Send Ready) line. For
        advanced programming only.
        
        
Parameters
        
        PortId (long) This is the port number as returned by the NewPort
        function.
        
        
Returns
        
        1 if high. 0 if low.
        
        
Example
        
          
            
              | Example | 
            
              | pid = NewPort('Com1:9600,n,8,1') result = DsrHigh(pid)
 | 
          
        
       
      RingHigh
       RingHigh (Pid
          Long)
        
        Description
        
        Returns the current status of the RI (Ring Indicator) line. For advanced
        programming only.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | PortId (long) | This is the port number as returned by the NewPort function. | 
          
        
        
        Returns
        
        1 if high. 0 if low.
        
        
Example
        
          
            
              | Example | 
            
              | pid = NewPort('Com1:9600,n,8,1') result = RingHigh(pid)
 | 
          
        
       
      CdHigh
       CdHigh (Pid Long)
         
          
          Description
        
        Returns the current status of the CD (Carrier Detect) line. For advanced
        programming only.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | PortId (long) | This is the port number as returned by the NewPort function. | 
          
        
        
        Returns
        
        1 if high. 0 if low.
        
        
Example
        
          
            
              | Example | 
            
              | pid = NewPort('Com1:9600,n,8,1') result = CdHigh(pid)
 | 
          
        
       
      SetRts
       SetRts (Pid Long,
          Value Long)
        
        Description
        
        Sets the current status of the RTS (Ready to Send) line. For advanced
        programming only.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | PortId (long) | This is the port number as returned by the NewPort function. | 
            
              | Value long) | Set to 0 to Clear the RTS line, Set to 1 to Set the RTS line. | 
          
        
        Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | pid = NewPort('Com1:9600,n,8,1') tRts(pid,1)
 | 
          
        
       
      SetDtr
       SetDtr(Pid Long,
          Value Long)
        
        Description
        
        Sets the current status of the DTR (Data Terminal Ready) line. For
        advanced programming only.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | PortId (long) | This is the port number as returned by the NewPort function. | 
            
              | Value (long) | Set to 0 to Clear the DTR line, Set to 1 to Set the DTR line. | 
          
        
        Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | pid = NewPort('Com1:9600,n,8,1') SetDtr(pid,1)
 | 
          
        
       
      WinTaskbarAddIcon
       WinTaskbarAddIcon(IconName
          String,< Tips String>,byte pSetVersion5=0,<string
          pIconModule>), long
        
        Description
        
        Adds an Icon to the TaskBar's "Tray" area. This icon belongs to the
        window that's open when the function is called. At least one window must
        be open when this function is called. When the user clicks on this icon
        then an event is generated and sent to the owner window. The event
        generated is the WinUserEvent ( usually 0500h ). This event is generated
        whenever a WinAlerted message is received. You can then use the
        Winevent() function to return the specific message that triggered the
        event. If the user clicked on an icon in the tray, then the Winevent()
        function will return the number 25000.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | IconName (string) | This is the name of the icon to display. The icon is an ICO
                file stored on the disk (or prefix with a '~' to use an icon in
                the project). | 
            
              | Tips (string) | This parameter is optional. If you put a string in here, then
                this will be the tip displayed when the mouse rests on the icon
                in the tray. | 
            
              | pSetVersion5 (byte) | 
 | 
            
              | pIconModule (string) | this is the name of the module containing the icon (if the
                icon is in the project). Blank will default to the EXE. This is
                only required if: 1) this is not an EXE and 2) the IconName is
                prefixed with a '~' and 3) the icon is not in the EXEs project
                (but in this or another loaded DLL). | 
          
        
        Returns : long
        
        Icon Id. This Id is used by the Remove and Change functions
        
        
Example
        
          
            
              | Example | 
            
              | id long code
 open(window)
 id = WinTaskBarAddIcon('happy.ico','click on me....')
 accept
 !! usual window processing
                  goes here
 case event()
 of 5513       !MouseLeftDown
 ! the user has clicked
                  on the icon in the tray.
 ! do something here,
                  like a popup menu...
 of 5514       !MouseLeftUp
 of 5515       !double left click
 of 5516       !mouserightdown
 of 5517       !mouserightup
 of 5510       !load icon
 of 5501       !refresh icon
 of 6026       ! balloon opened
 of 6027       ! balloon closed
 of 6028       ! balloon timeout, closed
 end
 end
 close(window)
 | 
          
        
       
      WinTaskbarRemoveIcon
       WinTaskbarRemoveIcon(<Id
          long>)
        
        Description
        
        Removes an Icon from the Taskbar's tray.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | Id (long) | This is the Id number as returned by the Add function. If this
                parameter is omitted then all icons placed by this window will
                be removed. | 
          
        
        Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | id long code
 open(window)
 id = WinTaskBarAddIcon('happy.ico','click on me....')
 WinTaskBarRemoveIcon(id) ! or
                  ....
 WinTaskBarRemoveIcon()
 | 
          
        
       
      WinTaskbarChangeIcon
       WinTaskbarChangeIcon(<Id
          long>, IconName string,<Tips string>,<string
          pIconModule>)
        
        Description
        
        Changes the icon and / or tool tip for a specific icon that is already
        placed in the tray. Use this function to update the icon to display your
        program status.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | Id (long) | The Icon identifier as returned by the Add function.  If
                omitted then the first icon added by this window will be
                changed. | 
            
              | IconName (string) | The name of the icon to use. | 
            
              | Tips ( string ) | The new tool tip for the icon.  If omitted then the tip will
                be cleared. | 
            
              | pIconModule (string) | this is the name of the module containing the icon (if the
                icon is in the project). Blank will default to the EXE. This is
                only required if: 1) this is not an EXE and 2) the IconName is
                prefixed with a '~' and 3) the icon is not in the EXEs project
                (but in this or another loaded DLL). | 
          
        
        Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | id long code
 open(window)
 id = WinTaskBarAddIcon('happy.ico','click on me....')
 WinTaskBarChangeIcon(id,'sad.ico','Im sooo sad')
 | 
          
        
        
        Additional notes:
        
        There are 3 events available for event tracking:
        
          - Balloon open
- Balloon close
- Balloon close on timeout.
        To track these events, you can place code in the relative embed point to
        run when one of these events occurs:
        
        
 
  
      ds_WinTaskbarBalloon
       ds_WinTaskbarBalloon(<ulongpID>,
          string pText, <string pTitle>, uLong pFlags=1, ulong
          pTimeout=1500, <string pIconName>)
        
        Description
        
        This opens a "balloon" linked to the system tray icon. The balloon will
        stay open until either the user closes it or the user gives focus to the
        application.
        There is a minimum time that the balloon will be open. This is used in
        cases where another balloon (different application) is requested.
        
        Balloons are not supported in win95 or win98 so WinEvent supplies a
        XP/Vista "look alike".
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pID (ulong) | Optional.  Returned by WinTaskbarAddIcon.  Is used to identify
                which icon to attach the balloon to. | 
            
              | pText (string) | The balloon text.  If no balloon text is supplied then any
                open balloon is closed. Embedding '<13,10>' in the text
                produces multiline text. | 
            
              | pTitle (string) | Optional.  The balloon title. Icons only appear if the title
                is supplied. | 
            
              | pFlags (uLong) | WE::NIIF_NONE  No icon. WE::NIIF_INFO An information icon.
                (Default)
 WE::NIIF_WARNING  A warning icon.
 WE::NIIF_ERROR  An error icon.
 WE::NIIF_USER The application icon.
 WE::NIIF_NOSOUND   Do not play the associated sound.
 | 
            
              | pTimeout (ulong) | Optional.  Default=1500 (15
                  seconds). Balloon minimum display time in 100ths of a second.
                  (clarion time) Note: As from windows
                Vista the Timer parameter no longer has any effect. Notification
                display times are now based on system accessibility settings.
                See
 https://msdn.microsoft.com/en-us/library/windows/desktop/bb773352(v=vs.85).aspx
 | 
            
              | pIconName (string)
 | reserved - not currently used. | 
          
        
        Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | ID        long 
 code
 ID = WinTaskbarAddIcon('~MyAppIcon.ico','This is my tip
                  text.<13,10>This is on line 2.')
 ds_WinTaskbarBalloon(ID,'This is the balloon
                  text.<13,10>This is on line 2.','This is the title.')
 ......
 ds_WinTaskbarBalloon(ID,'')
 
 
 case Event() - WinMessageEvent
 of 6026
 of 6027
 of 6028
 of 6029
 end ! case
 
 | 
          
        
         
         Faultfinding
        
        If the balloon is not displaying, then try the winevent demo application
        (Go to Taskbar Functions - and you will find the show|hide balloon
        buttons that you can use to test this functionality). If it is not
        working, then you have balloontips turned off in your windows registry.
        Search for BalloonTips, and change the value of the key you find from 0
        to 1. 
 
      WinNotOnTaskbar
       WinNotOnTaskbar()
        
        Description
        
        Applications using this function do not appear on the Windows 95 Task
        bar. This is normally
        used in conjunction with the WinTaskBarAddIcon when you want a
        background program to
        appear on the Taskbar's tray, and not on the taskbar itself. It must be
        called before the first
        window of the application is opened.
        
        
IMPORTANT Note : WinNotOnTaskBar is not
        compatible with auto-shutdown. 
        If you are using WinTaskBarAddIcon then the following code may be used
        as an alternative.
        To hide the window
            window{prop:iconize} = TRUE
            window{prop:hide} = TRUE
        
        To unhide the window
            window{prop:hide} = FALSE
            window{prop:iconize} = FALSE
        
        
Note that the order of the hide / iconize
        commands is important
        
        
Parameters
        
        None
        
        
Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | code WinNotOnTaskBar()
 open(window)
 | 
          
        
       
      WinOnTop
       WinOnTop()
        
        Description
        
        Makes your window float on top of other windows applications. Note: you
        can't use this function for MDI applications on MDI-child windows.
        
        
Parameters
        
        None
        
        
Returns
        
        Nothing
        
        
Example 1
        In Event:OpenWindow
        
        
 WinOnTop()
        
        Example 2
        
          
            
              | Example | 
            
              | !
                  ------------------------------------- ! Hides Window (opposite of WindowShow)
 ! Useful for use with the TaskBar icon code
 WindowHide Routine
 window{prop:iconize}
                  = true
 window{prop:hide}
                  = true
 
 ! -------------------------------------
 ! Shows Window (opposite of WindowHide)
 ! Useful for use with the TaskBar icon
                  code
 WindowShow Routine
 if window{prop:iconize} = false
 window{prop:iconize}
                  = true
 end
 window{prop:hide}
                  = false
 window{prop:iconize}
                  = false
 
 ! -------------------------------------
 ! Shows Window (opposite of WindowHide)
 ! Useful for use with the TaskBar icon
                  code
 ! No Focus is gained
 WindowShow_NoFocus Routine
 window{prop:iconize}
                  = false
 window{prop:hide}
                  = false
 WinOnTop()
 WinNotOnTop()
 | 
          
        
       
      WinNotOnTop
       WinNotOnTop()
        
        Description
        
        Reverses the effect of the WinOnTop() function. Note: you can't use this
        function for MDI applications on MDI-child windows.
        
        Parameters
        
        None
        
        Returns
        
        Nothing
        
        Example
        
        WinNotOnTop()
        
      
      WinBringToFront
       WinBringToFront()
        
        Description
        
        Brings your window to the front of the open windows. This would be used
        if your program wanted to bring itself to the front because some event
        has occurred that needs action. 
Note:
        you can't use this function for MDI applications on MDI-child windows.
        
        
Parameters
        
        None
        
        
Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | code open(window)
 WinBringToFront()
 | 
          
        
       
      ds_ShowWindow
       ds_ShowWindow(byte
          pGrabFocus=1)
        
        Description
        
        Unhides your window.  This is used in conjunction with ds_HideWindow. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pGrabFocus (byte) | Optional.  Defaults to TRUE.  When set you window takes focus
                and so keyboard input goes to your window. | 
          
        
        Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | code open(window)
 ds_ShowWindow()
 | 
          
        
       
      ds_HideWindow
       Description
        
        Hides your window.  This is used in conjunction with ds_ShowWindow. 
        
        
Parameters
        
        None
        
        
Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | code open(window)
 ds_HideWindow()
 
 | 
          
        
       
      ds_WinTransparent
       ds_WinTransparent(long
          Transparency)
        
        NB: Only available for non-MDI windows.
        
        
Description
        
        Adjusts the transparency of a window .
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | Transparency (long) | This sets the transparency factor.  0 = Invisible,  255 =
                Normal. | 
          
        
        Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | code open(window)
 ds_WinTransparent(255) !
                  normal window display
 ds_WinTransparent(0)
                ! window will be invisible
 | 
          
        
       
      ds_VisibleOnDesktop
       ds_VisibleOnDesktop(<*long
          pWinX>,<*long pWinY>,<*long pWinWidth>,<*long
          pWinHeight>,long pMode=1)
        
        Description
        
        Repositions and resizes the window to be visible on the desktop. This is
        particularly useful if the window position was saved off the desktop (in
        a previously visible place that is now no longer visible). WinEvent will
        move the window onto the visible desktop area.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pWinX (*long) | Optional.  If omitted then the current target window is used. 
                If supplied then the variable is updated. | 
            
              | pWinY (*long) | Optional.  If omitted then the current target window is used. 
                If supplied then the variable is updated. | 
            
              | pWinWidth (*long) | Optional.  If omitted then the current target window is used. 
                If supplied then the variable is updated. | 
            
              | pWinHeight (*long) | Optional.  If omitted then the current target window is used. 
                If supplied then the variable is updated. | 
            
              | pMode (long) | Optional.  Default=1  When set this flags that the window must
                not be obscured by the taskbar. | 
          
        
        Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | code open(window)
 Open(Window)
 ds_VisibleOnDesktop()
 | 
          
        
       
      ds_GetWinVersion
       ds_GetWinVersion()
        
        Description
        
        Returns the version of windows that is running. 
        
        
Note: As from Windows 8.1 this function
        will return the OS that the app is manifested for. In other words if you
        are running on windows 10, but the app is only manifested for Windows 8,
        then this function will return Windows 8. If the app has no manifest
        then it will return Windows 8 for Windows 8 or higher.
        
        
Parameters
        
        None
        
        
Returns
        
        String formatted with Windows version, Windows edition, major version
        number, minor version number, build number and then service pack
        description. Something like;
        
        
Win 10 - 10.0.17134
        
        
        Example
        
            code
            DisplayString = ds_GetWinVersion() 
          
        See Also 
        
        
WindowsVersion, 
          WindowsRelease
        
       
      WindowsVersion
       WindowsVersion()
        
        Description
        
        Returns the major windows version number for the current version of
        windows. 
        
          Note: As from Windows 8.1 this function will return the OS that
        the app is manifested for. In other words if you are running on windows
        10, but the app is only manifested for Windows 8, then this function
        will return Windows 8. If the app has no manifest then it will return
        Windows 8 for Windows 8 or higher.
        
        
Parameters 
        
        None
        
        
Returns
        
        Long containing Windows version number. This together with the release
        number (
WindowsRelease ) gives you the
        version number of Windows.
        
        The version number 5 is returned for Windows 2000, Windows XP, Windows
        2003.
        
        The version number 6 is returned for Windows Vista, Windows 2008,
        Windows 2008R2, Windows 7, Windows 2012, Windows 8, Windows 8.1 and
        Windows 2012R2.
        
        The version number is 10 for Windows 10.
        
        
Example
        
          code
            ver = WindowsVersion()  
        
        See Also 
        
        ds_GetWinVersion, 
          WindowsRelease
        
       
      WindowsRelease
       WindowsRelease()
        
        Description
        
        Returns the release number (minor version number) of the version of
        Windows that is running. 
        
        
Note: As from Windows 8.1 this function
        will return the OS that the app is manifested for. In other words if you
        are running on windows 10, but the app is only manifested for Windows 8,
        then this function will return Windows 8. If the app has no manifest
        then it will return Windows 8 for Windows 8 or higher.
        
        
Parameters
        
        None
        
        
Returns
        
        A 
LONG containing Windows release number.
        This together with the version number (
WindowsVersion)
        gives you the version number of windows.
        
        Windows 2000, Windows Vista, Windows 2008 and Windows 10 return 0
        
        Windows XP, Windows 2008 R2 and Windows 7 return 1
        
        Windows 2003, Windows 2012 and Windows 8 return 2
        
        Windows 8.1 and Windows 2012 R2 return 3
        
        
        
Example
        
        code
            ver = WindowsVersion()
            rel = WindowsRelease() 
        
        See Also 
        
        ds_GetWinVersion, 
WindowsVersion
       
      DosVersion
       DosVersion()
        
        Description
        
        Returns the version of Dos that is running. This is only valid for 16
        bit programs. For example a 16 bit version of a program running on
        Windows 95 will return 7 as the version number, and 0 as the release
        number.
        
        
Parameters
        
        None
        
        
Returns
        
        Long containing Dos version number. This together with the release
        number (DosRelease() ) gives you the version number of Dos.
        
        
Example
        
          
            
              | Example | 
            
              | code ver = DosVersion()
 | 
          
        
       
      DosRelease()
       DosRelease()
        
        Description
        
        Returns the release of Dos that is running. This is only valid for 16
        bit programs. For example a 16 bit version of a program running on
        Windows 3.11 and Dos 6.22 will return 6 as the version number, and 22 as
        the release number.
        
        
Parameters
        
        None
        
        
Returns
        
        Long containing Dos release number. This together with the version
        number (DosVersion() ) gives you the version number of dos.
        
        
Example
        
          
            
              | Example | 
            
              | code ver = DosVersion()
 rel = DosRelease()
 | 
          
        
       
      GetFreeDiskSpace
       GetFreeDiskSpace
          (<drive long>)
        
        Description
        
        Returns the amount of free disk space, in bytes.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | Drive | Optional. 0 = current drive. 1 = A, 2 = B etc. | 
          
        
        
        Returns
        
        Real containing number of free bytes on the disk. In version 2.6 and
        earlier of WinEvent this was a Long. 
        
        
Example
        
          
            
              | Example | 
            
              | free real code
 free = GetFreeDiskSpace()
 | 
          
        
        
        See Also
        
        GetDiskSpace , 
          ds_GetDiskMegs
        
       
      GeGetDiskSpace
       GetDiskSpace
          (<drive long>)
        
        Description
        
        Returns the total disk space, in bytes.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | Drive | Optional. 0 = current drive. 1 = A, 2 = B etc. | 
          
        
        
        Returns
        
        Real containing total number of bytes on the disk. However maximum value
        is currently 2 gigs. 
        
        
Example
        
          
            
              | Example | 
            
              | total real code
 total = GetDiskSpace()
 | 
          
        
        
        See Also
        
        GetFreeDiskSpace , 
          ds_GetDiskMegs
        
       
      ds_GetDiskMegs
       ds_GetDiskMegs
          (<string pDrive>,<string pSelector>)
        
        Description
        
        Returns the specified disk space, in megabytes.
        
        
Parameters
        
          
            
              | Parameter | DeDescription | 
            
              | pDrive (string) | Optional. Defaults to current directory. | 
            
              | pSelector (string) | Optional.  Defaults to 'USER FREE'  This modifies the returned
                disk size. 
 'USER FREE'       Returns the free disk space available to the
                current user.
 'TOTAL'                Returns the total disk size.
 'TOTAL FREE'      Returns the free disk space on the drive.
 | 
          
        
        Returns
        
        Ulong. The disk space in megabytes. 
        
        
Example
        
          
            
              | ExExample | 
            
              | total ulong code
 total = ds_GetDiskMegs()
 | 
          
        
        
        See Also
        
        GetDiskSpace, 
GetFreeDiskSpace
        
       
      ds_Memory
       ds_Memory(<string
          pSelector>)
        
        Description
        
        Returns the specified RAM space, in kBytes. (Ram sizes up to 2 terabytes
        are supported.)
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pSelector (string) | Optional.  Defaults to 'USER'  This specifies which RAM size
                is returned. 'USER'                    Returns the virtual memory used by  this application.
 
 | 
            
              | pSelector (string) | These options return the memory for the whole
                  computer, not just this application. 
 'SWAP USED'        Returns the page file used kBytes.
 'SWAP FREE'        Returns the page file free kBytes.
 'SWAP TOTAL'       Returns the page file total kBytes.
 'RAM USED'           Returns the physical RAM used kBytes.
 'RAM FREE'           Returns the physical RAM free kBytes.
 'RAM TOTAL'          Returns the physical RAM total kBytes.
 'VMEM USED'        Returns the virtual memory used kBytes.
 'VMEM FREE'        Returns the virtual memory free kBytes.
 'VMEM TOTAL'       Returns the virtual memory total kBytes.
 | 
          
        
        Returns
        
        Ulong. The RAM size in kilobytes. 
        
        
Example
        
          
            
              | Example | 
            
              | total ulong code
 total = ds_Memory()  ! Returns the virtual memory
                used by this application in Kilobytes
 | 
          
        
       
      ds_GetReg
       ds_GetReg(Long
          hKey, String SubKeyPath, String ValueName, Long p64=false)
        
        Description
        
        Gets a value out the Windows System Registry.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | hKey (long) | The top level key containing the section of the registry to
                read. Valid values are; WE::WM_HKEY_CLASSES_ROOT
 WE::WM_HKEY_CURRENT_USER
 WE::WM_HKEY_LOCAL_MACHINE
 WE::WM_HKEY_USERS
 | 
            
              | SubKeyPath (string) | The path inside the registry to the item you want to read. | 
            
              | ValueName (String) | The name of the variable you want to read. | 
            
              | p64 (long) | If True then the 64 bit registry is used. If false
                  then the 32 bit registry is used. | 
          
        
        Returns
        
        Any. The value stored in the string. If the read failed the the value 0
        is returned, and the Winevent extended error is set. The Winevent error
        can be retrieved using ds_Error and ds_Errorcode functions. 
        
        
Example
        
          
            
              | Example | 
            
              | htmleditor string(255) code
 htmleditor = ds_GetReg(we::wm_hkey_current_user, |
 'Software\Microsoft\Internet Explorer\Default
                  HTML Editor','Description')
 | 
          
        
        
        See Also 
        
        ds_PutReg
       
      ds_PutReg
       ds_PutReg(Long
          hKey, String SubKeyPath, String ValueName, String Value, Long
          Type=pType=REG_SZ, Long p64=false)
        
        Description
        
        Writes a value to the Windows System Registry.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | hKey (long) | The top level key containing the section of the registry to
                write. Valid values are; WE::WM_HKEY_CLASSES_ROOT
 WE::WM_HKEY_CURRENT_USER
 WE::WM_HKEY_LOCAL_MACHINE
 WE::WM_HKEY_USERS
 | 
            
              | SubKeyPath (string) | The path inside the registry to the item you want to write. | 
            
              | ValueName (String) | The name of the variable you want to write. | 
            
              | Value (String) | The value you want to write into the registry. | 
            
              | Type (Long) | the type of the value you are writing. Valid values are; WE::REG_SZ                  WE::REG_EXPAND_SZ           WE::REG_BINARY              WE::REG_DWORD               WE::REG_DWORD_LITTLE_ENDIAN 
                WE::REG_DWORD_BIG_ENDIAN    WE::REG_MULTI_SZ
 Default value for this parameter is WE::REG_SZ.
 | 
            
              | p64 (Long) | If True then the 64 bit registry is used. If false
                  then the 32 bit registry is used. | 
          
        
        Returns
        
        0 if successful, non zero if not successful. Additional error
        information can be read using the ds_Error and ds_ErrorCode functions.
        
        
Example
        
          
            
              | Example | 
            
              | htmleditor string(255) code
 htmlEditor = 'Microsoft Expression Web'
 ds_PutReg(we::wm_hkey_current_user, |
 'Software\Microsoft\Internet Explorer\Default HTML
                  Editor','Description',htmlEditor,we::reg_sz)
 | 
          
        
        
        See Also 
        
        ds_GetReg, 
ds_DeleteValueReg
       
      ds_DeleteValueReg
       ds_DeleteValueReg(Long
          hKey, String SubKeyPath, String ValueName, Long p64=false)
        
        Description
        
        Deletes a value out the Windows System Registry (if the user has
        sufficient permissions to do so.)
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | hKey (long) | The top level key containing the section of the registry to
                read. Valid values are; WE::WM_HKEY_CLASSES_ROOT
 WE::WM_HKEY_CURRENT_USER
 WE::WM_HKEY_LOCAL_MACHINE
 WE::WM_HKEY_USERS
 | 
            
              | SubKeyPath (string) | The path inside the registry to the item you want to delete. | 
            
              | ValueName (String) | The name of the variable you want to delete. | 
            
              | p64 (long) | If True then the 64 bit registry is used. If false
                  then the 32 bit registry is used. | 
          
        
        Returns
        
        True if the delete is successful. If the read failed the the false is
        returned, and the Winevent extended error is set. The Winevent error can
        be retrieved using ds_Error and ds_Errorcode functions. 
        
        
Example
        
        
        See Also 
        
        ds_PutReg, 
ds_GetReg
       
      Sound
       Sound (WavFileName
          String)
        
        Description
        
        Plays a Wav file through the speaker.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | WavFileName (string) | The name of the Wav file on the disk, including path if
                necessary. | 
          
        
        
        Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | code sound('alarm.wav')
 | 
          
        
       
      GetWindowsDir
       GetWindowsDir ()
        
        Description
        
        Gets the directory where Windows is installed. For multi-user systems
        this returns the Windows directory that is personal to the logged in
        user. 
        
        
Parameters
        
        None
        
        
Returns
        
        A string containing the path to the Windows directory.
        
        
Example
        
          
            
              | Example | 
            
              | a string(255) code
 a = GetWindowsDir()
 | 
          
        
       
      GetSystemDir
       GetSystemDir ()
        
        Description
        
        Gets the Windows system directory. 
        
        
NOTE : This is usually \windows\system
        
        
Parameters
        
        None
        
        
Returns
        
        A string containing the path to the Windows system directory.
        
        
Example
        
          
            
              | Example | 
            
              | a string(255) code
 a = GetSystemDir()
 | 
          
        
       
      ScreenWidth
       ScreenWidth ()
        
        Description
        
        Gets the current width, in pixels, of the windows desktop.
        
        
Parameter
        
        None
        
        
Returns
        
        A long containing the number of pixels.
        
        
Example
        
          
            
              | Example | 
            
              | a long code
 a = ScreenWidth()
 | 
          
        
       
      ScreenHeight
       ScreenHeight ()
        
        Description
        
        Gets the current height, in pixels, of the windows desktop.
        
        
Parameters
        
        None
        
        
Returns
        
        A long containing the number of pixels.
        
        
Example
        
          
            
              | Example | 
            
              | a long code
 a = ScreenHeight()
 | 
          
        
       
      ScreenDepth 
       ScreenDepth ()
        
        Description
        
        Gets the current color depth, in bits, of the windows desktop.
        
        
Parameters
        
        None
        
        
Returns
        
        A long containing the number of bits. For example 8 = 256 colors, 24 =
        true color and so on.
        
        
Example
        
          
            
              | Example | 
            
              | a long code
 a = ScreenDepth()
 | 
          
        
       
      ds_GetScreenDPI (byte pDPIY=0)
       ds_GetScreenDPI
          (byte pDPIY=0)
        
        Description
        
        Gets the current DPI of the windows desktop.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pDPIY (optional) | Defaults to X DPI. If set to TRUE then returns Y DPI. These
                are usually the same. | 
          
        
        Returns
        
        A long containing the DPI setting. For example 96 = Small fonts, 120 =
        Large fonts.
        
        
Example
        
        n long
            code
            n = ds_GetScreenDPI() 
       
      ds_GetUserAccountName
       ds_GetUserAccountName(long
          pExtendedFormatOption=false)
        
        Description
        
        Retrieves the current user name for the process. Uses the Windows API
        call GetUserNameEx.
        
        Parameters
        
          
            
              | Parameter | Description | 
            
              | pExtendedFormatOption | If false then the whole user name (including the domain) is
                returned. If true then only the user name part is returned. | 
          
        
        
        Returns
        
        A String containing the name. 
        
      
 
      ds_GetUserName
       ds_GetUserName()
        
        Description
        
        Retrieves the current user name for the process. Uses the windows API
        call WNetGetUser.
        
        Returns
        
        A String containing the name. 
        
      
      ds_GetWorkstationName
       ds_GetWorkstationName()
        
        Description
        
        Gets the name of the computer as used by Windows networking.
        
        Returns
        
        A string containing the name. 
        
      
      ds_IsMediaCenter()
       ds_IsMediaCenter()
        
        Description
        
        Detects if the current version of Windows is a Media Center edition.
        
        Returns
        
        A long set to 1 if the machine is running a Media Center version of
        Windows, 0 otherwise. 
        
      
      ds_IsTerminalServer
       ds_IsTerminalServer()
        
        Description
        
        Detects if the current machine is running on a terminal server.
        
        Returns
        
        A long , Set to 1 if the current machine is a terminal server. Set to 2
        if the current machine is a terminal server, and the current session is
        a remote session. 
        
      
      ds_IsTablet
       ds_IsTablet ()
        
        Description
        
        Detects if the current version of Windows is a Tablet edition.
        
        Returns
        
        A long set to 1 if the machine is running a Tablet version of Windows,
        or the Tablet PC Input Service has been started. 0 otherwise. 
        
      
      ds_IsStarter 
       ds_IsStarter()
        
        Description
        
        Detects if the current version of Windows is a Starter edition.
        
        Returns
        
        A long set to 1 if the machine is running a Starter version of Windows,
        0 otherwise. 
        
      
      ds_OnNetwork
       ds_OnNetwork ()
        
        Description
        
        Detects if the current machine is connected to a network or not. 
        
        Returns
        
        A long, 1 if true 0 if false.
        
          Example
        
        n  Long
            Code
            n = ds_OnNetwork() 
           
         
      ds_OSbits
       ds_OSbits ()
        
        Description
        
        Detects if the current OS is a 32 bit or 64 bit OS. 
        
        Returns
        
        32 if 32 bit, 64 if 64 bit.
        
        Example
        
        n  Long
            Code
            n = ds_OsBits() 
            
        
      
      ds_RefreshDesktop
       ds_RefreshDesktop()
        
        Description
        
        Refreshes the desktop. Typically called after calling 
ds_CreateShortcutEx..
        
        
Returns
        
        Nothing 
      
 
      ds_FastClock
       ds_FastClock(byte
          UseCPUTimeStamp=0,byte ReSyncTime)
        
        Description
        
        Gets the current time down to a resolution of 1µs. This depends on the
        presence of a highspeed hardware timer chip in the PC.
        
        Defaults to clock() if no highspeed chip is present. If the
        UseCPUTimeStamp flag is set then the ds_ReadCPUTimeStamp() function is
        used. NB this will only work on Pentium or better processors.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | UseCPUTimeStamp (byte) | Optional, Default = FALSE.  If set then the
                ds_ReadCPUTimeStamp() function is used to return the time down
                to a resolution of the CPU clock.  (1 GHz = 1ns resolution) | 
            
              | ReSyncTime (byte) | Optional, Default = FALSE.  Use (once) when time has been
                adjusted and so ds_FastClock <> Clock(). | 
          
        
        Returns
        
        A real containing the time in clarion time format (100 = 1 second) .
        
        
Example
        
          
            
              | Example | 
            
              | ThisTime    real 
 code
 ThisTime - ds_FastClock()
 DisplayTime = ds_FormatFastTime(ThisTime,4) ! 16:23:31.0124
 | 
          
        
       
      ds_FormatFastTime
       ds_FormatFastTime(real
          pFastTime,<long pDecimalPlaces>)
        
        Description
        
        Used with ds_FastClock() to display the time including fractions of a
        second.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFastTime (real) | The time in 100 ths of a second (clarion time). | 
            
              | pDecimalPlaces (long) | Optional.  The number of decimal places to display. | 
          
        
        
        Returns
        
        String containing the time.
        
        
Example
        
          
            
              | Example | 
            
              | code DisplayTime = ds_FormatFastTime(ds_FastClock(),4) !
                  16:23:31.0124
 | 
          
        
       
      ds_Sleep
       ds_Sleep(real
          pFastTime)
        
        Description
        
        Executes a yield for the duration specified in 100 ths of a second
        (clarion time).
        This is an API call. The resolution of the time is 1 ms (0.1 in clarion
        time).
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFastTime (real) | The time in 100 ths of a second (clarion time) for which to
                sleep. | 
          
        
        
        Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | code ds_Sleep(100.1) ! wait 1.001
                  seconds
 | 
          
        
       
      ds_Timer
       ds_Timer(long
          pTimerNumber,<real pFastTime>)
        
        Description
        
        General purpose timer. 
        
Note : you are limited to 999 timers per
        thread.
        the WinEvent SMS functions use 
ds_Timer(999)
        and 
ds_Timer(998). 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pTimerNumber (long) | Used to specify multiple timers (per thread) | 
            
              | pFastTime (real) | The time in 100 ths of a second (clarion time). | 
          
        
        Returns
        
        Byte, TRUE (1) if timer has elapsed. FALSE (0) if timer has not yet
        elapsed.
        
        NOTE: you need to keep checking the timer to see if it is elapsed. There
        is no event fired when the timer elapses.
        
        
Example
        
          
            
              | Example | 
            
              | code ds_Timer(1,100.1) ! init
                  timer 1 to 1.001 seconds
 loop until ds_Timer(1) ! break when timer 1 elapses.
 .....
 ds_Timer(1,50) !
                  Restart timer 1 at 0.5 seconds
 .....
 end
 | 
          
        
       
      ds_WeekDay
       ds_WeekDay(long
          pDate,<byte pShortFormatFlag>)
        
        Description
        
        Returns the English name for the day of the week.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pDate (long) | The date for which the week day is required.  (Clarion date) | 
            
              | pShortFormatFlag (byte) | Optional.  If TRUE(1) then the short name for the day is
                returned.  "Wednesday" would return as "Wed" | 
          
        
        Returns
        
        String containing the day of the week.
        
        
Example
        
          
            
              | Example | 
            
              | code DisplayDay = ds_WeekDay(today()) ! Returns the current day
                  of the week, i.e. "Wednesday"
 DisplayDay = ds_WeekDay(today(),1) ! Returns the current day
                  of the week, i.e. "Wed"
 | 
          
        
       
      ds_ReadCPUTimeStamp
       ds_ReadCPUTimeStamp(*realpSaveReal)
        
        Description
        
        Reads the Time Stamp Register of the CPU. NB this will only work on
        Pentium or better processors.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pSaveREal (*real) | The 64 bit number returned by the CPU is saved into this
                real.  Will overflow after 52 bits.  (50 days at 1GHz) | 
          
        
        Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | ThisTime    real 
 code
 ds_ReadCPUTimeStamp(ThisTime)         ! Save TimeStamp into
                  real
 ......
 ds_ReadCPUTimeStampDelta(ThisTime)    ! CPU Cycles elapsed.
 
 | 
          
        
       
      ds_ReadCPUTimeStampDelt
       ds_ReadCPUTimeStampDelta(*real
          pSaveReal)
        
        Description
        
        Reads the Time Stamp Register of the CPU and subtract the last saved
        value. NB this will only work on Pentium or better processors.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pSaveREal (*real) | The 64 bit number returned by the CPU is saved into this real.
                Will overflow after 52 bits. (50 days at 1GHz) | 
          
        
        
        Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | ThisTime    real 
 code
 ds_ReadCPUTimeStamp(ThisTime)         ! Save TimeStamp into
                  real
 ......
 ds_ReadCPUTimeStampDelta(ThisTime)    ! CPU Cycles elapsed.
 | 
          
        
       
      ds_DeleteFile
       ds_DeleteFile(string
          pFileName)
        
        Description
        
        Delete a file. Any read-only attributes are cleared and then the file is
        deleted.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFileName (string) | Specify the file (with path) to delete. | 
          
        
        Returns
        
        Byte, TRUE (1) for success, FALSE (0) for failure. 
        
        
Example
        
          
            
              | Example | 
            
              | code ds_DeleteFile('c:\FileName.ext')
 | 
          
        
       
      ds_GetFileDirEntry
       ds_GetFileDirEntry(string
          pFileName,*string pEntryG)
        
        Description
        
        Fills the supplied EntryG structure with the data from the specified
        file. 
        This procedure calls the clarion DIRECTORY command. See clarion help for
        more info.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFileName (string) | Specify the file (with path) for which the directory entry
                data is required. | 
            
              | pEntryG (*string) | Provide the label of an EntryG structure.  See example below. | 
          
        
        
        Returns
        
        Byte, TRUE (1) for success, FALSE (0) for failure.
        
        
Example
        
          
            
              | Example | 
            
              | EntryG    group,PRE(EntryG) name        STRING(256)
 shortname   string(13)
 date        LONG
 time        LONG
 size        LONG
 attrib      BYTE
 end
 EntryGString string(size(EntryG)),over(EntryG)
 code
 ds_GetFileDirEntry('c:\FileName.ext',EntryGString)
                ! fills the EntryG with the files
                  directory attributes.
 | 
          
        
       
      ds_GetFileSize
       ds_GetFileSize(string
          pFileName)
        
        Description
        
        Gets the size of the file on the disk
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFileName (string) | Specify the file (with path) for which the size is required. | 
          
        
        
        Returns
        
        REAL - handles sizes over 2 gigabytes
        
        
Example
        
          
            
              | Example | 
            
              | r   Real code
 r = ds_GetFileSize('c:\FileName.ext')
 | 
          
        
       
      ds_SetFileAttributes
       ds_SetFileAttributes(string
          pFileName,byte pNewAttribs)
        
        Description
        
        Set the directory attributes of a file.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFileName (string) | Specify the file (with path) for which the directory entry
                data is required. | 
            
              | pNewFileAttribs (byte) | Specify the new attributes. 
 ff_:NORMAL EQUATE(0) !Always active
 ff_:READONLY EQUATE(1) !Not for use as attributes parameter
 ff_:HIDDEN EQUATE(2)
 ff_:SYSTEM EQUATE(4)
 ff_:DIRECTORY EQUATE(10H)
 ff_:ARCHIVE EQUATE(20H) ! NOT Win95 compatible
 | 
          
        
        
        Returns
        
        Byte, TRUE (1) for success, FALSE (0) for failure.
        
        
Example
        
          
            
              | Example | 
            
              | code ds_SetFileAttributes('c:\FileName.ext',0)
                ! clears files attributes.
 | 
          
        
       
      ds_CopyDirectory
       ds_CopyDirectory(string
          Source,string Destination, string Mask, [Long IncludeSubDirectories],
          [Long IncludeHiddenFiles], [Long IncludeSystemFiles], [Long
          ProgressControl], [Long StringControl]),long
        
        Description
        
        Copy the contents of one folder to another folder. The contents of the
        original folder are not deleted. ie this is a Copy, not a Move. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | Source (string) | The name of the source directory to copy from. | 
            
              | Destination (string) | The name of the destination directory to copy to. If the
                destination directory does not exist it will be created. | 
            
              | Mask (string) | The mask for files in the source folder(s) to copy. For
                example *.htm will copy only files with the htm extension. If
                this parameter is left blank then the default mask, *.*, will be
                used. | 
            
              | IncludeSubDirectories (long) | Set to 1 for sub-directories to be copied as well. Set to 0 if
                only files must be copied. This parameter is option, the default
                value is 0 (ie by default sub-directories are not copied.) | 
            
              | IncludeHiddenFiles (long) | This parameter is optional, the default value is 1. If you do
                not want to copy hidden files then set this parameter to 0. | 
            
              | IncludeSystemFiles (long) | This parameter is optional, the default value is 1. If you do
                not want to copy system files then set this parameter to 0. | 
            
              | ProgressControl (long) | The Use Equate number of a progress control on the window. If
                this is set then the progress bar will be updated as the Copy
                command progresses. If it is set to 0 or omitted then no
                progress control will be updated. | 
            
              | StringControl (long) | The Use Equate number of a string control on the window that
                will be updated with the name of the file currently being
                copied. If set to 0, or omitted, then no string control will be
                updated. | 
          
        
        Returns
        
        Long: The number of files successfully copied. Or a negative number if
        the copy failed at a specific file (the numeric value contains the
        number of files that were successfully copied before failure).
        
        
Example
        
          
            
              | Example | 
            
              | code ans =
                  ds_CopyDirectory(FileSelected,CopyTo,'*.*',1,1,1,?Progress1,?String1)
 | 
          
        
       
      ds_CreateDirectory
       ds_CreateDirectory(string
          pNewDirectoryName)
        
        Description
        
        Create a new directory. This method is recursive, meaning that it will
        create multiple levels of folders in a single call if necessary to
        create the final folder.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pNewDirectoryName (string) | Specify the name (including path) of the new directory to
                create. | 
          
        
        
        Returns
        
        Byte, 
TRUE (1) for success, 
FALSE
          (0) for failure. If the directory already exists then the
        function returns true, for success. If you need to know if the folder
        preexists then use the Clarion 
EXISTS command
        before calling this function. If the path does preexist then the
        ds_ErrorCode() call will return 
WE:ERROR_ALREADY_EXISTS.
        
        
        
Example
        
          
            
              | Example | 
            
              | code ds_CreateDirectory('c:\My
                  New Directory') ! creates the
                  directory
 | 
          
        
       
      ds_RemoveDirectory
      ds_RemoveDirectory(string pDirectoryName)
       
        Description
        
        Remove a directory. 
        
        The directory must be empty.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pDirectoryName (string) | Specify the name (including path) of the directory to remove. | 
          
        
        
        Returns
        
        Byte, TRUE (1) for success, FALSE (0) for failure.
        
        
Example
        
          
            
              | Example | 
            
              | code ds_RemoveDirectory('c:\My
                  New Directory') ! removes any
                  empty directory.
 | 
          
        
       
      ds_SetFileDateTime
       ds_SetFileDateTime(string
          pFileName,long pNewDate,long pNewTime)
        
        Description
        
        Set the date and time of the files directory entry.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFileName (string) | Specify the file (with path) for which the directory is to be
                modified. | 
            
              | pNewDate (long) | New date (clarion date) for the file. | 
            
              | pNewTime (long) | New time (clarion time) for the file. | 
          
        
        Returns
        
        Byte, TRUE (1) for success, FALSE (0) for failure.
        
        
Example
        
          
            
              | Example | 
            
              | code ds_SetFileDateTime('c:\MyFile.txt',today(),clock())
                ! Sets the files date and time to now.
 | 
          
        
       
      ds_MoveFile
       ds_MoveFile(string
          pFileName,string pNewFileName)
        
        Description
        
        Moves (renames) a file by changing its directory entry.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFileName (string) | Specify the file (with path) to be moved. | 
            
              | pNewFileName (string) | Specify the new file (with new path). | 
          
        
        Returns
        
        Byte, TRUE (1) for success, FALSE (0) for failure.
        
        
Example
        
          
            
              | Example | 
            
              | code ds_MoveFile('c:\MyFile.txt','c:\NewDirectory\NewFileName.ext')
                  ! moves and renames the file to
                  the directory.
 | 
          
        
       
      ds_ExpandDirectory
       ds_ExpandDirectory(String
          pFilename) 
        
        Description
        
        Takes in a fully qualifies path & file name, and replaces tokens
        with the current user's details.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFileName (string) | A file name, including path. | 
          
        
        Tokens 
        
          
            
              | Token | Example | 
            
              | %APPDATA% | C:\Users\Bruce\AppData\Roaming | 
            
              | %COMMONDESKTOP% | C:\Users\Public\Desktop | 
            
              | %COMMONDOCUMENTS% | C:\Users\Public\Documents | 
            
              | %DESKTOP% | C:\Users\Bruce\Desktop | 
            
              | %DROPBOX% | c:\Users\Bruce\Dropbox | 
            
              | %LOCALAPPDATA% | C:\Users\Bruce\AppData\Local | 
            
              | %ONEDRIVE% | %USERPROFILE%\OneDrive | 
            
              | %PROGRAMDATA% | C:\ProgramData | 
            
              | %PROGRAMFILES% | C:\Program Files | 
            
              | %PROGRAMFILES86% | C:\Program Files (x86) | 
            
              | %PROGRAMFILES(X86)% | C:\Program Files (x86) | 
            
              | %USER% | Bruce | 
            
              | %USERPROFILE% | c:\Users\Bruce | 
            
              | %SYSTEM% | C:\Windows\system32 | 
            
              | %WINDOWS% | C:\Windows | 
            
              | %WORKSTATION% | Accounts | 
          
        
        Returns 
        
        A string. Any tokens in the pFileName parameter are replaced. If no
        tokens exist then the pFileName parameter is returned unaltered.
        
      
 
      ds_GetFolderPath
       ds_GetFolderPath(long
          pCSIDL,<byte pCreateFlag>) 
        
        Description
        
        Returns the specified windows folder path.  If the optional CreateFlag
        is TRUE then the directory will be created if it does not exist.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pCSIDL (long) | A CSIDL equate specifying the windows folder. | 
            
              | pCreateFlag (byte) | Optional. If TRUE (1) then the folder will be created if it
                does not exist. | 
          
        
        NOTE: Some of these equates (in Windows Vista and up) no longer return
        the common area folder, but the user folder. This is not a WinEvent
        issue, as WinEvent just makes use of the API calls in windows. This is a
        change in spec for the API call value parameter by Windows. See:
        https://msdn.microsoft.com/en-us/library/dd378457%28v=vs.85%29.aspx
        
        
WE::CSIDL_DESKTOP equate(000h) 
          WE::CSIDL_INTERNET equate(001h) 
          WE::CSIDL_PROGRAMS equate(002h) 
          WE::CSIDL_CONTROLS equate(003h) 
          WE::CSIDL_PRINTERS equate(004h) 
          WE::CSIDL_PERSONAL equate(005h) 
          WE::CSIDL_FAVORITES equate(006h) 
          WE::CSIDL_STARTUP equate(007h) 
          WE::CSIDL_RECENT equate(008h) 
          WE::CSIDL_SENDTO equate(009h) 
          WE::CSIDL_BITBUCKET equate(00Ah) 
          WE::CSIDL_STARTMENU equate(00Bh) 
          WE::CSIDL_MYDOCUMENTS equate(00Ch) 
          WE::CSIDL_MYMUSIC equate(00Dh) 
          WE::CSIDL_MYVIDEO equate(00Eh) 
          WE::CSIDL_DESKTOPDIRECTORY equate(010h)
          WE::CSIDL_DRIVES equate(011h) 
          WE::CSIDL_NETWORK equate(012h)
          WE::CSIDL_NETHOOD equate(013h) 
          WE::CSIDL_FONTS equate(014h) 
          WE::CSIDL_TEMPLATES equate(015h) 
          WE::CSIDL_COMMON_STARTMENU equate(016h)
          WE::CSIDL_COMMON_PROGRAMS equate(017h)
          WE::CSIDL_COMMON_STARTUP equate(018h)
          WE::CSIDL_COMMON_DESKTOPDIRECTORY equate(019h) 
          WE::CSIDL_APPDATA equate(01Ah) 
          WE::CSIDL_PRINTHOOD equate(01Bh)
          WE::CSIDL_LOCAL_APPDATA equate(01Ch) 
          WE::CSIDL_ALTSTARTUP equate(01Dh) 
          WE::CSIDL_COMMON_ALTSTARTUP equate(01Eh) WE::CSIDL_COMMON_FAVORITES equate(01Fh)
        
          WE::CSIDL_INTERNET_CACHE equate(020h) 
          WE::CSIDL_COOKIES equate(021h)
          WE::CSIDL_HISTORY equate(022h) 
          WE::CSIDL_COMMON_APPDATA equate(023h) 
          WE::CSIDL_WINDOWS equate(024h) 
          WE::CSIDL_SYSTEM equate(025h) 
          WE::CSIDL_PROGRAM_FILES equate(026h) 
          WE::CSIDL_MYPICTURES equate(027h)
          WE::CSIDL_PROFILE equate(028h)
          WE::CSIDL_SYSTEMX86 equate(029h)
          WE::CSIDL_PROGRAM_FILESX86 equate(02Ah) 
          WE::CSIDL_PROGRAM_FILES_COMMON equate(02Bh) 
          WE::CSIDL_PROGRAM_FILES_COMMONX86 equate(02Ch)  
          WE::CSIDL_COMMON_TEMPLATES equate(02Dh) 
          WE::CSIDL_COMMON_DOCUMENTS equate(02Eh) 
          WE::CSIDL_COMMON_ADMINTOOLS equate(02Fh)  
          WE::CSIDL_ADMINTOOLS equate(030h) 
          WE::CSIDL_CONNECTIONS equate(031h) 
          WE::CSIDL_COMMON_MUSIC equate(035h) 
          WE::CSIDL_COMMON_PICTURES equate(036h)
          WE::CSIDL_COMMON_VIDEO equate(037h) 
          WE::CSIDL_RESOURCES equate(038h) .  WE::CSIDL_RESOURCES_LOCALIZED equate(039h) 
        
          WE::CSIDL_COMMON_OEM_LINKS equate(03Ah) WE::CSIDL_CDBURN_AREA equate(03Bh)  
          WE::CSIDL_COMPUTERSNEARME equate(03Dh) 
        
        
        Note: You cannot use CSIDL_CONTROLS,
        CSIDL_PRINTERS, and CSIDL_DRIVES as these are all virtual drives, and
        the windows API returns empty strings for these equates.
        
        
Returns
        
        String with specified path (in shortpath format). To convert to a
        longpath, use the longpath() function.
        
        
Example
        
          
            
              | Example | 
            
              | code DisplayPath =
                  ds_GetFolderPath(WE::CSIDL_PROGRAMS,1) !
                  C:\Documents and Settings\username\Start Menu\Programs
 DisplayLongPath =
                  longpath(DisplayPath)
 
 | 
          
        
        
        Note (a comparison for XP and Vista
        returns):
        
        WE::CSIDL_Common_Appdata
            XP    C:\Documents and Settings\All Users\Application Data
            Vista    C:\ProgramData
        
        WE::CSIDL_AppData
            XP    C:\Documents and Settings\user.domain\Application Data
            Vista    C:\Users\user\Roming
        
        WE::CSIDL_Local_Appdata
            XP    C:\Documents and Settings\user.domain\Local
        Settings\Applicatin 
        Data
            Vista    C:\Users\user\AppData\Local
        
        WE::CSIDL_Program_Files
            XP    C:\Program Files
            Vista    C:\Program Files 
 
      ds_GetTempPath
       ds_GetTempPath()
        
        
        Description
        
        Returns the path to the windows temporary directory.
        
        
Parameters
        
        None
        
        
Returns
        
        String containing the path.
        
        
Example
        
          
            
              | Example | 
            
              | code DisplayPath = ds_GetTempPath()
                ! C:\WINDOWS\TMP
 | 
          
        
       
      ds_String2File
       ds_String2File(string
          pWriteString,<long pWriteLen>,string pFileName)
        
        Description
        
        Takes a string and saves it to a file. 
        The file is created if it does not exist. The file is emptied if it does
        exist.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pWriteString (string) | String to be written to file. | 
            
              | pWriteLen (long) | Optional. The length of the string to be written to file. If
                omitted then the string is clipped before writing to file. | 
            
              | pFileName (string) | The name of the file (including path). | 
          
        
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | code if ds_String2File('Just
                  Testing',,'C:\MyTestFile.TXT') !
                  Creates / empties file and then writes data to file.
 message('ds_string2file failed : ' & ds_error())
 end
 | 
          
        
       
      ds_File2String
       ds_File2String(ds_StringRef
          pStringRef,<long pMaxLen>,string pFileName)
        
        Description
        
        Reads a file into a string. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pStringRef (ds_StringRef) | The label of a ds_StringRef structure. | 
            
              | pMaxLen (long) | Optional.  The max length of the string to be returned.  File
                contents truncated at this length if required. | 
            
              | pFileName (string) | The name of the file (including path). | 
          
        
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        
        See 
ds_ErrorCode for more info.
        
        
NB: You must dispose the returned string after
          using the contents in order to avoid memory leaks (if the function
          succeeds): 
        
        dispose(TestFileRead.bin)
        
        
Example
        
          
            
              | Example | 
            
              | TestFileRead   GROUP(ds_StringRef) END
 
 code
 if ds_string2file('testing 123...',,'c:\testing.txt')
 message('ds_string2file failed : ' & ds_error())
 end
 
 if ds_file2string(TestFileRead,,'c:\testing.txt')
 message('ds_file2string failed : ' & ds_error())
 !No need to dispose if it failed
 else
 DisplayString = TestFileRead.bin ! string read from file.
 DisplayLength = TestFileRead.len ! Length of string read
                from file.
 dispose(TestFileRead.bin)
 end
 | 
          
        
       
      ds_GetHModule
       ds_GetHModule
          (<string pModuleName>)
        
        Description
        
        Gets a handle to the specified module or if omitted to the current
        module. This is used with the ds_GetHIcon function.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pModuleName (string) | Optional string containing the name of the required module. | 
          
        
        
        Returns
        
        A ulong handle to the the specified module or if omitted to the current
        module.
        
        
Example
        
          
            
              | Example | 
            
              | hModule ulong code
 hModule = ds_GetHModule() ! returns handle to current
                  module.
 hModule =
                  ds_GetHModule('MyIcons.dll') ! returns handle to MyIcons.dll
 | 
          
        
       
      ds_GetHIcon
       ds_GetHIcon(string
          pIconName,<ulong pHIconModule>,<long
          pIconSize>),ds_DestroyIcon()
        
        Description
        
        Gets a handle to the compiled-in icon. If the icon is not in the current
        module then a handle to the module must be supplied. The icon size may
        be specified ie 16X16 or 32X32 or 48X48. If the icon size is not
        specified then the first icon in the resource is loaded.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pIconName (string) | The name of the icon file or icon resource. Compiled-in icon
                names must be prefixed with '~'. | 
            
              | pHIconModule (ulong) | Optional. A handle to the module containing the icon. | 
            
              | pIconSize (long) | Optional. The size required. Usually 16X16, 32X32 or 48X48.
                Defaults to 16X16 if it exists. | 
          
        
        
        Returns
        
        A ulong handle to the the specified icon. Zero is returned if the
        function fails.
        
        
Example
        
          
            
              | Example | 
            
              | hIcon ulong code
 hIcon = ds_GetHIcon('~MyIcon.ico') ! returns handle to
                  compiled-in icon called 'MyIcon.ico'.
 hIcon =
                  ds_GetHIcon('~MyIcon.ico',ds_GetHModule('MyIcons.dll') !
                  returns handle to 'MyIcon.ico' in the DLL MyIcons.dll
 hIcon = ds_GetHIcon('MyIcon.ico',,48)
                  ! returns handle to 48X48 icon inside the file 'MyIcon.ico'.
 ......
 ds_DestroyIcon(hIcon) ! Free memory
 | 
          
        
       
      ds_CreateShortcutEx
       ds_CreateShortcutEx
(string
          pTargetFile,<string pIconName>,long pIconIndex=0,string
          pDescription,long pHotKey=0,string pStartIn,string
          pShortCut,<string pShortCutPath>,<string
          pArguments>,<string pReserved>)
        
        Description
        
        Create a shortcut to a file.  The shortcut can be placed on the desktop
        or in the START menu. Usually followed with a call to 
ds_RefreshDesktop.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pTargetFile (string) | The file, including the path, to which a shortcut must be
                made. Example  C:\WINDOWS\SYSTEM32\CALC.EXE
 | 
            
              | pIconName (<string>) | The file, including the path, which contains the icon to be
                used with this shortcut.  If omitted then the first icon in the
                pTargetFile is used. | 
            
              | pIconIndex (long) | The index of the icon within the pIconName file to use.  If
                omitted then the first icon is used. | 
            
              | pDescription (string) | The tip which will appear if the cursor is held over the
                shortcut. | 
            
              | pHotKey (long) | The hot key to run the shortcut.  Omit or use ZERO if not
                required. Example CTRLALTC
 | 
            
              | pStartIn (string) | The path to the directory in which the file must be run /
                opened. | 
            
              | pShortCut (string) | The name for the shortcut. Example 'Calculator.LNK'
 | 
            
              | pShortCutPath (<string >) | The destination where the shortcut must be placed.  If omitted
                then defaults to the desktop. Example C:\Documents and Settings\Derek\Desktop
 | 
            
              | pArguments (<string>) | if you would like to add arguments (i.e. command line
                parameters) to the shortcut command line, then you can pass
                these in this parameter. | 
            
              | pReserved (<string>) | reserved for future functionality. | 
          
        
        Returns
        
        Zero is returned if the function succeeds.
        
        
Example
        
          
            
              | Example | 
            
              | code ds_CreateShortcutEx(clip(ds_GetFolderPath(WE::CSIDL_SYSTEM
                  ,1)) &
                  '\CALC.EXE',,,'Calculator!',CTRLALTC,clip(ds_GetFolderPath(WE::CSIDL_SYSTEM
                  ,1)),'Calculator.LNK')
 
 ds_CreateShortcutEx('C:\WINDOWS\SYSTEM32\CALC.EXE',,,'Calculator!',CTRLALTC,'C:\WINDOWS\SYSTEM32','Calculator.LNK','C:\Documents and
                Settings\Derek\Desktop','/debugfmall')
 ds_RefreshDesktop()
 | 
          
        
        This function replaces the deprecated ds_CreateShortCut function (which
        has no parameter for additional arguments). 
 
      ds_GetFileVersionInfo
       ds_GetFileVersionInfo(<string
pDescription>,<*string
          pFileName>)
        
        Description
        
        Used to return the file version data compiled into the EXE / DLL.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pDescription (string) | Default='FileVersion'  The name version data required. 
 Standard descriptions are as follows:
 
                  
                    
                      | Comments | InternalName | ProductName |  
                      | CompanyName | LegalCopyright | ProductVersion |  
                      | FileDescription | LegalTrademarks | PrivateBuild |  
                      | FileVersion | OriginalFilename | SpecialBuild |  | 
            
              | pFileName (*string) | Default=Current Module.  The name including path of the file
                from which version data is required. | 
          
        
        
        Returns
        
        String. Returns info if found. If fails then returns empty string, see
        ds_Error() for more info.
        
        
Example
        
          
            
              | Example | 
            
              | code DisplayInfo = ds_GetFileVersionInfo()  ! returns FileVersion
                by default.
 | 
          
        
       
      ds_GetCurrentEXEDate
       ds_GetCurrentEXEDate()
        
        Description
        
        Used to return the current date of the EXE.
        
        
Parameters
        
        None
        
        
Returns
        
        Long. Returns the date of the EXE.
        
        
Example
        
          
            
              | Example | 
            
              | code CurrentEXEDate = ds_GetCurrentEXEDate()  ! returns the EXE
                date by default.
 | 
          
        
       
      ds_LoadDLLProc
       ds_LoadDLLProc(string
          ProcName,string pLibName,*ulong pProcAddress,<*ulong
          pLibInstance>)
        
        Description
        
        Used to load a DLL into memory if it is not already loaded and then to
        return the call address of the specified DLL function.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pProcName (string) | The name of the DLL procedure. This procedures call address
                will be returned. | 
            
              | pLibName (string) | The name of the DLL to load. | 
            
              | pProcAddress (ulong) | The call address of the DLL procedure is saved here. 
                Subsequent calls to ds_LoadDLLProc will simply return if this is
                already set. | 
            
              | pLibInstance (ulong) | Optional.  This is used by ds_UnloadDLLProc to unload the DLL
                if it is no longer required. | 
          
        
        Windows will unload the DLL when your application quits and so this is
        not required.
        
        
Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | "Inside global map" - Global embed point module('windows')
 WC_GetDiskFreeSpaceEx(ulong,*dlong,*dlong,*dlong), byte,
                raw, pascal, Dll(_fp_)       ! The Dll(_fp_) tells the compiler
                not to link in this function.
 end
 
 "Global Data" - Global embed point
 fp_GetDiskFreeSpaceEx    
                ulong,static,name('WC_GetDiskFreeSpaceEx')
 
 code
 if
                ~ds_LoadDLLProc('GetDiskFreeSpaceExA','kernel32',fp_GetDiskFreeSpaceEx)
 result =
                WC_GetDiskFreeSpaceEx(0,dlongUserFree,dlongTotal,dlongTotalFree)
 ...
 else
 ! lib or function not found
 message('ds_LoadDLLProc failed : ' & ds_Error())
 end
 | 
          
        
        Note: To use an external clarion DLL you
        need to do the following:
        
        1. You must use the real procedure name from the Clarion DLL (this
        normally ends with @F - but you will need to check this using a tool
        such as libmaker.exe to find out the exact name of the function that is
        exported).
        
        2. You need to add the pascal attribute to your procedure prototype. 
 
      ds_UnloadDLLProc
       ds_UnloadDLLProc(*ulong
          pProcAddress,ulong pLibInstance)
        
        Description
        
        Used to unload a DLL. 
        Windows will unload the DLL when your application quits and so this is
        not required.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pProcAddress (ulong) | The call address of the DLL procedure will be reset.  This
                will force a subsequent call to ds_LoadDLLProc to reload the
                DLL. | 
            
              | pLibInstance (ulong) | This must be set by ds_LoadDLLProc. | 
          
        
        Returns
        
        Long. Returns 0 for Success  else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | "Inside global map" - Global embed point module('windows')
 WC_GetDiskFreeSpaceEx(ulong,*dlong,*dlong,*dlong), byte,
                raw, pascal, Dll(_fp_)       ! The Dll(_fp_) tells the compiler
                not to link in this function.
 end
 
 "Global Data" - Global embed point
 fp_GetDiskFreeSpaceEx    
                ulong,static,name('WC_GetDiskFreeSpaceEx')
 LibInstance                         ulong,static
 
 code
 if
~ds_LoadDLLProc('GetDiskFreeSpaceExA','kernel32',fp_GetDiskFreeSpaceEx,LibInstance)
 result =
                WC_GetDiskFreeSpaceEx(0,dlongUserFree,dlongTotal,dlongTotalFree)
 ...
 else
 ! lib or function not found
 message('ds_LoadDLLProc failed : ' & ds_Error())
 end
 .....
 if ds_UnloadDLLProc(fp_GetDiskFreeSpaceEx,LibInstance) !
                Unload DLL as no longer required
 message('ds_UnloadDLLProc failed : ' & ds_Error())
 end
 | 
          
        
       
      ds_GetDLLVersion
       ds_GetDLLVersion(string
          pDLLName,*ds_DLLVersionG pDLLVerInf)
        
        Description
        
        Used to retrieve the version information from a windows DLL. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pDLLName (string) | The name of the DLL from which version info is required. | 
            
              | pDLLVerInf (*ds_DLLVersionG) | This structure is filled with the version info. | 
          
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | DLLVerInf group(ds_DLLVersionG) . 
 code
 if ~ds_GetDLLVersion('shell32.dll',DLLVerInf)
 ! ds_DLLVersionG group
 !   MajorVersion ulong
 !   MinorVersion ulong
 !   BuildNumber ulong
 !   PlatformID ulong
 !   String string(30)
 ! end
 
 if DLLVerInf.MajorVersion > 4
 ! Taskbar balloons supported under shell version 5 and
                higher.
 else
 ! Taskbar balloons not supported.
 end
 end
 | 
          
        
       
      ds_GSMSendSMS
       ds_GSMSendSMS(long
          pPID,string pSMSText,string pSMSPhoneNumber,<string
          pPIN>,<*long pSMSID>)
        
        Description
        
        Used to send an SMS via a GSM modem.
        
        
Note : Uses 
ds_Timer(999).
        
        ds_GSMSendSMS calls the following 4 procedures:
        
        ds_GSMEchoOFF(pPID)
        ds_GSMEnterPin(pPID,pPIN)
        ds_GSMSetSMSTextmode(pPID)
        ds_GSMGetReply...
        
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected.  See the NewPort function. | 
            
              | pSMSText (string) | The SMS text string to send. Example 'Please call me.  I am
                low on airtime :)' | 
            
              | pSMSPhoneNumber (string) | The mobile number to send the SMS to. | 
            
              | pPIN (string) | Optional. The PIN number to gain access to the SIM card in the
                GSM modem. 
 The PIN code request on the SIM card may be disabled.  In this
                case the PIN is not required.
 NB : If you try the wrong PIN
                code 3 times then your SIM may be locked and will need the PUK
                number to unlock it.  This is not handled by WinEvent.
 | 
            
              | pSMSID (*long) | Optional. Most GSM modems return an SMS identifier that may be
                used with the SMS delivery report to identify which SMS was
                delivered. | 
          
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long SMSID    long
 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMSendSMS(PID,'Hello There','08XXXXXXXXX','1234',SMSID)
 message = ds_Error()
 else
 message = 'Send Succeeded, SMSID=' & SMSID1
 end
 | 
          
        
        Note: If you want to use non-standard chars (like æøåÆØÅ) then you'll
        need to use their ASCII value equivalents in the string. 
 
      ds_GSMEnterPin
       ds_GSMEnterPin(long
          pPID,string pPIN)
        
        Description
        
        Used to gain access to a SIM card in a GSM modem.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected. See the NewPort function. | 
            
              | pPIN (string) | The PIN number to gain access to the SIM card in the GSM
                modem. | 
          
        
        The PIN code request on the SIM card may be disabled. In this case
        ds_GSMEnterPin will return 0 (Success).
        
NB : If you try the wrong PIN code 3
        times then your SIM may be locked and will need the PUK number to unlock
        it. This is not handled by WinEvent.
        
        
Returns
        
        Long. Returns 0 for Success  else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMEchoOFF(PID)
 message('ds_GSMEchoOFF failed : ' & ds_Error())
 elsif ds_GSMEnterPIN(PID,PIN)
 message('ds_GSMEnterPIN failed : ' & ds_Error())
 else
 message('PIN OK')
 end
 | 
          
        
       
      ds_GSMEchoOFF
       ds_GSMEchoOFF(long
          pPID)
        
        Description
        
        Used to turn off the echoing of commands sent to the GSM modem.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected. See the NewPort function. | 
          
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMEchoOFF(PID)
 message('ds_GSMEchoOFF failed : ' & ds_Error())
 else
 message('ECHO OFF')
 end
 | 
          
        
       
      ds_GSMSetSMSTextmode
       ds_GSMSetSMSTextmode(long
          pPID)
        
        Description
        
        Used to set the GSM modem into text mode for the SMS send function.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected. See the NewPort function. | 
          
        
        
        Returns
        
        Long. Returns 0 for Success  else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMEchoOFF(PID)
 message('ds_GSMEchoOFF failed : ' & ds_Error())
 elsif ds_GSMSetSMSTextmode(PID)
 message('ds_GSMSetSMSTextmode failed : ' & ds_Error())
 else
 message('ds_GSMSetSMSTextmode OK')
 end
 | 
          
        
       
      ds_GetGSMReply
       ds_GetGSMReply(long
pPID,string
          pCMD,long pCmdLen=0,*string pReplyString,long pTimeout=25,long
          pTimeout2=25,byte pTrailingOK=FALSE,byte pFindPrompt=FALSE,byte
          pIgnorePrompt=FALSE)
        
        Description
        
        Used to send an command to the GSM modem and wait for a response.
        
        
Note : Uses 
ds_Timer(999).
        
        leading '<13>' (CR) and '<10>' (LF) characters in the modem
        response are discarded.
        If the modem response starts with the command sent then this is also
        discarded. (modem echo)
        ds_GSMGetReply starts with a call to ds_EmptyPort(pPID) before sending
        the command string.
        
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected.  See the NewPort function. | 
            
              | pCMD (string) | The command to send to the modem. Tip : Most modems require a CR / LF terminator on the
                command ie. 'AT+CPIN?<13,10>' where ascii 13 is CR and
                ascii 10 is LF.
 | 
            
              | pCmdLen (long) | Optional.  This is the command string length to send.  If
                omitted then the string is clipped before sending. | 
            
              | pReplyString (*string) | The modem response is returned in this string. | 
            
              | pTimeout (long) | Optional.  Default =50 (0.50 secs).  This is the timeout for
                the first character of the modem response. You might need to
                increase this to  quite large (depending on the service
                provider). Some Providers require as much as 90 seconds (i.e.
                this timeout set to 9000). If you are getting intermittent or
                failed replies, then this is one possibility that should be
                adjusted. | 
            
              | pTimeout2 (long) | Optional.  Default =25 (0.25 secs).  This is the timeout for
                subsequent characters of the modem response. | 
            
              | pTrailingOK (byte) | Optional.  Default=FALSE.  This flag when set specifies that
                the modem response terminates with an
                '<13,10>OK<13,10>' . If not set then the first '<13,10>'  will be taken as the
                end of the modem response.
 | 
            
              | pFindPrompt (byte) | Optional.  Default=FALSE. This flag when set specifies that
                the modem response terminates with an '> ' . | 
            
              | pIgnorePrompt (byte) | Optional. Default=FALSE. This flag when set then leading '>
                ' characters in the modem response are discarded. | 
          
        
        Returns
        
        Long. Returns 0 for Success  else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long ReplyString    string(1024)
 
 code
 PID = NewPort('com1:9600,n,8,1')
 ds_GetGSMReply(PID,'AT+CPIN?<13,10>',,ReplyString,,,1) !
                Query +CPIN state and waits for OK response.
 ds_GetGSMReply(PID,'AT+CMGS="082XXXXXX"<13,10>',,ReplyString,1000,,,1)
                ! Dials Mobile Number and waits for "> " response.
 | 
          
        
       
      ds_EmptyPort
       ds_EmptyPort(long
          pPID,long pTimeout=50)
        
        Description
        
        Used to save any unsolicited modem responses into an internal queue and
        to empty the com port input buffer.
        
Note : Uses 
ds_Timer(999).
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected.  See the NewPort function. | 
            
              | pTimeout (long) | Optional.  Default =50 (0.5 secs). This is the timeout for
                attempting to empty the com port input buffer. | 
          
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_ds_EmptyPort(PID)
 message('ds_EmptyPort failed : ' & ds_Error())
 else
 message('ds_EmptyPort OK')
 end
 | 
          
        
       
      ds_GSMReadSMSInit
       ds_GSMReadSMSInit(long
          pPID,string pPIN)
        
        Description
        
        Used to prepare the GSM modem for reading the SMS list.
        
        
Note : ds_GSMReadSMSInit calls the
        following.
        
        ds_GSMEchoOFF(pPID)
        ds_GSMEnterPin(pPID,pPIN)
        ds_GSMSetSMSTextmode(pPID) 
        ds_GSMSelectSR(pPID,FALSE)
        ds_GSMGetReply.......
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected. See the NewPort function. | 
            
              | pPIN (string) | Optional. The PIN number to gain access to the SIM card in the
                GSM modem. | 
          
        
        The PIN code request on the SIM card may be disabled. In this case the
        PIN is not required.
        
NB : If you try the wrong PIN code 3
        times then your SIM may be locked and will need the PUK number to unlock
        it. This is not handled by WinEvent. 
        
        
Returns
        
        Long. Returns 0 for Success  else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMReadSMSInit(PID)
 message('ds_GSMReadSMSInit failed : ' & ds_Error())
 else
 message('ds_GSMReadSMSInit OK')
 end
 | 
          
        
       
      ds_GSMReadSMS(long pPID,long
        pSMSIndex,*ds_SMSMessageG pSMSG)
       ds_GSMReadSMS(long
          pPID,long pSMSIndex,*ds_SMSMessageG pSMSG)
        
        Description
        
        Used to read the SMS memory from the GSM modem at the specified memory
        index.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected. See the NewPort function. | 
            
              | pSMSIndex (long) | Which memory index to read. | 
            
              | pSMSG (*ds_SMSMessageG) | This structure is filled with the data from the memory index. | 
          
        
        Returns
        
        Long. Returns 0 for Success  else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long SMSIndex  long
 
 SMSG    group(ds_SMSMessageG)
 end
 
 code
 SMSIndex = 0
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMReadSMSInit(PID,PIN)
 message('ds_GSMReadSMSInit failed : ' & ds_Error())
 else
 loop
 SMSIndex += 1
 if ds_GSMReadSMS(PID,SMSIndex,SMSG) then break .
 
 end
 end
 | 
          
        
       
      ds_GSMDeleteSMS
       ds_GSMDeleteSMS(long
          pPID,long pSMSIndex)
        
        Description
        
        Used to read the clear the SMS memory from the GSM modem at the
        specified memory index. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected. See the NewPort function. | 
            
              | pSMSIndex (long) | Which memory index to clear. | 
          
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMDeleteSMS(PID,3) ! delete index 3
 message('ds_GSMDeleteSMS failed : ' & ds_Error())
 else
 message('ds_GSMDeleteSMS OK')
 end
 | 
          
        
       
      ds_GSMSetSMSReporting
       ds_GSMSetSMSReporting(long
pPID,byte
          pEnableReport=1,long pTimeout=1440,<string pPIN>)
        
        Description
        
        Used to enable SMS delivery reporting.
        If the mobile to which the SMS is sent is turned off or out of range
        then the delivery report will be delayed until either the SMS is sent or
        the timeout lapses.
        
        Note : ds_GSMReadSMSInit calls the following.
        ds_GSMEnterPin(PID,PIN) 
        ds_GSMSetSMSTextmode(PID) 
        ds_GSMGetReply....
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected.  See the NewPort function. | 
            
              | pEnableReport (byte) | Optional.  Default=1 (TRUE)  If this flag is reset (0) then
                the SMS delivery reporting is disabled. | 
            
              | pTimeout (long) | Optional.  Default =1440 minutes (24 Hours).  This is the
                length of time in minutes that the network must try to send the
                SMS for before sending a failed report. 
 The range of the timeout is from 5 minutes to 63 weeks.
 if pTimeOut > 43200 ! 30 days
 the resolution is weeks [5 to 63 weeks]
 elsif pTimeOut > 1440 ! 1 day
 the resolution is days [2 to 30 days]
 elsif pTimeOut > 720 ! 12 hours
 the resolution is 30 minute blocks [12:30 to 24:00]
 else ! <= 12 hours
 the resolution is 5 minute blocks [0:05 to 12:00]
 end
 | 
            
              | pPIN (string) | Optional. The PIN number to gain access to the SIM card in the
                GSM modem. | 
          
        
        The PIN code request on the SIM card may be disabled. In this case the
        PIN is not required.
        
NB : If you try the wrong PIN code 3
        times then your SIM may be locked and will need the PUK number to unlock
        it. This is not handled by WinEvent.
        
        
Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMSetSMSReporting(PID)
 message('ds_GSMSetSMSReporting failed : ' &
                  ds_Error())
 else
 message('ds_GSMSetSMSReporting OK')
 end
 | 
          
        
       
      ds_GSMSelectSR
       ds_GSMSelectSR(long
          pPID,byte pSRMemory=1)
        
        Description
        
        Used to select the SIM / device memory where the SMS delivery reports
        are stored.
        Most GSM modems use a common area for SMS delivery reports and received
        SMS's. This command is necessary for those devices that use a separate
        memory area. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected. See the NewPort function. | 
            
              | pSRMemory (byte) | Optional. Default=1 (TRUE) If this flag is set then the SMS
                delivery report storage area is selected. If this flag is reset then the received SMS storage area is
                selected.
 | 
          
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMSelectSR(PID)
 message('ds_GSMSelectSR failed : ' & ds_Error())
 else
 message('ds_GSMSelectSR OK')
 end
 | 
          
        
       
      ds_GSMReadSMSReportInit
       ds_GSMReadSMSReportInit(long
          pPID,string pPIN)
        
        Description
        
        Used to prepare the GSM modem for reading the SMS delivery report list.
        
        
Note : ds_GSMReadSMSReportInit calls the
        following.
        
        ds_GSMEchoOFF(pPID)
        ds_GSMEnterPin(pPID,pPIN)
        ds_GSMSetSMSTextmode(pPID) 
        ds_GSMSelectSR(pPID,TRUE)
        ds_GSMGetReply.......
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected.  See the NewPort function. | 
            
              | pPIN (string) | Optional. The PIN number to gain access to the SIM card in the
                GSM modem. 
 The PIN code request on the SIM card may be disabled. In this
                case the PIN is not required.
 NB : If you try the wrong PIN code 3 times then your SIM may be
                locked and will need the PUK number to unlock it. This is not
                handled by WinEvent.
 | 
          
        
        Returns
        
        Long. Returns 0 for Success  else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMReadSMSReportInit(PID)
 message('ds_GSMReadSMSReportInit failed : ' &
                  ds_Error())
 else
 message('ds_GSMReadSMSReportInit OK')
 end
 | 
          
        
       
      ds_GSMReadSMSReport
       ds_GSMReadSMSReport(long
pPID,long
          pSMSReportIndex,*ds_SMSReportG pDRG)
        
        Description
        
        Used to read the SMS delivery report memory from the GSM modem at the
        specified memory index. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected.  See the NewPort function. | 
            
              | pSMSReportIndex (long) | Which memory index to read. | 
            
              | pDRG (*ds_SMSReportG) | This structure is filled with the data from the memory index. | 
          
        
        Returns
        
        Long. Returns 0 for Success  else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long SMSReportIndex  long
 
 DRG    group(ds_SMSReportG)
 end
 
 code
 SMSReportIndex = 0
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMReadSMSReportInit(PID,PIN)
 message('ds_GSMReadSMSReportInit failed : ' &
                  ds_Error())
 else
 loop
 SMSReportIndex += 1
 if ds_GSMReadSMSReport(PID,SMSReportIndex,DRG) then
                  break .
 
 end
 end
 | 
          
        
       
      ds_GSMDeleteSMSReport
       ds_GSMDeleteSMSReport(long
          pPID,long pSMSReportIndex)
         
        Description
        
        Used to read the clear the SMS delivery report memory from the GSM modem
        at the specified memory index. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected. See the NewPort function. | 
            
              | pSMSReportIndex (long) | Which memory index to clear. | 
          
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMDeleteSMSReport(PID,3) ! delete index 3
 message('ds_GSMDeleteSMSReport failed : ' &
                  ds_Error())
 else
 message('ds_GSMDeleteSMSReport OK')
 end
 | 
          
        
       
      ds_GSMReadEvents
       ds_GSMReadEvents(long
          pPID,*ds_GSMEventG pERG)
        
        Description
        
        Used to check the GSM modem port for any unsolicited event reports.
        Returns the oldest event from the internal event queue.
        This event is simultainiously deleted from the internal queue. The
        following call to ds_GSMReadEvents will return the next event if any.
        
        
Note : ds_GSMReadEvents calls
        ds_EmptyPort(pPID).
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected.  See the NewPort function. | 
            
              | pERG (*ds_GSMEventG) | This structure is filled with any event data found. | 
          
        
        Returns
        
        Long. Returns 0 for Success  else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 ERG    group(ds_GSMEventG)
 end
 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMReadEvents(PID,ERG)
 message('GSMReadEvents failed : ' & ds_Error())
 else
 
 end
 | 
          
        
       
      ds_GSMSetEvents
       ds_GSMSetEvents(long
          pPID,long pEventsMask=255)
        
        Description
        
        Used to enable the sending of unsolicited event reports by the GSM
        modem.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected. See the NewPort function. | 
            
              | pEventsMask (long) | Optional. Default=255. This long selects which events are
                enabled. | 
          
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMSetEvents(PID)
 message('ds_GSMSetEvents failed : ' & ds_Error())
 else
 message('ds_GSMSetEvents OK')
 end
 | 
          
        
       
      ds_GSMReset
       ds_GSMReset(long
          pPID)
        
        Description
        
        Used to set the GSM modem back to factory settings.
        This issues a AT&F command.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pPID (long) | This is the PortID of the open com port to which the GSM modem
                is connected. See the NewPort function. | 
          
        
        Returns
        
        Long. Returns 0 for Success else 
ds_ErrorCode.
        See 
ds_ErrorCode for more info.
        
        
Example
        
          
            
              | Example | 
            
              | PID        long 
 code
 PID = NewPort('com1:9600,n,8,1')
 if ds_GSMReset(PID)
 message('ds_GSMReset failed : ' & ds_Error())
 else
 message('ds_GSMReset OK')
 end
 | 
          
        
       
      ds_OutputDebugString
       ds_OutputDebugString(string
          pDebugString,byte pAddCRLF=1)
        
        Description
        
        Used to send (output) debug information to any windows debug viewer
        (like SysInternals' DebugViewer).
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pDebugString (string) | Debug info string. | 
            
              | pAddCRLF (byte) | Add carriage return and line feed to the debugstring if set. | 
          
        
        Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | code ds_OutputDebugString('Test to debug - view in something like
                  DebugViewer from SysInternals)
 | 
          
        
       
      ds_Debug
       ds_Debug(string
          pDebugString,<string pWindowLabel>,<long
          pEventNumber>,<long pFieldNumber>)
        
        Description
        
        Used to send (output) debug information to both the built-in debug
        viewer and any windows debug viewer (rather use 
ds_OutputDebugString
        if only sending to the windows debugviewer).
        
Note : Output suppressed unless command
        line switch "/debug" or ds_ViewDebug open.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pDebugString (string) | Debug info string. | 
            
              | pWindowLabel (string) | Optional. This label identifies which procedure is sending the
                debug info. The thread number is added to the end of this
                string. | 
            
              | pEventNumber (long) | Optional. Used by the template in order to display the window
                events. | 
            
              | pFieldNumber (long) | Optional. Used by the template to display which control
                received the event. | 
          
        
        Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | code ds_ViewDebug ! opens the debug viewer.
 ds_Debug('Just testing')
 | 
          
        
       
      ds_WineventDebug
       ds_WineventDebug(byte
          pEnable)
        
        Description
        
        Used to send (output) debug information to both the builtin debug viewer
        and any windows debug viewer.
        
Note : Output suppressed unless command
        line switch "/debug" or ds_ViewDebug open.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pEnable (byte) | If TRUE (1) then WinEvent internal debugging info is sent to
                the debug viewer. If FALSE (0) then WinEvent internal debugging
                info is suppressed. | 
          
        
        Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | fp_Testing    ulong 
 code
 ds_WineventDebug(1)
 ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing)
 
 Debug string ! ds_LoadDLLProc error, LoadLibrary failed
                DLL=NoneExistant.dll The specified module could not be found.
 | 
          
        
       
      ds_ViewDebug
       Description
        
        Opens the WinEvent built-in debug viewer.
        
        
Parameters
        
        None
        
        
Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | fp_Testing    ulong 
 code
 ds_ViewDebug ! open debug viewer.
 ds_WineventDebug(1)
 ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing)
 
 Debug string
 | 
          
        
       
      ds_ViewDebugClose
       Description
        
        Closes the WinEvent built-in debug viewer.
        
        
Parameters
        
        None
        
        
Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | fp_Testing    ulong 
 code
 ds_DebugView ! open debug viewer.
 ds_WineventDebug(1)
 ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing)
 
 Debug string
 ds_DebugViewClose ! close the debug viewer.
 | 
          
        
       
      ds_Error
       ds_Error(<long
          pThisErrorCode>)
        
        Description
        
        Returns the error message for a 
ds_ErrorCode().
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pThisErrorCode (long) | Optional. If omitted then the current ds_ErrorCode()
                is used. This is the error code for which the text error message
                is required. | 
          
        
        Returns
        
        String. Error message.
        
        
Example
        
          
            
              | Example | 
            
              | fp_Testing    ulong 
 code
 if ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing)
 message('Error ' & ds_error())
 end
 | 
          
        
       
      ds_ErrorCode
       ds_ErrorCode()
        
        Description
        
        Returns the current WinEvent error code.
        
        
Parameters
        
        None
        
        
Returns
        
        Long. Error code.
        
        
Example
        
          
            
              | Example | 
            
              | fp_Testing           ulong SaveErrorCode    long
 
 code
 if ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing)
 SaveErrorCode = ds_ErrorCode()
 message('Error ' & ds_error())
 end
 | 
          
        
       
      ds_ErrorReset(<string
        pCallingProcedure>)
       ds_ErrorReset(<string
          pCallingProcedure>)
        
        Description
        
        Clears 
ds_ErrorCode and sets the calling
        Procedure name.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pCallingProcedure (string) | Optional. This procedure name will be returned with any
                ds_Error() message string. Useful for identifying the parent
                procedure where a procedure is called from various procedures. | 
          
        
        
        Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | fp_Testing           ulong SaveErrorCode    long
 
 code
 if ds_LoadDLLProc('Testing','NoneExistant.dll',fp_Testing)
 SaveErrorCode = ds_ErrorCode()
 message('Error ' & ds_error())
 end
 | 
          
        
       
      ds_SaveStack& ds_TestStack
       Description
        
        Use ds_SaveStack with ds_TestStack to check for stack corruption while
        calling external procedures.
        If the ESP or EBP registers are corrupted then it sends an error to
        DebugView, displays a messagebox and a GPF is forced.
        
        If other registers are changed then sends a message to DebugView. This
        is not necessarily an error - registers can be changed by a procedure
        call, but it may be useful to inspect this when debugging.
        
          NOTE : ds_SaveStack must be matched with a ds_TestStack
        otherwise a mismatch error will be reported.
        
        
Parameters
        
        None
        
        
Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | code ds_SaveStack()
 ds_TestStack()
 | 
          
        
       
      ds_FormatHex
       ds_FormatHex(ulong
          pDisplayValue,byte pPadSpaces)
        
        Description
        
        Returns a hexadecimal representation of the value.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pDisplayValue (ulong) | The number to format as hex. | 
            
              | pPadSpaces (byte) | The length of the hex number to return (leading zeros). | 
          
        
        Returns
        
        String. The hex string for the value.
        
        
Example
        
          
            
              | Example | 
            
              | DisplayHex    string(10) 
 code
 DisplayHex = ds_FormatHex(31,4) ! 001F
 | 
          
        
       
      ds_GetClipboardEx
       ds_GetClipboard(Long
          pFormat)
          ds_GetClipboard(Long pFormat, StringTheory rData)
        
        Description
        
        Retrieves various format data from the windows clipboard.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFormat | The format of the data. | 
            
              | pData | A StringTheory object to receive the data which is currently
                on the clipboard. | 
          
        
        
          
            
              | pFormat Value | pData requires: | 
            
              | WE::CF_BITMAP | (subject to change) A handle to a bitmap memory space. | 
            
              | WE::CF_DIB | (subject to change) A memory object containing a BITMAPINFO
                structure followed by the bitmap bits. DIB = Device-Independent
                Bitmap | 
            
              | WE::CF_DIBV5 | (subject to change) A memory object containing a
                BITMAPV5HEADER structure followed by the bitmap color space
                information and the bitmap bits. | 
            
              | WE::CF_ENHMETAFILE | (subject to change) a handle to an enhanced metafile
                (HENHMETAFILE). | 
            
              | WE::CF_HDROP | A full path name (path and file name) to a file on the disk. Alternatively a pipe-separated list of full path names.
 | 
            
              | WE::CF_METAFILEPICT | a handle to a metafile picture format as defined by the
                METAFILEPICT structure. | 
            
              | WE::CF_OEMTEXT | A string. | 
            
              | WE::CF_TEXT | A string. | 
            
              | WE::CF_TIFF | (subject to change) a Tagged-image file format. | 
            
              | WE::CF_UNICODETEXT | A Unicode string encoded as UCS (utf-16). | 
            
              | WE::CF_WAVE | (subject to change) An audio data string in one of the
                standard wave formats, such as 11 kHz or 22 kHz Pulse Code
                Modulation (PCM). | 
          
        
        
        Returns
        
        If not using the StringTheory parameter, then returns a String.
        If using the StringTheory parameter: Long. Returns 1 for success, 0 for
        failure
        
        
Example
        
        
          
            
              | Example | 
            
              | str  StringTheory code
 If ds_GetClipboardEx(WE::CF_hDrop,
                  str)  = true
 str.split(',')
 end
 | 
          
        
       
      ds_SetClipboardEx
       ds_SetClipboard(Long
          pFormat, String pData)
          ds_SetClipboard(Long pFormat, StringTheory pData)
        
        Description
        
        Places various format data into the windows clipboard.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pFormat | The format of the data. | 
            
              | pData | The data to be placed in the clipboard. | 
          
        
        
          
            
              | pFormat Value | pData requires: | 
            
              | WE::CF_BITMAP | (subject to change) A handle to a bitmap memory space. | 
            
              | WE::CF_DIB | (subject to change) A memory object containing a BITMAPINFO
                structure followed by the bitmap bits. DIB = Device-Independent
                Bitmap | 
            
              | WE::CF_DIBV5 | (subject to change) A memory object containing a
                BITMAPV5HEADER structure followed by the bitmap color space
                information and the bitmap bits. | 
            
              | WE::CF_ENHMETAFILE | (subject to change) a handle to an enhanced metafile
                (HENHMETAFILE). | 
            
              | WE::CF_HDROP | A full path name (path and file name) to a file on the disk. Alternatively a pipe-separated list of filenames - the first
                item in the list is the path, the second and subsequent items
                are the names of all the files.
 | 
            
              | WE::CF_METAFILEPICT | a handle to a metafile picture format as defined by the
                METAFILEPICT structure. | 
            
              | WE::CF_OEMTEXT | A Clarion string. The string is not clipped before putting it
                on the clipboard. | 
            
              | WE::CF_TEXT | A Clarion string. The string is not
                clipped before putting it on the clipboard. | 
            
              | WE::CF_TIFF | (subject to change) a Tagged-image file format. | 
            
              | WE::CF_UNICODETEXT | A Unicode string encoded as UCS (utf-16). | 
            
              | WE::CF_WAVE | (subject to change)  An audio data string in one of the
                standard wave formats, such as 11 kHz or 22 kHz Pulse Code
                Modulation (PCM). | 
          
        
        
        Returns
        
        Long. Returns 1 for success, 0 for failure
        
        
Example
        
        This example places the name "C:\autoexec.bat" into the windows
        clipboard.
        Using windows explorer you can then paste a copy of the file elsewhere.
        
          
            
              | Example | 
            
              | filename   string(255) code
 filename = 'C:\autoexec.bat<'     if ~ds_SetClipboard(WE::CF_hDrop,
                  filename )
 message('SetClipboardFailed')
 end
 | 
          
        
       
      ds_ShutDown(<byte pForce>)
       ds_ShutDown(<byte
          pForce>)
        
        Description
        
        Requests a windows shutdown. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pForce (byte) | Optional. When set (1) then any processes that do not
                "respond" are terminated by windows. | 
          
        
        Returns
        
        Byte. Returns 1 for success, 0 for failure
        
        
Example
        
          
            
              | Example | 
            
              | code ds_Shutdown() ! Request a windows shutdown.
 | 
          
        
       
      ds_WinEventVersion
       ds_WinEventVersion()
        
        Description
        
        Returns the current WinEvent version number.
        This is handy for checking that the WinEvent DLL is the correct version
        for the application. 
        
        
Parameters
        
        None
        
        
Returns
        
        Real. Returns the WinEvent version number.
        
        
Example
        
          
            
              | Example | 
            
              | code if ds_WinEventVersion < 3.21
 message('Error old WinEvent DLL in use')
 end
 | 
          
        
       
      ds_Ulong64ToReal
       ds_Ulong64ToReal(long
pULongHigh,long
          pULongLow),real
        
        Description
        
        Converts a long64 into a real. Use this function when working with API
        calls that return 64 bit longs.
        Note that ulongs bigger than 52 bits will become approximate values when
        converted to reals. Ulongs up to 52 bits will be exact values.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pUlongHigh (long) | The first 4 bytes of the ulong64. | 
            
              | pUlongLow (long) | The last 4 bytes of the ulong64. | 
          
        
        
        Returns
        
        Real. The ulong64 value.
        
        
Example
        
          
            
              | Example | 
            
              | RealVar                   real ulong64G                  group
 High                        long
 Low                         long
 end
 
 code
 RealVar = ds_Ulong64toReal(ulong64G:High,ulong64G:Low)
 | 
          
        
       
      ds_Round
       ds_Round(real
          pValue,string pOrder),real
        
        Description
        
        Returns the rounded (to Order) of the Value. This function allows
        rounding to Orders other than straight 1 decimal and force up or force
        down (using plus or minus) as well as true rounding.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pValue (real) | The value to be rounded. | 
            
              | pOrder (string) | The order to round the value. The order value must be
                prepended with '+','-' or nothing. '+' (and then the order) - returns the higher order closest to
                the value.
 '-' (and then the order) - returns the lower order closest to
                the value.
 Nothing (and then the order) - rounds the value up or down
                depending on the closest order.
 | 
          
        
        
        Returns
        
        Real. The rounded value.
        
        
Example
        
        
          
            
              | Example | 
            
              | code RealVar = ds_Round(89.494,'-0.02')  !Returns  89.48
 RealVar = ds_Round(89.494,'0.02')  !Returns  89.50
 RealVar = ds_Round(89.484,'+0.02')  !Returns  89.50
 | 
          
        
       
       
      ds_SetOKToEndSessionHandler
       ds_SetOKToEndSessionHandler(ulong
          pCallBackAddress)
        
        Description
        
        Installs an OKToEndSessionHandler for the Auto-shutdown functionality.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pCallBackAddress (ulong) | The address of the OKToEndSessionHandler. | 
          
        
        The OKToEndSessionHandler must be prototyped as : 
        MyOKToEndSessionHandler(long pLogoff),long,pascal 
        
        
Returns
        
        Ulong. Returns the old OKToEndSessionHandler.
        
        
Example
        
          
            
              | Example | 
            
              | OldHandlerAddress        ulong 
 code
 OldHandlerAddress =
                  ds_SetOKToEndSessionHandler(address(MyOKToEndSessionHandler))
 | 
          
        
       
      ds_SetEndSessionHandler
       ds_SetEndSessionHandler(ulong
          pCallBackAddress)
         
        Description
        
        Installs an EndSessionHandler for the Auto-shutdown functionality.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pCallBackAddress (ulong) | The address of the EndSessionHandler. 
 The EndSessionHandler must be prototyped as :
 EndSessionHandler(long pLogoff),long,pascal
 | 
          
        
        
        Returns
        
        Ulong. Returns the old EndSessionHandler.
        
        
Example
        
          
            
              | Example | 
            
              | OldHandlerAddress        ulong 
 code
 OldHandlerAddress =
                  ds_SetEndSessionHandler(address(MyEndSessionHandler))
 | 
          
        
       
      ds_SetNoEndSession
       ds_SetNoEndSession(long
          pNoEndSession)
         
        Description
        
        Disables the Auto-Shutdown functionality. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pNoEndSession (long) | When set (1) then the Auto-Shutdown is disabled. | 
          
        
        
        Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | code ds_SetNoEndSession(TRUE)
 !  Do backup routine here
 ds_SetNoEndSession(FALSE)
 | 
          
        
       
      ds_GetCurrentProcess
       ds_GetCurrentProcess()
        
        Description
        
        Return a windows handle to the current process often required for API
        calls.
        
        
Parameters
        
        None
        
        
Returns
        
        long. hProcess, handle this process.
        
        
Example
        
          
            
              | Example | 
            
              | long     hProcess 
 code
 hProcess = ds_GetCurrentProcess()
 | 
          
        
        
       
      ds_GetCurrentThread
       ds_GetCurrentThread()
        
        Description
        
        Return a windows handle to the current thread often required for API
        calls.
        
        
Parameters
        
        None
        
        
Returns
        
        long. hThread, handle to this thread.
        
        
Example
        
          
            
              | Example | 
            
              | long     hThread 
 code
 hThread = ds_GetCurrentThread()
 | 
          
        
       
      ds_GetProcessTime
       ds_GetProcessTime(long
          hProcess=0,long IncludeFlags=0),real
        
        Description
        
        Returns the CPU usage of this process in clarion time. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | hProcess (long) | Optional.  The windows handle to the process.  Defaults to the
                current process. | 
            
              | IncludeFlags (long) | Optional.  1 = User Time, 2 = Kernal Time, 0 = Total Time
                (Default) | 
          
        
        Returns
        
        real. Time in 1/100 seconds.
        
        
Example
        
          
            
              | Example | 
            
              | real    UserTime 
 code
 UserTime = ds_GetProcessTime(,1)
 DisplayTime = ds_FormatFastTime(UserTime,6)
 | 
          
        
       
      ds_GetThreadTime
       ds_GetThreadTime(long
          hThread=0,long IncludeFlags=0),real 
        
        Description
        
        Returns the CPU usage of this thread in clarion time. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | hThread (long) | Optional. The windows handle to the thread. Defaults to the
                current thread. | 
            
              | IncludeFlags (long) | Optional. 1 = User Time, 2 = Kernal Time, 0 = Total Time
                (Default) | 
          
        
        
        Returns
        
        real. Time in 1/100 seconds.
        
        
Example
        
          
            
              | Example | 
            
              | real    UserTime 
 code
 UserTime = ds_GetThreadTime(,1)
 DisplayTime = ds_FormatFastTime(UserTime,6)
 | 
          
        
       
      ds_SetRealTimePriority
       ds_SetRealTimePriority(long
          hProcess=0,long hThread=0,byte RealTimeFlag=1)
         
        Description
        
        Selects Real Time or Normal priority for a thread.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | hProcess (long) | Optional.  The windows handle to the process.  Defaults to the
                current process. | 
            
              | hThread (long) | Optional.  The windows handle to the thread.  Defaults to the
                current thread. | 
            
              | RealTimeFlag (byte) | Optional.  When set (Default) then Real Time Priority is
                selected.  When clear then Normal Priority is selected. | 
          
        
        Returns
        
        None
        
        
Example
        
          
            
              | Example | 
            
              | code ds_SetRealTimePriority(,,TRUE)        ......
 ds_SetRealTimePriority(,,FALSE)
 | 
          
        
       
      ds_DeleteQueue
       ds_DeleteQueue(*Queue
          pQueue)
         
        Description
        
        Queues that contain pointers (to strings, other queues, and StringTheory
        objects) need to be deleted carefully in order to avoid memory leaks.
        This function makes use of extended name attributes to identify
        pointers, and delete the row without leaking memory.
        
        Recognized extended name attributes include 
&string,
        
&pstring, 
&cstring,
        stringtheory, 
&stringtheory,
        
queue, 
&queue.
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pQueue | The Queue. The currently loaded record in the queue will be
                deleted. | 
          
        
        Returns
        
        Nothing
        
        
Example
        
          
            
              | Example | 
            
              | InvoiceQueueType Queue,TYPE Date               Long,name('Date | @D3')
 Amount             Long,name('Amount')
 Paid               Byte,name('Paid Amount | Boolean')
 End
 CustomerQueue    Queue,pre(cust)
 Reference          &String, name('Reference |
                  &String')
 Remarks            &StringTheory, name('Remarks |
                  StringTheory')
 Date               Long, name('Date | @D010-')
 Cstr               &Cstring, name('cstr | &CString')
 Pstr               &Pstring, name('pstr | &PString')
 Invoices           &InvoiceQueueType, name('Invoices|
                  Queue')
 End
 code
 get(CustomerQueue,2)
 ds_DeleteQueue(CustomerQueue)
 | 
          
        
        
        See Also 
        
        ds_DisposeQueue, 
          ds_FreeQueue
        
       
      ds_DisposeQueue
       ds_DisposeQueue(*Queue
          pQueue)
         
        Description
        
        Queues that contain pointers (to strings, other queues, and StringTheory
        objects) need to be deleted carefully in order to avoid memory leaks.
        This function makes use of extended name attributes to identify
        pointers, and deletes all the rows without leaking memory. 
        
        Once the rows are deleted the Queue pointer itself is DISPOSE'd
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pQueue | The Queue to Dispose | 
          
        
        Returns
        
        None
        
        
See Also
        
        ds_FreeQueue, 
          ds_DeleteQueue
       
      ds_FreeQueue
       ds_FreeQueue(*Queue
          pQueue)
         
        Description
        
        Queues that contain pointers (to strings, other queues, and StringTheory
        objects) need to be deleted carefully in order to avoid memory leaks.
        This function makes use of extended name attributes to identify
        pointers, and deletes all the rows without leaking memory. 
        
        
Parameters
        
          
            
              | Parameter | Description | 
            
              | pQueue | The Queue to Free. | 
          
        
        Returns
        
        None
        
        
See Also 
        
        ds_DisposeQueue, 
          ds_DeleteQueue
        
       
      
        Frequently Asked Questions
          (FAQ's)
         I'm getting compile
            errors
          
          TaskBar/SystemTray Questions:
          
          1.1 
I'd like to also change the taskbar button
            tooltip - how do I do this? 
          1.2 
My application still appears on the Taskbar.
          1.3 
I want to hide my application to the taskbar,
            what's the best way to do this
          1.4 
My icon does not appear in the SystemTray
          
          Comport Questions:
          
          C.1 
How do I open a serial port cash drawer using
            WinEvent?
          C.2 
I use a virtual comport USB to COM convertor.
            After some time the comport closes down.
          
          General Questions:
          
          2.1 
Cannot get my application to auto-shutdown.
          2.2 
Instances of the WinEvent template appear after
            importing procedures from another application. 
          2.3. 
Are there any parallel port functions included
            in WinEvent?
          
          
           1.2 Question: I am trying to use the
          'WinNotOnTaskBar' extension template on my frame so that my
          application does not appear on the task bar, but it still appears. 
          
          
Answer: This extension template places a
          call to a function called 
WinNotOnTaskBar
          before the open window command. If you have a 3rdparty or source coded
          call to open a different window 
before this function is
          called, it will not work. You may need to manually code a call to this
          function before the 3rdparty/source coded window is called. 
          
          
          1.3 Question: I
          want to hide my application to the taskbar, what's the best way to do
          this
          
          
Answer:
          
            - Use the TaskBar extension
- Use the 2 routines (WindowHide and WindowShow) in the example
              code for the WinOnTop function to Hide
              and Show your Window.
1.4 My icon does not appear in
            the SystemTray
          
          Answer: Your application is not finding the
          icon to place in the system tray. Rather include the icon into the
          project and use ~myicon.ico (in the AddIcon to system tray). If in
          doubt - check the example (that ships with WinEvent) for how it's done
          in there.
          
          
C.1 Question: How do I
          open a serial port cash drawer using WinEvent?
          
          Answer: You need to find out the character to pass on the port to the
          cash drawer (to perform the open) and handle this in a normal coms
          port operation:
          
          
Portid = newport('com' & left(port) &
            ':' & baudrate & ',n,8,1')
            !Handle error here.
            bytesent=writeport(portid,drcode,0)
            closeport(portid)
          
          C.2 Question: I use a
          virtual comport USB to COM convertor. After some time the comport
          closes down.
          
          
Answer:
          
            - It is possible the SYSTEM is not checked on the window
              controlling the USB port (take note, this has other ramifications,
              but may be required in order to control the USB to COM convertor).
              Window WINDOW(.., TIMER(1),SYSTEM,
- Set the timer instead of 1 to 10 or higher.
- Make sure that you are using the latest driver version for the
              hardware that you are using.
- Some cheap hardware will manifest this behaviour. 
- Some pc settings allow screensaver to power down the USB ports.
2.1 Question:I want my application to
          auto-shutdown. I have checked the 'Auto Shutdown Enabled' checkbox on
          the WinEvent extension template on my frame, but it still does not
          auto-shutdown. 
          
          
Answer: Are you using 'WinNotOnTaskBar'? 
          auto-shutdown is not compatible with 'WinNotOnTaskBar'. Use
          window{prop:hide} instead (click 
here
          for an example). You need to either check the 'Auto shutdown on'
          checkbox in the WinEvent Global Extension template (the easiest way),
          check each 'Auto shutdown enabled' checkbox on each of the windows or
          hand code the relevant function yourself. You may prefer to take the
          second option if there are windows which must be closed (like forms,
          etc) by the user before the application is automatically closed. In
          this case, you can leave those 'Auto shutdown enabled' checkbox
          cleared, so that your application won't auto-shutdown when these
          windows are open. For those more daring, you can do the hand coding
          method (click 
here for more
          details).
          
          
          2.2 Question: I'm
          trying to import a procedure from another application, but 2 instances
          of the WinEvent template appear after import on that procedure.
          
          
Answer: There are 2 possible solutions to
          this (depending on which may be better in your situation):
          
          
            - Delete the WinEvent global template from the application that
              you want to export the procedures from. Export the procedures to a
              txa file, and then add the WinEvent global template back into your
              application. You can the import the txa file into your new
              application.
 Pros: Simpler and quicker.
 Conns: Can lose some template settings (of the templates that were
              temporarily removed).
 This should only be done in applications where the default
              template settings are used.
- Export the procedures that you want to a txa file. You now need
              to manually edit the txa file and remove all WinEvent: Alert
              Windows Messages template instances in that file. Basically, what
              you need to delete is the following (wherever it occurs in the txa
              file:
 
 [ADDITION]
 NAME WinEvent WinEvent
 [INSTANCE]
 INSTANCE 2
 OWNER 1
 [PROMPTS]
 %DisableWinEvent LONG (0)
 %AutoDown LONG (0)
 %NoAutoDown LONG (0)
 %EnableWheelMouse LONG (0)
 %AlertWinEventDebug LONG (0)
 %DisplayCompileDate LONG (0)
 %DisplayCompileDateFormat DEFAULT
                ('@D6')
 %WinAlert MULTI LONG ()
 %Mess DEPEND %WinAlert DEFAULT TIMES 0
 
 %Act1 DEPEND %WinAlert DEFAULT TIMES 0
 
 %act2 DEPEND %WinAlert DEFAULT TIMES 0
 
 %SortListbox MULTI LONG ()
 %ThisListbox DEPEND %SortListbox
                DEFAULT TIMES 0
 
 %ThisListboxHeader DEPEND
                %SortListbox MULTI DEFAULT TIMES 0
 
 %gloWinEventTesting LONG (0)
 %gloWinEventTestingColor1 LONG (15728618)
 %gloWinEventTestingColor2 LONG (16777215)
 
 Do a search for NAME WinEvent WinEvent and
              the immediately preceding [ADDITION]
              marks the start of the template prompts and the next [ADDITION],
              [WINDOW] or [CALLS]
              statement marks the end of the template prompts.
2.3. Question:Are
          there any parallel port functions included in WinEvent?
          
          
Answer: No. WinEvent does not include a
          parallel port library in it's functions. 
 
        Compile Errors
          
          
          This means that you're still using old equates (before the WinEvent
          equates were changed in 3.37). Basically you need to add the WE::
          prefix to all handcoded: WM_, CSIDL_, WTS_, NIIF_ and CF_ variables
          so:
          
          
WM_QUERYENDSESSION will become 
WE::WM_QUERYENDSESSION
          
          
           
          
          You are compiling in LIB mode and you have another LIB file that
          includes the WinEvent LIB file (like the ezHelp LIB). You must check
          the 'Don't link in the WinEvent lib' checkbox on the settings tab of
          the WinEvent global template.
          
          
            Unresolved External $WE::CANTCLOSENOW in
              globa002.obj
              Unresolved External $WE::MUSTCLOSE in globa002.obj
              Unresolved External $WE::CANTCLOSENOW in globa006.obj
              Unresolved External $WE::MUSTCLOSE in globa006.obj
              Unresolved External $WE::CANTCLOSENOW in globa024.obj
              Unresolved External $WE::MUSTCLOSE in globa024.obj
              Unresolved External $WE::CANTCLOSENOW in globa031.obj
              Unresolved External $WE::MUSTCLOSE in globa031.obj
          
          
          You must add WinEvent to your 
data dll, and in the
          Multi-DLL tab of the global template, 
check both
          the "This is part of a Multi-DLL program" and the "Export WinEvent
          data from this DLL" checkboxes. In 
all your other DLLs,
          you should 
check the "This is part of a Multi-DLL
          program" checkbox, leaving the "Export WinEvent data from this DLL"
          checkbox 
unchecked. 
        
 
        Version History
         Download latest version 
here
           
          Version 5.45 - 27 May 2025 
          
          Version 5.44 - 23 October 2024 
          
            - Add: Update to function ds_GetClipboardEx
              to use a pipe separated list, not a comma separated list.
Version 5.43 - 9 October 2024 
          
          Version 5.42 - 25 July 2024
            - Add: New function ds_GetFileSize
              which returns the file size as a REAL, ie handles files > 2
              gigs in size.
Version 5.41 - 6 March 2024
            - Fix: WritePort could Duplicate Identifier in Data Dll.
- Fix: Alternate WritePort calls were not being exported from the
              Data DLL
Version 5.40 - 5 March 2024
            - Add:  GetLastWindowsError() function to return the Windows
              LastErrorCode as set in ds_Error().
Version 5.39 - 13 February 2024
            - Reversion: Changes to ds_CreateDirectory
              caused problems. Documentation updated to reflect actual behavior.
Version 5.38 - 22 January 2024
            - Added GetWineventErrorCode(), GetWineventExtendedErr(),
              GetWineventErrProc() functions.
- Fix: ds_CreateDirectory did
              not stop on first error, and did not set error values unless
              debugging was on.
- Fix: Tidied up some error handling code.
- Fix: ds_DeleteValueReg used wrong
              handle.
- Internal: Update to Capexx.tpw version 4.31
Version 5.37 - 30 October 2023 
          
           Version 5.36 - 5 July 2023
            - Update: Allow longer names for Windows Messages
- Fix: Possible redeclaration of %pd
Version 5.35 - 27 October 2021
            - Add: Support for Windows 11 to ds_GetWinVersion
- Remap: WE::CSIDL_MYDOCUMENTS to WE::CSIDL_PERSONAL
Version
                          5.34 - 24 May 2021   
          
           Version 5.33 (17 February 2021)
            - Fix: name clash on TIMEDATE
Version 5.32 (13 October 2020)
            - Fix: Declaration of CapsLockKeyPressed
              moved to it's own embed so as not to clash with Secwin 7 when
              using Clarion 8.
Version 5.31 (14 September 2020)
            - Fix: ds_TimeZoneInformationG structure was incorrect.
            Version 5.30 (24 August 2020) 
          
            - Tweak: KEY_ALL_ACCESS Equate
              changed to use STANDARD_RIGHTS_REQUIRED
              not STANDARD_RIGHTS_ALL.
- Change: New parameter to ds_GetReg and
              ds_PutReg to access 64 bit registry.
- Fix: Passing a zero length to WritePort could cause a problem.
Version 5.29 (2 December 2019) 
          
           Version 5.28 (20 June 2019)
            - Fix: CountPort exported by template in Data DLL.
Version 5.27 (18 June 2019)
            - Add: CountPort function.
- Update: Formatting of Comms Port documentation.
Version 5.26 (8 March 2019)
            - Add: %USERPROFILE%, %DROPBOX% and %ONEDRIVE% to ds_ExpandDirectory.
- Fix: ds_Focus in TPL should have been ds_SetFocus.
Version 5.25 (8 March 2019) 
          
           Version 5.24 (10 December
              2018)
            - Add: Section to documentation on using 
                WinEvent in Hand-Coded projects.
- Major Change :
              ds_SetClipboard method removed, replaced with ds_SetClipBoardEx.
              (see Upgrading section). (Many
              thanks to Sean Henessy
- Fix: Problem with excessive handling of event:moved
Version 5.23 (12 November
              2018)
            - Fix: Reversed change in 5.22 - causing other problems.
Version 5.22 (27 October 2018)
            - Fix: Problem with ds_VisibleonDesktop for MDI child windows with
              Maximize attribute set on.
Version 5.21 (12 October 2018)
            - Work-Around: Regression in Clarion 11 (PTSS 42753) which affects
              generate-date feature.
Version 5.20 (13 September
              2018)
            - Add: Clarion11 to install.
Version 5.19 (15 August 2018)
            - Actual number values for some Event: equates have changed.
              Should not affect code which is using equates. 
- Keycode() is set when trapping various mouse events.
- Init code set to come after EzHelp init code.
Version 5.18 (21 June 2018)
            - Some code tidy up, and new equates. 
Version 5.17 (31 January 2018)
            - Tweak:  ds_GetUserAccountName
              doesn't just return first found name type.
- Template: Cape common templates updated to version 4.12
Version 5.16 (30 January 2018)
            - Add: ReadPort and WritePort versions that take a StringTheory
              parameter.
- Fix: ds_GetUserAccountName
              refactored (thanks to Mateusz Borowski)
              Version 5.15 (7 December 2017)  
          
            - Fix: DWORD equate in WinEvent.Inc
              changed from LONG to ULONG.
Version 5.14 (24 November
              2017)  
          
           Version 5.13 (30 October 2017)
            - Refactor: IconQueue renamed to we:IconQueue. IconHandleQueue
                renamed to we:IconHandleQueue
              to avoid naming conflict with UltraTree.
Version 5.12 (28 July 2017)
            - Add: Event:MousewheelPlus and Event:MouseWheelMinus
- Add: Field to Events posted.
Version 5.11 (2 June 2017)
            - Add: ds_OSBits function.
- Add ability to Alert messages for specific controls, or specific
              control types in WinAlert function.
Version 5.10 (31 May 2017)
            - Change: Template checks for controls with KEY settings before
              alerting F10, CtrlF10 and Shift F10.
Version 5.09 (26 April 2017)
            - Add: Support for Alt-Fix added. (On by
              default.)
Version 5.08 (24 April 2017)
            - Change: Some items relabeled with we: prefix to avoid linker
              clashes with other libraries.
- Fix: ds_FormatFastTime removes trailing . if places parameter =
              0.
Version 5.07 (1 February 2017)
            - Fix: If (non MDI) window was opened Maximized then it would
              resize to allow more space for the Windows Start bar.
- Documented: Legacy programs need Allow
              Use of ABC ticked on.
Version 5.06 (24 November
              2016)
            - Fix: GetFreeDiskSpace function
              could return the wrong value when value was large.
Version 5.05 (14 November
              2016)
            - Fix: Fixed documentation in template to not refer to Clarion 6
              anymore.
Version 5.04 (28 October 2016)
            - Change: Renamed GUID type to avoid clash with svcomdef.inc.
- Fix: If Closedown support off, procedures did not export from
              Data DLL.
Version 5.03 (21 October 2016)
            - Edited: Problem comment in wineve.a
- Change: added we: prefix to equates to avoid clash with Clacom.
              (we:NOPARITY, we:ODDPARITY, we:EVENPARITY,
                we:MARKPARITY, we:SPACEPARITY, we:ONESTOPBIT, we:ONE5STOPBITS,
                we:TWOSTOPBITS).
- Change: Changed Equate ERROR_SUCCESS
              to we:ERROR_SUCCESS.
Version 5.02 (18 October 2016)
            - Add: Template code to remove reference to CLAWE from the
              solution. (Clarion 9 and up only.)
- Change: IID renamed to ws:IID, CLSID renamed to we:CLSID.
              (conflict with Office Inside)
- Change:  HKEY_LOCAL_MACHINE and HKEY_USERS Equates removed.
              (conflict with Office Inside)
Version 5.01 (17 October 2016)
            - Fix: WinEve.a file was missing from the installer.
Version 5.00 (14 October 2016)
            - New function ds_Round. Rounding on
              steroids.
- DLL removed, now shipping as source code
Version 3.99 (29 February
              2016)
            - Installer signed with SHA2 certificate
Version 3.98 (29 February
              2016)
            - Change: TestStack now outputs a ESP or EBP error to Debugview
              before displaying the MESSAGE and GPF'ing.
Version 3.97 (17 August 2015)
            - Internal: Slight adjustment to ds_SetFileDateTime. May fix
              possible Memory Freed Twice error.
Version 3.97 (17 August 2015)
             
          
           Version 3.96 (28 March 2015)
            - References to %EnableWheelMouse removed from the template
Version 3.95 (24 March 2015)
            - If a window is not set as resizable, then ds_VisibleOnDesktop
              won't resize it.
Version 3.94 (25 February 2015)
            - Clarion 10 Install.
- Removed unnecessary calls to %cwversion
Version 3.93 (18 February 2015)
            - Template allows local setting to EnableMouseWheel.
Version 3.92 (10 February 2015)
            - Refactor: (Internal) Code for making the window visible on
              desktop, and visible inside a frame separated into separate
              functions.
- Add: ds_SetApplicationWindow and ds_GetApplicationWindow
              methods. Used to store pointer to AppFrame window.
- Fix: ds_VisibleOnDesktop method improved.
Version 3.91 (4 February 2015)
            - Fixed regression in 3.90 for missing template variable
              declaration
Version 3.90 (8 January 2015)
            - Added function WinAlertMouseZoom.
- Support for iDash Widget procedures added
Version 3.89 (25 November 2014)
            - ds_VisibleOnDesktop could allow windows to float underneath the
              MDI bar.
Version 3.88 (20 September 2014)
            - Some embeds were not respecting the "disable winevent here"
              setting.
Version 3.87 (22 August 2014)
          
          
          Version 3.86 (20 January 2014)
            - Clarion 9.1 build
- Possible Fix: Some static variables in ds_FastClock were not
              marked as Threaded.
Version 3.85 (28 October 2013)
            - Suppressed Undeclared Symbol %locCloseDownWhenWindowClosesSet
              Error. (Thanks to Russ Eggen for submitting a fix.)
Version 3.84 (27 August 2013)
            - Recompiled for Clarion 9, Build 10324. To use this build of
              WinEvent, in Clarion 9, you must be on build 10324 or later.
Version 3.83 (24 April 2013)
            - Tidied up PROJECTion of DLL's in template for Clarion 8.
- C8 fix - remove %pClassMethod where clause, and use embed point
              directly.
- Template change - template generated text for the Hide, Show,
              Ext options from the system tray only set if there is text entered
              in the template, otherwise hide.
- Extended COM Port range. Current maximum port number is now
              COM255:, was COM99: (Actually it's been 255 for a while, but it's
              not clear when this was extended.)
Version 3.82 (31 January 2013)
            - ds_GetWinVersionEx expanded to support Windows 8.
Version 3.81 (14 January 2013)
            - ds_OnNetwork function did not BAND on the LSB as it should (to
              return just 0 or 1).
Version 3.80 (9 October 2012)
            - Template could generate code into Program Setup, column 1, in
              legacy apps.
Version 3.79 (7 May 2012)
            - Extended MAXPORTS to 255. Allows from Com1 to Com255 to be
              available.
Version 3.78 (13 March 2012)
            - Clarion 8 support for linking in C8 lib.
Version 3.77 (5 October 2011)
            - Clarion 8 support for lib mode compiles (where ezHelp is added
              to the application): Don't link in the Winevent Lib checkbox.
- Fix for ds_GetUserAccountName: Only calls the API function if
              secur32 dll can be loaded. Uses NameServicePrincipal and cleans
              out the '\'
Version 3.76 (20 July 2011)
            - Fixed: ds_GetWinVersion was returning 'Media Center' for Vista
              and up.
- ds_GetWinVersionEx - takes a long - if set returns description,
              else returns the version number in Major.Minor.BuildNumber format.
- Remove unconditional debug output.
- ds_GetUserAccountName returns the GetUserNameExA. Use
              NameServicePrincipal or NameCanonicalEx.
Version 3.75 (15 April 2011)
            - Fixed: The Show Windows On Desktop code is now no longer
              generated for a procedure when the local "Disable WinEvent in This
              Procedure" option is enabled for that procedure.
- Fix: Project correct WinEvent lib for C7.3
- Fix - force make visible after window opens (checkbox on the
              Global Extension template). WorkAround in C7.3 resizer.
- Remove debug code.
- ds_ParseTip was chopping string at 128 chars.
Version 3.73 (19 July 2010)
            - Windows 2008 R2 reported correctly.
Version 3.72 (25 May 2010)
            - ResetPort (when called by NewPort) sets the baud rate, etc for a
              port above Port10 correctly.
Version 3.71 (13 May 2010)
            - Project DOS lib into MultiProj generated local projects.
Version 3.70 (25 February 2010)
            - Fix typo project in the template for DOS driver in C6 and
              earlier builds.
Version 3.69 (24 February 2010)
          Clarion 7.1 issue: Was not shutting down in a non-MDI with Global
          Shutdown.
          
            - Added debug to DOS file (instead of std_debug output if
              required).
- ds_CopyDirectory returns negative if an error occurs (the
              negative contains the number of files that were successfully
              copied prior to the error).
Version 3.68 (22 January 2010)
            - Net_wsock32.lib was removed from WinEvent requirements (DLL
              projects as well as template). New function APIs mapped
              internally: GetHostname and WSAGetLastError.
Version 3.67 (21 January 2010)
            - Net_wsock32.lib was not removed from the C55 winevent lib (in
              3.66)
Version 3.66 (20 January 2010)
            - Include the net_wsock32.lib in the install, and project it into
              LIB projects (removed from the compiled WinEvent libs). Fix for
              duplicate compile errors (where other libs use the
              net_wsock23.lib).
- Template change - don't project the winevent lib when Winevent
              is disabled.
Version 3.65 (29 December 2009)
            - Template tweak to project cwsynchc.clw (for Clarion7.1 support
              in legacy local mode apps)
Version 3.64 (27 October 2009)
            - ds_String2File - If StringLen is 0 then checked a clipped length
              of the string to write.
- ds_GetIDETemperature - format parameter can be used to specify
              Deg F or Deg C.
- ds_GetWinVersion - Fix for 64 bit OSes - returns Win 7, Win 2008
              and WinVista correctly.
Version 3.63 (12 August 2009)
          
          Version 3.62 (28 July 2009)
            - Added function ds_RefreshDesktop,
              which you can call to refresh the desktop, typically after a call
              to ds_CreateShortcutEx.
              (Thanks to Skip Williams for providing the code.)
- Added functions dsGetLocalTime, ds_GetLocalDate,
              ds_GetSystemTime, ds_GetSystemDate
Version 3.61 (15 July 2009) 
          
          Version 3.60 (19 June 2009)
            - Extended COM Port range. Current maximum port number is now
              COM99:, was COM25:
Version 3.59 (18 March 2009)
            - Fixed problem in ds_memory. Although
              the function was extended to > 2 gigs in ver 3.53, there was a
              maths error which affected some memory configurations.
Version 3.58 (13 March 2009)
            - Template change - more embeds in the Add Icon to System tray
              template - allowing additional handcode.
- Template change - embed point for a balloon clicked event.
- Template change - projects the C70 winevent lib files correctly.
- Dll fix - ds_ShowWindow calls the iconize last - some versions
              of Clarion require prop:iconze to be called after the SetWindowPos
              calls.
- Dll change - correctly display Windows 7 in the ds_GetWinversion
              function.
Version 3.57 (10 November 2008)
            - Clarion 7 compatible install.
Version 3.56 (30 October 2008)
            - Auto-shutdown supports WinNotOnTaskbar - so removed erroneous
              template turnoff (from Add Icon On taskbar template).
Version 3.55 (23 October 2008)
            - Support for Clarion7 - links in the correct library.
- Fix - ds_OutputDebug uses created (and disposed) string for long
              strings - was clipping strings > 1024
Version 3.54 (3 July 2008)
            - Fix regression in WinEvent Template - was setting AutoShutdown
              off when enabled (instead of off when disabled).
- Template change - allows specification of the module where an
              icon is located (otherwise uses the EXE if not specified).
Version 3.53 (24 June 2008)
            - Updated ds_memory function to allow
              for numbers > 2 Gigs. (Remember though, that memory functions
              return the number of Kb, not bytes).
Version 3.52 (15 November 2007)
            - Fix - auto-generation of the VersionNumber box in the template
              was missing a "section" - so was overwriting controls on the tab.
- Disable VersionNumber generation, changed to Enable Variable
              Generation. This needs to be checked in order to be forced on.
Version 3.51 (9 November 2007)
            - Fix - when not requiring auto-generation of the VersionNumber,
              then you can omit this functionality in the WinEvent Global
              Extension template.
Version 3.50 (6 November 2007)
            - Fix in NewPort function - regression in 3.49. Was not newporting
              an LPT port.
Version 3.49 (22 June 2007)
            - Fix - supports com10 and up.
Version 3.48 (26 April 2007)
            - ds_GetWinVersion() updated so that it returns "WinVista..." for
              Vista.
- ds_ShutDown() updated so that it also calls PowerOff in Vista
              and 2003.
Version 3.47 (25 April 2007)
            - ds_CreateShortcutEx
              - allows command line parameters to be used in the shortcut.
              Replaces the deprecated ds_CreateShortcut function.
Version 3.46 (23 November 2006)
            - ds_Memory returns ULONG (instead of
              LONG) - this means that the resultant value can be > 2.1 G
              reported (i.e. up to 4.2G - which is what is returned by the
              windows API call).
Version 3.45 (13 October 2006)
            - Clarified Template settings (in the local templates).
- Fix - ds_ShowWindow - was not showing a iconized, minimized
              window correctly (required 2 calls).
Version 3.44 (20 July 2006)
            Fix GPF for local mode compiles where a variable sync or we_sync was
            defined in the application (the wrong address was being linked at
            runtime).
          
Version 3.43 (12 July 2006)
            Support for disabling ezHelp in the same application.
          
Version 3.42 (6 June 2006)
            Change Global Extension template description.
          
Version 3.41(22 May 2006)
            Template option to support ds_VisibleOnDesktop by default. You can
            turn this off globally, or disable locally (for specific windows
            that shouldn't have that feature).
          
Version 3.40 (10 May 2006)
            Posts CloseDown event (for SelfService support) when exit from
            tasktray is selected.
          
Version 3.39 (12 April 2006)
            - Auto-Shutdown on check box is defaulted to on.
- Removed the font settings from the template (in order to correct
              display in laptops with ClearType fonts settings turned off).
Version 3.38 (27 March 2006) 
          
          Version 3.37 (20 March 2006)
            Changed the WinEvent equates to prefix with WE::. This means that
            compile duplicates are prevented (when equates of the same name are
            handcoded or used by other products). Check the Compile
              Errors section for more details.
          
Version 3.36 (16 March 2006)
            Improved Taskbar Icon Template - so that it's easier to see what you
            need to do when making Services with Taskbar Icons.
          
Version 3.35 (20 February 2006)
            No change - re-sync version numbers in DLL and template.
          
Version 3.34 (20 January 2006)
            - Template Fix: Regression in 3.33 - RetryCreateIcon definition
              was not always being generated.
- Fix: Regression in 3.33 - Message removed from COM
              initialisation.
Version 3.33 (11 January 2006)
            - Template Fix: Taskbar icon now works with Services
- WinAccept (DLL) - optimised procedure
Version 3.32 (21 October 2005)
            - Fixed bug in ds_Memory where 0
              returned under clarion 6.x.
- Fixed bug in comms status pin functions CTSHigh, DSRHigh,
              RingHigh and CDHigh. Broken in 3.31.
Version 3.31 (27 September 2005)
            - Added ds_DestroyIcon(),
              use with ds_GethIcon() to free memory.
- Added option "Left-Click Icon shows Window" to the TaskBarIcon
              template.
- Added a separator to the TaskbarIcon popup menu.
- Fixed bug in ds_FormatFastTime
              where times past midnight displayed incorrectly.
- Added a ReSyncTime optional parameter to ds_FastClock()
              for use when the time has been adjusted.
Version 3.30 (1 September 2005)
          
          Version 3.29 (21 July 2005)
            - Fixed bug in ds_FormatFastTime where very small times, nano
              seconds displayed as milliseconds.
- Added a template to open a com port. See Use com port template.
- Added support for com port events.  See new com port template. 
              See modified newport command.
- Fixed a bug in the GSM Modem routines that caused a GPF under
              clarion 6.X
- Modified template call to ds_DebugView, removed start().  This
              was causing a GPF under 6.2 
- Added ds_SetRealTimePriority().
- Added ds_QueryPerformance().
- Added ds_Ulong64ToReal().
- Modified "Add Icon to system tray" template to include optional
              Show|Hide|Close popup. (Thank you Geoff)
- Added ds_HideWindow
              procedure
- Added ds_ShowWindow
              procedure
- Updated WinEvent() documentation.WinEvent
- Documented the WinSysEvent
              and WinWtsEvent functions.
Version 3.28 (19 January 2005)
            - Modified template so that importing a procedure with a WinEvent
              template does not cause template errors. 
- Modified template so that the Load Icon and Refresh Icon embed
              points are correct. Refresh Icon was missing.
Version 3.27 (10 December 2004) 
          
          Version 3.26 (3 December 2004)
            - Fixed bug in template where "Disable WinEvent in the
              application" did not always work, some code was still generated.
- Fixed bug in ds_SetClipboard().
Version 3.25 (25 November 2004)
            - Fixed bug in 
                ds_GetFileVersionInfo where extra characters were returned
              with the version string.
- Fixed bug in EzHelp version checking routine.
- Added priority attributes to template embed code. This is to
              assist with souce comparison at Jim's request.
- Renamed WinEvent internal modules, prefixed with "ds_we". This
              is to remove module naming conflicts.
- Added ds_SaveStack and
              ds_TestStack procedures.
              These may help in locating stack corruptions.
Version 3.24 (3 November 2004) 
          
          Version 3.23 (2 November 2004)
            - Added 
                ds_GetFileVersionInfo.
- Fixed bug in template where exporting multi-dll info caused a
              compiler error.
Version 3.22 (23 October 2004)
            - Major re-write of documentation.
- Added TaskbarShowBalloon and TaskbarHideBalloon code templates.
- Upgraded to new CapeSoft look.
- Added template help buttons.
- Modified WinEvent template to use EVENTMAP.CLW instead of adding
              each procedure prototype to the global map.
- Added error reporting to most WinEvent functions. See ds_Error
- Modified ds_CreateDirectory
              to work with relative paths ie ..\MyNewDirectory
Version 3.21 (8 September 2004)
            - Fixed memory leak in ScreenWidth(), ScreenHeight()
              &ScreenDepth()
- Added ds_GetScreenDPI() which returns the user screen DPI
              settings. 96=Small Fonts, 120=Large Fonts or custom font setting.
- Added ds_CreateShortcut() which will create a shortcut to a
              file.
Version 3.20 (18 August 2004)
            - Add Icon to the intray" template so that WinTaskBarAddIcon is
              now called from a posted event. This is because sometimes the Icon
              does not add.
- Added some compile warnings when WinNotOnTaskBar is used with
              auto-shutdown as this is not compatible.
Version 3.19 (22 July 2004)
            - Rebased DLL for faster loading.
- Added save to file / clipboard functionality to the builtin
              debug viewer.
- Added embed points for TaskBar balloon events.
- Added the field equate labels to the builtin debug viewer.
- Updated CSIDL equates.
- Added ds_GetHModule() which returns a handle to the current
              module or a specified DLL. Use with ds_GetHIcon().
- Added ds_GetHIcon() which returns a handle to icons that are
              compiled into the EXE or DLL.
- Added ds_GetWindowsColour() which returns the current users
              windows colour setting in clarion colour format.
Version 3.18 (3 June 2004)
            Fixed bug in WinTaskbarAddIcon where line breaks were removed from
            tip strings. Should only remove for WIN9x.
          
Version 3.17 (31 May 2004)
            - Fixed bug in ds_MoveFile.
- Modified WinTaskbarAddIcon and WinTaskbarChangeIcon to ignore
              calls with IconName blank.
Version 3.16 (16 April 2004)
            Fixed bug where calling Sound(soundfilename) would fail under Win2k.
          
Version 3.15 (7 April 2004)
            Fixed bug where calling Sound() with an empty wavefile name string
            caused a GPF.
          
Version 3.14 (23 March 2004)
            Modified WinSysEvent() and WinWTSEvent() functions to optionally
            clear the value after reading. New prototype!
          
Version 3.13 (18 March 2004)
            Fixed bug in template where the Sound function was incorrectly
            prototyped. Sound would cause app to close without GPF, just gone
          
Version 3.12 (3 March 2004)
            Fixed bug in GSM Modem SMS delivery Reporting where some Siemens
            modems were not properly supported.
          
Version 3.11 (16 February 2004)
            - Fixed bug in template where WinEvent events were not handled.
- WinEvent examples upgraded. (Thank you Jono)
Version 3.10 (5 February 2004)
            Fixed conflict with Secwin.
          
Version 3.09 (3 February 2004)
            Fixed bug in ds_WinTaskbarBalloon where Win2000 balloons did not
            work.
          
Version 3.08 (2 February 2004)
            Fixed bug in ds_WinTaskbarBalloon where Win2000 and Win NT4 Balloons
            were positioned off the visible desktop.
          
Version 3.07 (28 January 2004)
            - Added TaskbarIcon "Balloon" support. See ds_WinTaskbarBalloon
- Modified WinTaskbarAddIcon to accept "compiled in" icons.
              Example WinTaskbarAddIcon('~MyAppIcon.ico'...
- Modified Auto-Shutdown. Added Callback functions
              MyOKToEndSessionHandler & MyEndSessionHandler
 Added WinEvent functions ds_SetOKToEndSessionHandler &
              ds_SetEndSessionHandler.
 See Auto-Shutdown for details.
Version 3.06 (12 January 2004)
            - Fixed bug where WinEvent could not be linked into a non data
              DLL. WinEvent now has a DLL !!!!!
- Modified GSM Modem SMS delivery reporting.
- Added GSM Modem Event monitoring. See example.
Version 3.05 (5 January 2004)
            - Fixed bug where WinEvent could not be linked into a data DLL.
- Fixed bug in ds_VisibleOnDesktop where window would remain
              obscured on the right side.
Version 3.04 (11 December 2003)
            - Modified the NewPort function to cater for using LPTx as a
              parameter.
- Fixed bug in (don't laugh) ds_debug.
- Added new function ds_VisibleOnDesktop. 
Version 3.03 (22 September 2003)
            Added GSM Modem SMS delivery reporting support.
          
Version 3.01 (21 August 2003)
            - Modified the ds_GSMGetReply function. Added an extra optional
              parameter.
- Added GSM Modem SMS read support. See ds_GSMReadSMS
- Added an date format string to the "Append compile date to title
              bar" option on WinEvent extension general tab.
Version 3.00 (30 July 2003)
            Added a batch of new functions.
          
Version 2.99 (9 July 2003)
            - Fixed bug introduced in 2.98 where ReadPort caused a GPF.
- Added alternate Auto-Shutdown method. This allows you to execute
              closing down code but will exit even if user cancels the shutdown.
 See option under the Auto-Shutdown option on WinEvent extensions.
Version 2.98 (3 July 2003)
            Fixed bugs in WindowsRelease function.
          
Version 2.97 (26 June 2003)
            - Fixed bugs in ScreenWidth, ScreenHeight and ScreenDepth
              functions.
- Added a new function. ds_WinTransparent() . This function is
              completely useless but looks really cool. WinXP and Win2000 only.
              (Not Win98).
 ds_WinTransparent(255) = Normal window
 ds_WinTransparent(0) = Transparent window
 ds_WinTransparent(128) = recommended.
Version 2.96 (24 June 2003)
            Added new example code to the WinOnTop
            function. This is the ideal code for hiding and showing a window
            from the Task Bar.
          
Version 2.94 (2 June 2003)
            - Fixed bug in Modified NewPort (2.93) where an error on opening a
              port (port in use) caused a stop .
- Fixed bug in SetRTS and SetDTR functions. Was causing linker
              error.
- Problems with Wheel Mouse Support. Some mouse drivers are not
              compatible with WinEvent Wheel Mouse support and cause random
              GPF's.
Version 2.93 (1 May 2003)
            Modified NewPort to support buffer size setting.
          
Version 2.92 (8 April 2003)
            - Modified WinTaskBarAddIcon so that the Icon is redrawn whenever
              a new taskbar is started. Note the new "Refresh icon event" embed
              point.
- Added function GetSystemDir. This returns c:\windows\system
- Removed GetSystemWindowsDir as this only works under terminal
              server. 
Version 2.91 (24 March 2003)
            Fixed bug where WinEvent events were suppressed while running
            EzHelp.