----------------------------------------------------------------------------
To read documentation regarding the fixes and improvements to earlier
versions of Winbatch prior to what is documented in this file, please
go to the following URL:

  http://techsupt.windowware.com

and on the left frame of that web page, click on the link entitled:

  "A List of Fixes and Improvements"
----------------------------------------------------------------------------

WB 2000A  Feb 24, 2000

  Fixed problem in FileMenu with FileItemize("") and DirItemize("")
  sometimes returning a "function failed" error.

  BoxDrawCircle and BoxDrawRect no longer draw anything if all the
  coordinates are 0.

  FileMenu supports new FileItemPath("") function (see below under WIL DLL).


DLL 3.0abv  First showing up in WB 2000A

  New functions:

    FileItemPath(file-list)
      Returns a delimited list of file paths.

    ItemReplace(item, index, list, delimiter)
      Replaces an item in a list.

    AskTextBox(title, prompt, default, flags, reserved)
      Prompts the user for multiple lines of input.

    StrClean(s:source-string, s:characters, s:replacement, i:match-case, i:mode)
      Removes or replaces characters in a string.

  New IntControl:

    IntControl(38, p1, p2, 0, 0) (not really new, but previously undocumented)
      Sets quiet mode.

  "#include" directives can have leading whitespace (ie, they can be indented
  with spaces or tabs).  Note that an "#include" directive appearing in a menu
  file MUST be indented at least 4 columns, just like all menu code must be.

  DirExist no longer returns true if the directory name is followed by "*.*".

  Fixed a problem with numeric strings containing an "e" incorrectly being
  treated as floating point numbers.

  For DebugTrace, you can now specify a mode of 2, in which case when a
  terminal error occurs, the error message and the WIL variable table will
  be dumped to the debug log file.  This mode is entirely separate from
  DebugTrace(@ON) (ie, only one of the modes can be active at any time, and
  each mode has different types of output information, with no overlap).

  If you use IntControl(28) to specify a fixed pitch font for list boxes,
  a fixed pitch font will now also be used for ITEMBOX controls in dialogs.

  IntControl(56) can now terminate an application based on its module or
  file name as well as its window name.  The expanded syntax is:

    IntControl(56, p1, p2, 0, 0)

  FileVerInfo can now return numeric version fields, by preceding the resource
  string name with a '#'.

  WaitForKey now supports punctuation keys.

  Improved speed of BinaryReplace.

  Fixed a problem with RegQueryMulSz crashing with NULL (blank) registry values.

  BinaryStrCount now returns an error if the specified end-offset is past
  the binary EOD.


Windows NT extender 11015  First showing up in WB 2000A

  New functions:

    wntServerInfo(s:server-name, i:request)
      Returns information about a server.

    wntShareList(s:server-name, i:share-type, i:flags)
      Returns a list of shares on a server.

    wntShareUsers(s:server-name, s:share/computer-name, i:share-type, i:format, i:flags)
      Returns a list of users connected to a share or server.

    wntRemoteTime(s:server-name, i:format)
      Gets the time of day from a server.

    wntShutdown(s:computer-name, s:message, i:timeout, i:force, i:reboot)
      Shuts down (and optionally restarts) a computer.

    wntDomainSync(s:server-name, i:request)
      Synchronizes domain controllers.

    wntAcctPolSet(s:server-name, i:request, i:value)
      Sets account policy information for a server.

  Fixed a problem with wntFilesOpen possibly crashing.

  Changed the error message from "password too short" to "password is
  unacceptable", unless it's clear that the password really is too short
  (Windows returns a "password too short" error for various unrelated error
  conditions).  This affects wntChgPswd, wntUserAdd, and wntUserSetDat.

  Fixed a problem with wntAcctInfo(1) returning a SID that only included the
  last subauthority, instead of all of them.


Windows 95 extender 11007  First showing up in WB 2000A

  New functions:

    w95ServerInfo(s:server-name, i:request)
      Returns information about a server.

    w95ShareList(s:server-name, i:share-type, i:flags)
      Returns a list of shares on a server.

    w95ShareUsers(s:server-name, s:share/computer-name, i:share-type, i:format, i:flags)
      Returns a list of users connected to a share or server.


Windows 9x extender 10004  First showing up in WB 2000A

  New functions:

    w9xGetDc(s:server-name, s:domain-name, i:flag)
      Returns the domain controller for a domain.

    w9xRemoteTime(s:server-name, i:format)
      Gets the time of day from a server.


WB 2000B  Mar 20, 2000

  Compiler now sets the numeric FileVersion and ProductVersion fields to
  match the corresponding string fields.  The strings should be specified as
  a series of up to four numeric fields, delimited by periods or commas or
  spaces (eg, "3.01" or "5,1,2,0" or "2000 1 2".  Any missing or non-numeric
  fields will be converted to 0.

  If file specified by #include directive didn't exist, it was incorrectly
  returning an "unable to allocate memory" error.


DLL 3.0bbv  First showing up in WB 2000B

  New IntControls:

    IntControl(72, p1, 0, 0, 0)
      Sets Cancel handler.

    IntControl(73, p1, 0, 0, 0)
      Sets Error handler.

  Fixed a problem (introduced in WinBatch 2000A) with WaitForKey not
  detecting some of the special keycodes.

  If you use IntControl(49) to add system menus to dialog boxes, the icon in
  the title bar will now be the application icon instead of a generic
  Windows icon.

  Fixed a problem with DirSize returning incorrect numbers for directories
  containg files larger than 4 gigabytes.


Windows NT extender 11016  First showing up in WB 2000B

  New functions:

    wntSvcCreate(s:server, s:string-values, s:numeric-values, s:dependencies, s:reserved)
      Adds a service to the service control manager database.

    wntSvcDelete(s:server, s:service-name, i:flags)
      Marks a service for deletion from the service control manager database.

    wntGroupEdit(s:server-name, s:group, i:group-type, i:request, s/i:value)
      Modifies information about a group.


WB 2000C  May 3, 2000

  Fixed a problem with the compiler sometimes setting the "Src" key in the
  project configuration (.CMP) file to the wrong source file name.

  Changed BoxButtonWait to be more responsive to window messages during the
  wait period.


DLL 3.0cbv  First showing up in WB 2000C

  New IntControl:

    IntControl(74, p1, 0, 0, 0)
      Set idle wait after Run commands.

  Added new "function" to WinHelp:

    "HTML"

  In AskTextBox, "default" is no longer truncated at 256 characters.  Also,
  a horizontal scroll bar is added if "flag" number 1 is specified.  Also,
  the cursor is now scrolled into view if "flag" number 2 is specified.

  WinMetrics(-5) and (-6) now return floating point values (they are no
  longer rounded to an integer).

  Added new request to IntControl(54):

    P2   Meaning
    --   -------
    -1   Return window's current topmost state (@TRUE = topmost, @FALSE = not)

  You can now specify a negative number for TimeDelay, in which case the
  negative number will be treated as a positive number (eg, -5 will be
  treated as 5), and an alternate delay routine will be used.

  In NT, several functions may not have worked properly after using
  wntRunAsUser to impersonate a different user:

    IntControl(58)
    IntControl(67)
    IntControl(68)
    RegLoadHive
    RegUnloadHive

  Changed the internal routine used to create delays (eg, to wait for a
  window to appear or a program to finish), so that during the delay the WIL
  Interpreter is now more responsive to window messages.

  Fixed a problem with ItemReplace crashing when replacing the last item in
  a list.


Windows NT extender 11017  First showing up in WB 2000C

  wntSvcCreate now prepends '.\' to the specified ServiceStartName, if it
  doesn't already contain a contain a '\' (unless it's "LocalSystem").  This
  matches the behavior of wntSvcCfgSet.


NetWare 4 extender 14027  First showing up in WB 2000C

  n4UserGroups now returns a blank string ("") instead of an error
  if the specified user doesn't belong to any groups.


WB 2001B  Feb 27, 2001

  16-bit version is no longer being developed (so no more references to
  "32-bit only").

  Added additional option for IntControl(1007):

      p1   Meaning
      --   -------
       4   Modify currently-running script in the system tray

  IntControl(1004) now returns a full path for uncompiled WinBatch scripts.

  The extension for extender data files used by the compiler has been
  changed from ".DAT" to ".EXT".

  Fixed some problems with overlapping boxes

  Fixed some problems with button focus in boxes.


DLL 3.2bcb  First showing up in WB 2001B

  *** Important: The following changes alter (break) previous behavior ***

    In DiskFree and DiskSize, the items in "drive-list" can no longer be
    separated with spaces (in order to now support UNC's containing spaces).

    In ItemCount, trailing delimiters are now significant.  This means that
    the comma-delimited list "a,b,c," has 4 items in it.

    In ItemInsert, trailing delimiters are now significant.  This means that
    if you specify a blank item ("") and an offset of -1, a blank item will
    be added to the end of the list, even if the list already has a trailing
    delimiter.

    The following functions no longer add a trailing delimiter to the
    returned list (some of these are "legacy" functions that are no longer
    documented):

      AskFileText
      AskItemList
      ItemSelect
      RegQueryItem
      TextBox
      TextBoxSort
      TextSelect

    Changed the format of the string for OLE return types of VT_DECIMAL
    (this was previously undocumented).  The new format is described below.

    FileExist now returns @FALSE if the file name contains any '/'
    characters (this change was actually made in WB 99M).

  16-bit version is no longer being developed (so no more references to
  "32-bit only").

  New -- user-defined functions!

    WIL now supports user-defined functions (UDF's).  A UDF is defined as
    follows:

      #DefineFunction functname([param1, param2, ..., param16])
        <code>
        Return retval
      #EndFunction

      "#DefineFunction" and "#EndFunction" are the keywords indicating the
      beginning and end of the UDF.

      "functname" is a placeholder for the name of the function.  The
      function name must begin with a letter, can contain letters, numbers,
      and underscores, and can be up to 30 characters long.  You may not
      use a function name that is the same as the name of a WIL DLL function,
      but you may override a function name that's in an extender DLL.

      You may specify up to 16 optional parameters.  "param1" - "param16"
      are placeholders for your actual variable names.  These are the names
      of the variables that your UDF will receive when it is called.

      Between the "#DefineFunction" and "#EndFunction" keywords is the code
      that will get executed when the UDF is called.  It may contain a
      Return command followed by a value (or an expression that evaluates to
      a value), in which case the UDF will end and return this value.  If
      you specify a Return command without a value, the UDF will return 0.
      If a UDF does not contain a Return command, it will execute to the end
      of the UDF and return 0.  An Exit command in a UDF will cause the
      entire script to end, not just the UDF.

    A UDF must be defined anywhere in a script, as long as it is defined
    prior to being used for the first time.  A UDF may be defined or used in
    a separate script that is called with the Call command, as long as it is
    defined before it is used.  You may not have nested UDF definitions (ie,
    each "#DefineFunction" must be followed by an "#EndFunction" as a pair).

    A UDF will not have access to any variables in the main WIL script,
    other than the variables passed as param1 - param16.  Any variables set
    in a UDF will be destroyed when the UDF returns, other than the return
    value of the UDF.  Any percent signs in the UDF code will be expanded at
    runtime (when the code is called), not at define time.

    You may return a file handle, binary buffer, OLE object, or array from a
    UDF using the Return command.  However, if you create one of these types
    of objects in your UDF and do not return it using the Return command,
    you are responsible for freeing it before the UDF returns, using the
    appropriate WIL function (ie, FileClose, BinaryFree, ObjectClose, or
    Drop, respectively); otherwise, the object will become an "orphan" and
    will no longer be accessible and may not be automatically freed when the
    script exits.

    Example:

      ; Define three UDF's

      #DefineFunction Done()
        Message("All done", "Script processing is complete")
      #EndFunction

      #DefineFunction Square(number)
        Return (number * number)
      #EndFunction

      #DefineFunction AddListItem(list, newitem, delimiter)
        list = ItemInsert(newitem, -1, list, delimiter)
        list = ItemSort(list, delimiter)
        Return list
      #EndFunction

      ; Now use them

      list = "apples,bananas,peaches"
      list = AddListItem(list, "cherries", ",")
      Message("New list", list)

      Message("The square of 5 is", Square(5))

      Done()

  New -- arrays!

    WIL now supports arrays.  Arrays are created using the new ArrDimension
    function (see below).  An array may have from 1 to 5 dimensions, and each
    dimension may contain up to 65,535 elements.  Array elements are
    referenced with their subscripts enclosed in square brackets.  If an array
    has more than one dimension, the subscripts are separated with commas.  Eg:

      arrayvar[1]
      arrayvar[1, 1]
      arrayvar[0, 5, 2]

    Array subscripts are 0-based; ie, the first element in an array is array[0].

    Array elements can contain any type of WIL value: string, integer, float,
    etc.  You can have different types of values within an array.

    You may not pass an array as a parameter to a WIL function (except for
    functions which state they accept an array), or use it in any sort of
    operation.  For example, the following are NOT legal:

      arrayvar = 5                   ; NOT legal
      x = arrayvar                   ; NOT legal
      Message("Value is", arrayvar)  ; NOT legal

    On the other hand, the following are all legal:

      arrayvar[0] = 5
      x = arrayvar[0]
      Message("Value is", arrayvar[0])

    You can pass arrays to user-defined functions, and you can return arrays
    with the Return command.

    When you pass an array name (ie, not an array element) as a parameter to
    a function, the array gets passed "by reference".  That is, the function
    receives a pointer to the array, and is therefore able to make changes
    to it "in place".  This is similar to passing a binary buffer handle to
    a function, where the function is then able to make wholesale changes to
    the binary buffer.

    In contrast, passing an array element (ie, with a subscript) to a
    function is like passing a regular string or integer parameter to a
    function -- it gets passed "by value".  Ie, the function receives the
    value of the array element, but is not able to modify the array itself.
    By the same token, when you pass a string to a function like StrUpper:

      newstring = StrUpper(oldstring)

    The function does not modify the variable "oldstring" at all.  If you
    want to modify the existing variable, you can assign to it the return
    value of the function, eg:

      mystring = StrUpper(mystring)
      array[2] = StrUpper(array[2])

  New functions:

    ArrDimension(i:dim1 [, i:dim2 [, i:dim3 [, i:dim4 [, i:dim5]]]])
      Creates an array.

    ArrInfo(a:array, i:request)
      Gets information about an array.

    ArrInitialize(a:array, i:value)
      Initializes an array.

    Arrayize(s:list, s:delimiter)
      Converts a delimited list to an array.

    RegOpenKeyEx(i:handle, s:subkey-string, s/i:mode, s:reserved-1, s:reserved-2)
      Opens a registry key with specified access rights.

    VarType(s:varname)
      Gets the type of a WIL variable.

    RegQueryStr(i:handle, s:subkey)
      Retrieves and expands a string value from the registry.

    FileSizeEx(s:file-list)
      Finds the total size of a group of files (including open files).

    FileCreateTemp(s:prefix)
      Creates a temporary file.

    ClipHasFormat(i:format)
      Determines if the clipboard contains a particular format.

    BinaryTagIndex(s:tag-struct, i:mode)
      Returns the offset of a binary tag in a buffer.

    BinaryTagLen(s:tag-struct, i:mode)
      Returns the length of a binary tag.

    BinaryXlate(i:data-buffer, i:table-buffer, i:mode)
      Converts a binary buffer using a translation table.

  New IntControls:

    IntControl(69, p1, p2, 0, 0)
      Suspends machine by shutting power down.

    IntControl(75, p1, 0, 0, 0)
      Gets last dialog coordinates.

    IntControl(76, p1, 0, 0, 0)
      Sets the computer name.

    IntControl(77, p1, 0, 0, 0)
      Gets internal operating parameters.

    IntControl(78, 0, 0, 0, 0)
      Frees all UDF's.

  Changed RegExistKey and RegQueryItem to work if the current user only has
  read access (not full access) to the specified key.

  IniItemize / IniItemizePvt no longer has a 32K limit on the size of the
  returned list.

  If you specify -1 for the X or Y coordinate of a Dialog, the corresponding
  coordinate (X or Y) from the most recently displayed dialog will be used.
  If there was no previous dialog, the dialog will be centered.

  The file name following an "#include" pre-processor directive no longer
  needs to be quote-delimited.  Any of the following are now permitted:

      #include "filename"
      #include 'filename'
      #include `filename`
      #include filename

    If the file name is not delimited, it may not have any trailing whitespace.

  Can now pass an OLE object handle as a parameter to an OLE function.

  DirItemize wasn't returning directory names beginning with a period.

  Fixed problem with BinaryReplace giving a "Data to store would overrun
  binary buffer" error when replacing a NULL byte.

  In BinaryReadEx, if "file-offset" + "count" is larger than the file size,
  or if "count" is -1, "count" will be ignored and it will be treated as a
  request to read from "file-offset" to the end of the file.

  Debug and DebugTrace modes are now reset to @OFF before a Call command,
  and automatically set back to their previous states after the Call returns.
  You will need to put Debug and/or DebugTrace commands in the Call'ed script
  if you want it to be debugged.

  The Return command can now return a value, by specifying a value (or an
  expression that evaluates to a value) after the "Return" keyword.  The
  value or expression may optionally be enclosed in parentheses.  This
  feature can be used with the Call command, and with the new user-defined
  functions (see above).  It does not affect the GoSub command.

    Examples:

      Return
      Return (10)
      Return "Okay"
      Return myvariable * 10
      Return (ItemCount(list, @TAB))

  A script run with the Call command can now return a value by using a
  Return command with a value (see above).  If a Return command without a
  value is used, or the called script does not contain a Return command, the
  called script will return 0.

    Example:
      result = Call("other.wbt", "")

  ClipPut no longer has a 64K limit.

  Drop and DropWild can accept array names as parameters.

  IsDefined can accept an array name as a parameter.

  Fixed crash problem when doing an ObjectClose (or Drop, or variable
  reassignment) of an OLE object that was assigned to more than one variable
  name and had already been freed.

  OLE objects are now automatically attempted to be closed on shutdown.
  However, if you have a dependent OLE object open (eg, a document within an
  application), it may prevent the application from being closed.

  Fixed a problem where, if you assigned an OLE object handle to a second
  variable and then Drop'ed or reassigned the original variable, the OLE
  object would be closed and the second variable would therefore no longer
  refer to a valid OLE object.

  No longer receive an "unable to process include file" message when running
  an empty script file.

  Fixed problem with WallPaper function using tile and stretch options.

  DiskFree and DiskSize now support UNC's containing spaces (note that the
  items in "drive-list" can be UNC's corresponding to drives, as well as
  drive letters).

  Fixed a problem with AskFileName not bringing the window to the foreground.

  Fixed a problem with the BinaryTag[..] functions when the found text was
  larger than 64K.

  Directory functions now automatically return failure for directory names
  ending with two backslashes.

  Added new "select mode" to AskItemList and AskFileText:

    @extended

  AskItemList and AskFileText now support multiple selection up to 32,767
  items (previous limit was 100 items).

  Added additional special characters to the SendKey (and SendKeysTo and
  SendKeysChild) functions.  These may or may not work for any particular
  application or situation:

    Key          SendKey equivalent
    ---          ------------------
    Ctrl-Break   {CANCEL}
    Pause        {PAUSE}

  OLE now supports return values of type VT_CURRENCY and VT_DECIMAL.  They
  are returned as strings with prefixes:

      "#CURRENCY:value"   (VT_CY)
      "#DECIMAL:value"    (VT_DECIMAL)

    where 'value' is the decimal or currency value, converted to a string.

    You can also pass these types as parameters to an OLE function by
    prefacing the string with the appropriate prefix:

      Type      Name         Format
      ----      ----         ------
      CY        VT_CY        CY:"#CURRENCY:value"
      DECIMAL   VT_DECIMAL   DECIMAL:"#DECIMAL:value"

  For FileOpen, increased the maximum number of open files from 5 to 128.

  For BinaryAlloc, increased the maximum number of current binary buffers
  from 10 to 128.

  WinActivChild has been renamed to WinActiveChild (the old name will
  continue to work).

  Added new request # to IntControl(71):

    P1   Meaning
    --   -------
     3   Dump WIL variable table to the debug log file.

  Added new request # to MouseInfo:

    Req#  Return value
    ----  ------------
      9   WinID of top level parent window under mouse

  Added new flag to AskFileName:

    3 for Save style, with no "Replace" confirmation.

  AskFileText no longer truncates lines at 254 characters.  It now uses the
  line length set by IntControl(65) (4096 characters by default).

  AskFileText now treats line feeds as line terminators, instead of carriage
  returns.  It therefore now supports both DOS files (which have CR/LF
  terminators) and UNIX files (which have LF terminators).

  Cleared up some confusion with AskDirectory by setting the edit field (if
  present) to a blank value, so the user will not try appending a
  subdirectory name to the text in the field.  Any text entered in the edit
  field is treated as a subdirectory name under the selected directory.
  Also added a static text field showing the name of the selected directory.

  In BinaryWriteEx, if you specify -1 for "count", then "handle" and
  "binary-offset" are now ignored (there was previously a discrepency in the
  documentation about this).

  The following functions now return a file time of 1/1/1980 at 00:00:00 if
  the specified file has an invalid time field:

    FileTimeCode
    FileTimeGet
    FileTimeGetEx
    FileYmdHms

  The following file time get functions no longer round the seconds field of
  the file's time stamp to a multiple of 2 seconds, if a more accurate time
  format is supported by the operating system:

    FileTimeGet
    FileTimeGetEx
    FileYmdHms

  The file time compare routines in the following functions no longer round
  the seconds fields of the files' time stamps to a multiple of 2 seconds,
  if a more accurate time format is supported by the operating system.  They
  now compare the full seconds and milliseconds fields of the time stamps:

    FileCompare
    FileCopy
    FileMove
    InstallFile

  Fixed a problem with DebugTrace where if you specified a filename that did
  not include a full path, and then changed directories while the script was
  running, a new debug file would be written in whatever the current
  directory was.

  Changed the output strings for FileTime and TimeDate to more correctly
  reflect the date and time format preferences set through Control Panel.
  This also affects the File Overwrite confirmation dialog displayed by
  FileCopy and FileMove.

  Changed the following error codes from fatal (3000-) to minor (1000-):

    Old   New   Error
    ---   ---   -----
    3393  1393  AddExtender: Too many extenders added
    3394  1394  AddExtender: Extender DLL not found
    3395  1395  AddExtender: Not a valid extender
    3396  1396  AddExtender: Extender table full
    3437  1437  AddExtender: Extender DLL load failed

  Added an optional parameter to AddExtender:

    AddExtender(s:filename [, i:required-version])

  IntControl(73) now works with errors from extenders.

  Under Windows NT (and Windows 2000), AppExist and AppWaitClose now try to
  match the root + extension of "program-name", as well as just the root
  part, against any running application module names.  So if you specify
  "program.exe", it will match either a module named "program.exe" or a
  module named "program".

  Now suppressing a Windows crash error that can occur when doing an
  ObjectClose on an object that has already been freed by another process.

  Fixed problem using ObjectOpen after AskFileName.

  Optimized StrFill.

  Fixed problem with "multi-type" WIL variables being passed to OLE
  functions (ie, integers or floating point numbers that had been converted
  to strings, or vice versa).  If a variable has a floating point value, it
  will now be passed as a floating point value (even if it also has a string
  and/or integer value).  If a variable has both an integer and string
  value, it will now be passed as an integer.

  Fixed a string memory leak when converting string variables to integers.


Windows NT extender 32000  First showing up in WB 2001B

  New functions:

    wntLsaPolGet(s:server-name, s:class, i:element)
      Gets LSA (Local Security Authority) policy information.

    wntLsaPolSet(s:server-name, s:class, i:element, s/i:value)
      Sets LSA (Local Security Authority) policy information.

    wntUserSidChk(i:request, s:SID, i:reserved-1, i:reserved-2, i:reserved-3)
      Checks SID's in an access token.

    wntAccessAdd2(s:server-name, s:resource/share-name, s:user/group name, i:object-type, s:access-string)
      Adds or updates access (permission) records for a resource.

    wntAuditAdd2(server-name, resource/share-name, user/group name, object-type, access-string)
      Adds audit records for a resource.

    wntEventLog(s:server-name, s:text)
      Writes a "WBMSG" entry to the NT application event log.

    wntGroupRen(s:server-name, s:group, i:group-type, s:new-name)
      Renames a group.

  wntOwnerSet wasn't enabling the SE_RESTORE_NAME privilege to allow you to
  set ownership of an object to a different user.

  Fixed problem with wntUserAddDat("", "") not freeing some global memory.

  Fixed problem with wntUserAddDat possibly overwriting part of a different
  parameter value that had been previously set (with wntUserAddDat).

  Modified wntAccessAdd and wntAuditAdd to be more compatible with Windows
  2000 machines (also see new wntAccessAdd2 and wntAuditAdd2 functions).

  Added new predefined access strings for Windows 2000.  These are the same
  for files and directories:

    Access-string           Meaning          Specific equivalent
    --------------          --------------   -------------------
    "Win2000:Full"          Full Control     "0:3:2032127"
    "Win2000:Modify"        Modify           "0:3:1245631"
    "Win2000:ReadExecute"   Read & Execute   "0:3:1179817"
    "Win2000:List"          List             "0:2:1179817"
    "Win2000:Read"          Read             "0:3:1179785"
    "Win2000:Write"         Write            "0:3:1048854"
    "Win2000:None"          No Access        "1:3:983551"

  wntAccessList now returns a sorted list with no duplicate items.

  wntAccess[..], wntAudit[..], and wntShare[..] functions specifying a
  printer may have returned an "Access Denied" error, because they were
  trying to open the printer with an excessive level of access requested
  (especially under Windows 2000).

  wntPrivAdd and wntPrivDel may have failed with an "Access Denied" error
  because they were trying to open the policy object with an excessive level
  of access requested.

  Fixed problem with wntMemberLst2 returning users with blank names in local
  groups (ie, just "domain\").

  Changed wntServerInfo so that request #'s 1-4 can be called by any user.
  All other request #'s can can only be called by members of the
  Administrators or Account Operators local group, or those with
  Communication, Print, or Server operator group membership.

  Fixed a problem with wntMemberGrps that could have caused the script to
  hang if there were a very large number of groups that needed to be processed.

  Changed wntAccessAdd, wntAccessAdd2, wntAuditAdd, and wntAuditAdd2, so
  that if you specify one of the recursive object types (301, 302, 303, or
  401) and the function is unable to modify one of the objects it attempts,
  it will skip that object and continue, and won't return an error.  The
  function will return 0 if it was unable to modify an object.

  Fixed problem with wntRunAsUser with "allow interactive" flag set, where
  running an application could cause "abnormal termination" error.

  Added an additional flag to wntRunAsUser:

    Flag   Meaning
    ----   -------
      2    Load user profile into HKEY_USERS\<User SID>

  Fixed problem with wntAcctPolGet and wntAcctPolSet, where request #3 was
  getting/setting the password age in seconds rather than days.

  The wntAccess[..] and wntAudit[..] functions have been improved to work
  better under Windows 2000.


Windows 95 extender 32000  First showing up in WB 2001B

  Fixed a problem with the following enumeration-type functions that could
  have caused the script to hang if there were a very large number of items
  (files or shares) that needed to be processed:

      w95FileClose
      w95FileUsers
      w95ShareList
      w95ShareUsers

    Note that these functions are limited to using 64K buffers.  If that is
    not sufficient to accomodate all items, some items will not be processed.

  Fixed a problem with w95AccessAdd and w95AccessDel not working with a
  remote machine.


Windows 9x extender 32000  First showing up in WB 2001B

  Fixed a problem with w9xMemberGrps that could have caused the script to
  hang if there were a very large number of groups that needed to be processed.


WILX extender 32000  First showing up in WB 2001B

  Removed xCursorSet (not useful in 32-bit versions of Windows).

  Removed xMemCompact (not useful in 32-bit versions of Windows).

  Fixed problem with xGetChildHwnd returning the wrong window handle if
  'child-text' was blank.

  xBaseConvert now properly handles numbers beginning with a leading '-' or
  '+' sign.


WB 2001C  Mar 5, 2001


DLL 3.2ccb  First showing up in WB 2001C

  Fixed a problem with the OK button in AskDirectory being disabled under
  Windows 2000.

  In OLE functions, fixed a problem handling VT_DATE values outside the
  range 1/1/1980 to 12/31/2099.

  RegQueryKeys no longer adds a tab to the end of the list.


Windows NT extender 32001  First showing up in WB 2001C

  Fixed a problem with the wntAccess[..] and wntAudit[..] functions
  returning an Access Denied error.

  Fixed a problem with wntAccess[..] crashing when specifying a file in a
  FAT partition.


WB 2001D  Mar 6, 2001


Windows NT extender 32002  First showing up in WB 2001D

  Fixed a problem with wntAccessList and wntAuditList adding a tab to the
  end of the list.


WB 2001E  Mar 8, 2001


DLL 3.2ecb  First showing up in WB 2001E

  IniItemizePvt now supports itemizing the sections of Unicode INI files.


Windows NT extender 32003  First showing up in WB 2001E

  Fixed a problem with wntAccessDel and wntAuditDel crashing if the only
  access record for the object was being deleted.

  Fixed a problem with the wntAccess[..] and wntAudit[..] functions
  creating ACL's with access records that were incorrectly sequenced.


WB 2001F  Mar 15, 2001


DLL 3.3fcc  First showing up in WB 2001F

  In Windows 95/98, FILELISTBOX controls in dialogs no longer display files
  or directories marked as hidden or system, unless you first use
  IntControl(5) to enable that behavior.

  In Windows NT/2000, FILELISTBOX controls in dialogs now display files and
  directories marked as hidden or system, if you have first used
  IntControl(5) to enable that behavior.

  Fixed a problem with FILELISTBOX controls in dialogs not displaying
  directories beginning with a '.'.


WB 2001G  Mar 27, 2001

  Fixed a problem with BoxButtonWait failing to wait if you had pressed the
  same button twice without calling BoxButtonStat in between.

  Fixed a problem with areas of the Box windows not getting repainted
  properly when the windows were resized.

  Fixed a problem with OLE objects becoming invalid after being passed as
  parameters to OLE methods or properties.

  In FileMenu, the functions FileItemize(""), FileItemPath(""), and
  DirItemize("") no longer add a trailing delimiter to the list.


DLL 3.3gcc  First showing up in WB 2001G

  Fixed a problem where the floating point number 0.0 was being displayed in
  scientific notation.

  Fixed a problem with IniItemizePvt returning an extra item with stray
  characters when itemizing sections in the file, if the file was over 32K.

  Fixed a problem with the parameter of a Return statement being validated
  even if the Return was in a conditional block that wasn't being executed.

  Fixed a problem with ItemInsert, ItemRemove, and ItemReplace removing
  blank items at the end of the list.

  Fixed a problem with ItemInsert inserting an item at the wrong position if
  it were being inserted between blank items at the end of the list.

  Fixed a problem with ItemReplace not replacing an item following a blank
  item at the end of the list.

  Fixed a problem with ItemSort removing blank items from the list.


Windows NT extender 33001  First showing up in WB 2001G

  Fixed a problem with wntServerList hanging if the list of servers returned
  was larger than 64K.


Windows 9x extender 33001  First showing up in WB 2001G

  Fixed a problem with w9xServerList hanging if the list of servers returned
  was larger than 64K.


WB 2001H  Apr 2, 2001

  Fixed a problem with the compiler not being able to compile extenders into
  a large EXE (introduced in 2001G).


Windows NT extender 33002  First showing up in WB 2001H

  The wntPriv[..] functions can now be used on a local workstation for
  domain accounts, by specifying the user/group name in the form
  "domain_name\account_name".  Note that wntPrivAdd and wntPrivDel require
  administrator privileges on the local workstation.

  Fixed a problem with the wntShare[..] functions failing with "access
  denied" errors when the target object was a printer.


WB 2001J  May 25, 2001

  New functions, only when running as a service:

    SvcSetAccept(i:codes)
      Specifies the control codes that the service will accept.

    SvcSetState(i:state)
      Updates the service control manager's status information for the service.

    SvcWaitForCmd(i:timeout)
      Waits or checks for receipt of a service control code.

  The compiler now properly handles "#include" directives with leading
  whitespace (ie, indented with spaces or tabs).

  The compiler now properly handles double byte characters in the
  customizable version strings.


DLL 3.3jcc  First showing up in WB 2001J

  New IntControl:

    IntControl(79, p1, p2, p3, 0)
      Causes a user-defined error.

  Fixed a problem with Arrayize crashing with large lists.

  In ItemLocate you can now specify a delimiter of "" to indicate a tab.

  Fixed a problem with Drop not returning a value.  It now returns 1, as
  documented.

  Fixed a problem with AppExist no longer working after being called
  thousands of times.

  The Print command now ignores the "waitflag" parameter, as documented.

  Fixed a problem converting strings like "-.2", where a signed floating
  point decimal value did not have a 0 before the decimal point.

  Fixed a problem handling OLE object names longer than 30 characters where
  the variable name (the part before the '.') contained an underscore.

  ShortcutDir now supports registry strings of type REG_EXPAND_SZ.

  Increased the maximum number of open OLE objects from 20 to 128.


Windows NT extender 33003  First showing up in WB 2001J

  New functions:

    wntAccessMod(server-name, resource, object-type, request, flags)
    wntAuditMod(server-name, resource, object-type, request, flags)

  wntMemberList() now accepts an optional parameter to allow members of
  local groups to be returned with domain and/or server information (as a
  prefix before the user/group name, e.g. "domain\user",
  "domain\global-group" or "server\user").

  Improved support for managing permissions and auditing of printer objects
  (e.g. traditionally called "printers") and printer shares, and added new
  pre-defined access strings for printer objects and printer shares.

  wntMemberList now properly returns domain names and/or server names for
  standalone systems and workstations.

  wntAccess[..] and wntAudit[..] functions specifying a registry key may
  have returned an "Access Denied" error, because they were trying to open
  the key with an excessive level of access requested.

  Fixed a problem with the wntShare[..] functions, where specifying a
  printer name or printer share as "resource/share-name" didn't work
  properly.


Windows 9x extender 33003  First showing up in WB 2001J

  Fixed a problem with the w9xShare[..] functions, where specifying a
  printer name or printer share as "resource/share-name" didn't work
  properly.


WB 2001K  Jun 1, 2001

  Changed SvcWaitForCmd to use less CPU time.


WB 2001M  Aug 8, 2001

  BoxesUp was returning positive values on success, other than @TRUE.


DLL 3.3mcc  First showing up in WB 2001M

  New function:

    DllLastError()
      Returns the most recent error returned by a DllCall to a Win32 API.

  Decimals() was not returning the previous setting.

  IntControl(56) could not be used to kill a service.

  BinaryPeekStr no longer returns an error if "offset" is within the binary
  buffer but "offset + maxsize" is past the end of the binary buffer.

  Statements such as "If x" and "While x", where 'x' is a floating point
  number that is too large or small to convert to an integer, no longer
  return an error.

  Fixed a problem with the Run[..] commands crashing with very long command
  lines.

  Fixed problem with Arrayize with large lists.

  IntControl(45) is now enabled for Windows 95/98/ME, which should result in
  faster SendKey and SendKeysTo to DOS windows on those platforms.  This
  functionality is now the same on all Windows platforms.  If the "SendKey
  speedup" causes a problem, you can turn it off with IntControl(45,0,0,0,0).

  In ArrInitialize, "value" may now be an integer, floating point, or string.

  Fixed problem with Debug and DebugTrace displaying an incorrect result on
  a line of the form "If ... Then Call(...)".

  Fixed problem with DebugTrace causing an "Unrecognised Request" error in
  WIL applications other than WinBatch.


Windows NT extender 33005  First showing up in WB 2001M

  New function:

    wntSecurityGet(server-name, resource, object-type, request, flags)

  wntAccessMod and wntAuditMod now support registry keys (object type 400)
  on the local system.

  Improved the way the wntAccess[..] and wntAudit[..] functions handle
  registry key branches (object type 401), to solve "Access Denied" errors.

  wntAccessAdd2 and wntAuditAdd2 have been removed.

  Fixed problem accepting the group name "Everyone" as a parameter on
  non-English versions of Windows.


WB 2001N  Aug 31, 2001

  Fixed a resource (handle) leak in SvcWaitForCmd.


DLL 3.3ncc  First showing up in WB 2001N

  BinaryPeekStr now returns a blank string instead of an error if "offset"
  is set to the binary EOD and "maxsize" is 0.

  Fixed a problem with DirSize crashing with excessively long (illegal)
  directory names.  It now ignores (skips) invalid directory names.

  Fixed a problem with ShortcutInfo returning an invalid value for "hotkey"
  if the shortcut had a non-blank description and did not have a hotkey set.

  In ShortcutEdit, you can now specify "-1" for "target", "params", or
  "start-dir" to set NULL values.

  In ShortcutExtra, you can now specify "-1" for "description", "hotkey", or
  "icon-file" to set NULL values.

  In IntControl(34), if you specify -1 for "p1" it will return the string
  corresponding to the last extender error or user-defined error.

  New parameter type "huge number", used by several functions (below).  This
  is a long decimal number string, which may represent a number too large to
  be converted to an integer.  If the number is larger than 2147483647, it
  must be a string.

  Added an optional "format" parameter to DirSize, FileSize, and FileSizeEx:

    DirSize(dir-name, flags [, format])
    FileSize(file-list [, format])
    FileSizeEx(file-list [, format])

  BinaryReadEx and BinaryWriteEx now accept a huge number for "file-offset".

  In a Switch statement, a "Case" keyword followed by an invalid expression
  will now cause an error.


WB 2001P  Dec 10, 2001

  Changed the type of icons used by the compiler.  If you are specifying
  custom icons for your compiled EXE's, you should change them to the new
  format, which is an icon group consisting of 6 icon bitmaps:

    16x16,  16 colors
    16x16, 256 colors
    32x32,  16 colors
    32x32, 256 colors
    48x48,  16 colors
    48x48, 256 colors


DLL 3.4pcd  First showing up in WB 2001P

  New function:

    RunWithLogon(s:program-name, s:params, s:directory, i:display mode, i:waitflag, s:username, s:domain, s:password, i:logon-flags) (Windows 2000/XP only)
      Runs a program as a specified user

  IsDefined and VarType now return -1 (instead of an error) if the specified
  name is a function name or other reserved word.

  New data types for BinaryOleType:

    3  byte array  (VT_UI1 | VT_ARRAY)
    4  I1  pointer (VT_I1 | VT_BYREF)
    5  I2  pointer (VT_I2 | VT_BYREF)
    6  I4  pointer (VT_I4 | VT_BYREF)
    7  UI1 pointer (VT_UI1 | VT_BYREF)
    8  UI2 pointer (VT_UI2 | VT_BYREF)
    9  UI4 pointer (VT_UI4 | VT_BYREF)

  Added support for OLE functions that return byte arrays (variant type =
  VT_UI1 | VT_ARRAY).  In this case, the function will copy the data to a
  newly-allocated binary buffer of the required size, with the binary EOD
  properly set, and the return value will be the binary buffer handle.
  The user is responsible for freeing this binary buffer.

  BinaryReadEx was returning 1 instead of 0 for a 0-byte file.

  If the following clipboard functions are unable to open the clipboard,
  they will now retry for up to 30 seconds:

    BinaryClipGet
    BinaryClipPut
    ClipAppend
    ClipGet
    ClipGetEx
    ClipHasFormat
    ClipPut
    SnapShot

  Added support for OLE variant types VT_I1, VT_UI1, VT_UI2, and VT_UI4.

  Fixed a problem with BinaryReplace replacing text past the binary EOD.

  Fixed a problem with the following functions crashing if the space bar and
  Esc keys were pressed simultaneously:

    AskFileText
    AskItemList
    AskTextBox
    ItemSelect
    TextBox
    TextBoxSort
    TextSelect

  In FileVerInfo, if you specify a blank string for "language-key" it will
  now additionally try to look up the item under the language key
  "000004B0" (Neutral, Unicode).

  Added two optional parameters to ShortcutDir:

    ShortcutDir(s:name [, i:source [, i:add-slash]])

  Added a new request # to DirWindows:

    2 = shared Windows directory on a multi-user system (Windows 2000 and XP only).

  Fixed a problem with the StrFix[..] functions with "length" > 64K.

  Changed the behavior of IconReplace and IntControl(37).  Instead of
  replacing an individual icon image in an EXE file, they now replace
  multiple images in an icon group in an EXE file.  An icon group is a set
  of one or more associated icon images, of different dimensions and color
  depths.  An EXE file can contain multiple icon groups; an icon (.ICO) file
  contains a single icon group.  The difference betwwen the two functions is
  that IconReplace will modify the first icon group in the EXE, while
  IntControl(37) lets you specify which icon group to modify.  The "p3"
  parameter in IntControl(37) now specifies the ordinal position of the icon
  group to modify.  In both cases, each icon image in the targeted icon
  group in the EXE file is compared with each icon image in the specified
  .ICO file, and if the .ICO file contains an icon image whose size (and
  dimensions and color depth) is the same as the targeted icon image in the
  EXE, then the targeted icon image in the EXE is replaced with the
  corresponding icon image from the .ICO file.  If no suitable replacement
  icon is found in the .ICO file, then that particular icon image in the EXE
  is left unchanged.  The return value of the function is the number of
  icon images in the EXE that were successfully replaced.

  Added an additional optional parameter to the following shortcut functions:

    ShortcutEdit(link-name, target, params, start-dir, show-mode [, i:shortcut-type])
    ShortcutExtra(link-name, description, hotkey, icon-file, icon-index [, i:shortcut-type])
    ShortcutInfo(link-name [, i:shortcut-type])
    ShortcutMake(link-name, target, params, start-dir, show-mode [, i:shortcut-type])

  In AskFileName, if you specify a blank string ("") for "directory", the
  current working directory will be used.


Windows NT extender 34005  First showing up in WB 2001P

  New function:

    wntLastErrMsg()
      Retrieves the error message text for an extender error.

  Fixed problem with wntShareAdd under non-English versions of
  WinNT/Win2K.

  wntAccessList and wntAuditList now strip off the domain
  "NT AUTHORITY\".

  Added a new optional flag parameter to wnt[Access|Audit][Add|Del|Get].

  Added new flags to wnt[Access|Audit]List.

  Added a new request number (#2) to wntAcctInfo.

  Added a new optional flags parameter to wntAcctInfo.

  Changed wntOwnerSet so that if the 'account-name' parameter's value is an
  empty string [e.g. ""], then the current user's account-name will be used
  as the value for this parameter.

  Improved/corrected the way wntOwnerSet handles folder/file and registry
  key objects under Win2K.

  Changed the flags that are valid for wntOwnerGet.

  Added a new optional flags parameter to wntOwnerSet.

  Added a flag to enable the display of a progress dialog box for
  wnt[Access|Audit][Add|Del|Mod] and wntOwnerSet.

  wntOwnerSet can now perform recursive processing of an entire folder &
  file hierarchy or a branch of the registry, by specifying new object types
  301, 302, 303 and 401.

  wntOwnerGet and wntOwnerSet now support printer objects [object-type =
  200].

  Improved the way wnt[Access|Audit][Add|Del|Mod] and wntOwnerSet handle
  excessively long path names for recursive file object types 301, 302, and
  303.

  wntLsaPolGet and wntLsaPolSet now support named LSA Private Data Objects,
  using the new class name "PrivateData".

  Changed wnt[Access|Audit][Add|Del], wntAccessMod, and wntOwnerSet so that
  recursive operation failures that used to return an error 575 now return 0
  instead.

  Fixed a problem with wntRunAsUser with flag 1 hanging under Windows XP.

  Fixed problem with DLL not loading on NT 3.51.

  For wntShutdown, you can now specify a "timeout" of -1 to indicate that a
  time delayed shutdown request should be aborted, provided that the time
  delay has not already expired.


WB 2002A  Dec 24, 2001

  Added warning message to compiler when attempting to use an improper
  icon.

  Fixed problem in Winbatch Studio with new BinaryBuffer/Array views.


WB 2002B  Jan 22, 2002

  New function:

    BoxBitmap(box ID, coordinates, filename, stretch-mode)
      Displays a bitmap in a WinBatch box.


DLL 3.5bcd  First showing up in WB 2002B

  New IntControl:

    IntControl(80, 0, 0, 0, 0)
      Waits until no keys on the keyboard are pressed.

  IgnoreInput is now supported on Windows 98/ME/2000/XP.  It will return -1
  if run on an unsupported platform.  Also you can now specify a "flag" of
  -1 to query the current state.

  Fixed problem with ArrInitialize not freeing any previous string values in
  the array.

  Added additional special characters to the SendKey (and SendKeysTo and
  SendKeysChild) functions.  These may or may not work for any particular
  application or situation:

      Key                              SendKey equivalent
      ---                              ------------------
      Print Screen                     {PRTSC}

      Left Alt key, standalone         {LALT}
      Right Alt key, standalone        {RALT}
      Left Control key, standalone     {LCONTROL}
      Right Control key, standalone    {RCONTROL}
      Left Shift key, standalone       {LSHIFT}
      Right Shift key, standalone      {RSHIFT}
      Left Windows key, standalone     {LWIN}
      Right Windows key, standalone    {RWIN}
      Applications key, standalone     {APPS}

      Left Alt key, combination        {*LALT}
      Right Alt key, combination       {*RALT}
      Left Control key, combination    {*LCONTROL}
      Right Control key, combination   {*RCONTROL}
      Left Shift key, combination      {*LSHIFT}
      Right Shift key, combination     {*RSHIFT}
      Left Windows key, combination    {*LWIN}
      Right Windows key, combination   {*RWIN}
      Applications key, combination    {*APPS}

    "Standalone" means the key is pressed and then released.  "Combination"
    means the key is held down while the following key is pressed.

    The left and right Alt, Control, and Shift keys can only be
    distinguished on Windows NT/2000/XP.  On other platforms they are
    treated as plain Alt, Control, and Shift keys, respectively.

    The "Windows" and "Applications" keys are on the Microsoft Natural
    keyboard.

  Fixed a problem with empty WIL scripts causing an error, especially under
  Windows XP.

  Added an optional "format" parameter to DiskFree and DiskSize:

    DiskFree(drive-list [, format])
    DiskSize(drive-list [, format])

  Changed error 3385 ("DiskExist: Invalid Disk Argument") to 1385.


Windows NT extender 35001  First showing up in WB 2002B

  New functions:

    wntPrivUsers(server-name, privilege[, output-format-flag])
    wntSvcList(server-name, service/group-name, flags)

  The following functions can now accept SID strings in place of group
  names.  They can also return SID strings in place of account names for
  either all SIDs or only for SIDs that cannot be resolved to account names:

      wntMemberDel
      wntMemberGet
      wntMemberGrps
      wntMemberList
      wntMemberSet
      wntGroupDel
      wntGroupEdit
      wntGroupInfo
      wntGroupRen
      wntListGroups
      wntPrivAdd
      wntPrivDel
      wntPrivGet
      wntPrivList
      wntRasUserGet
      wntRasUserSet
      wntUserDel
      wntUserExist
      wntUserGetDat
      wntUserList
      wntUserProps
      wntUserSetDat
      wntUserRename
      wntWtsUserGet
      wntWtsUserSet

  The following functions now accept 2 new object types, 500 and 501:

      wntAccessAdd
      wntAccessDel
      wntAccessGet
      wntAccessList
      wntAuditAdd
      wntAuditDel
      wntAuditGet
      wntAuditList

    Object type 500 is for window station objects and object type 501 is for
    desktop objects.  It is now possible to manipulate the security settings
    on window stations and desktops.  Currently there is no function to
    list/enumerate window stations and desktop on the system, so you have to
    already know the name of the window station &| desktop that you want to
    manipulate.  The default window station associated the keyboard, monitor &
    mouse [e.g. the console window station] is "WinSta0".  The default desktop
    on the console window station named "Default", and it is referred to as
    "WinSta0\Default".  All desktop objects must have their corresponding
    window station name prefixed onto them so that the format of the name is
    "window-station\desktop".

  The functions wntSvcCfgGet() and wntSvcCfgSet() have been modified.  On
  Win2K [and newer systems] they are now capable of getting & setting
  service descriptions and service failure recovery settings.


WB 2002E  Jul 5, 2002

  If you use IntControl(1007) to add an icon to the system tray, and also use
  IntControl(12) to prevent the script from being terminated, attempting to
  terminate the script no longer removes the icon from the system tray.


DLL 3.6ecg  First showing up in WB 2002E

  New functions:

    SysParamInfo(i:request, s/i:value, i:ini-update)
      Gets or sets system informtion.

    ObjectCollectionOpen(i:object-handle)
      Initializes enumeration of an OLE collection object.

    ObjectCollectionNext(i:enumeration-handle)
      Continues enumeration of an OLE collection object.

    ObjectCollectionClose(i:enumeration-handle)
      Ends enumeration of an OLE collection object.

    AskColor(s:default-color, s:reg-key, i:format)
      Displays a color selection dialog box, and returns the selected color.

    AskFont(i:type, i:flags, s:reg-key, i:format)
      Displays a font selection dialog box, and returns information on the selected font.

  New IntControl:

    IntControl(82, p1, 0, 0, 0)
      Sets seed for the Random() function.

  Added support for user-defined functions (UDF's) with global variables,
  defined using the keywords #DefineSubroutine and #EndSubroutine:

      #DefineSubroutine functname([param1, param2, ..., param16])
        <code>
        Return retval
      #EndSubroutine

    This is the same as a regular UDF, except that it will be able to access
    and change variables in the calling script, and any variables it sets
    will not be destroyed when it returns.

  Added a new request # to SnapShot:

    5 = Take snapshot of entire virtual screen (Windows 98/Me/2000/XP only)

  Added a new "method" to IntControl(61) and IntControl(62):

    p1  Method to use
    --  -------------
     5  Display invisible window, then attach to the input thread of the foreground window

  Fixed problem with StrFill crashing if 0 was specified for "length".

  Fixed an obscure problem with OLE calls erroneously failing.

  AskFileName now returns an error if 'filetypes' contains an odd number of
  items.

  Fixed a syntax problem when embedding an OLE call (with parameters) as a
  parameter within another function.

  Fixed problems with Dialog variables not being set properly if you pressed
  cancel or closed the dialog using the Close button (or system menu item).

  Dialog names can now be up to 19 characters long (was previously 16).

  Fixed a problem with very large encoded scripts causing an
  "Encrypted/Encoded verification failed" error.

  In DiskVolInfo, if the "root-path" parameter does not end with a backslash
  (and is not "") then a backslash will automatically be appended.

  IniItemize / IniItemizePvt no longer has a 32K limit on the size of the
  returned list when itemizing section names or key names.

  When an OLE function returns a byte array and a binary buffer is allocated
  to store it, the buffer type is now automatically set to 103.

  Increased the maximum number of UDF's from 100 to 200.

  Extenders can now have more than 100 functions (supported starting at
  feature level 1003).

  In a DebugTrace log, tick count is now formatted as an unsigned integer.

  Fixed problem with trailing comments on an #EndFunction line.

  If an #include directive specifies a file with a relative path, the file
  will be looked for in the script directory before the current directory.

  Fixed problem with IconReplace and IntControl(37) not working with some
  EXE's (ones whose icon group resources were numbered instead of named).

  If IgnoreInput is enabled, it will be temporarily disabled during SendKey
  (and SendKeysTo and SendKeysChild) functions in Windows 98 and Windows ME.

  Fixed problem with WinActivate in Windows 2000 and XP.

  The cancel handler and error handler modes are now reset to their default
  settings during Call's and UDF's.

  Fixed a problem with the Random() function returning 0 too often.

  Can now assign an OLE object handle to a property.

  Fixed problem with IconReplace and IntControl(37) not working with some
  16-bit EXE's.  Note that with 16-bit EXE's, these functions operate on
  individual icon images and NOT icon groups (ie, the changes made in version
  2002P do not apply to 16-bit EXE's).

  You may now re-assign an array variable.

  Fixed problem with FileExist and FileSizeEx handling open system files
  (like PAGEFILE.SYS).  This will work only if a full path name is specified
  or the file is in the current directory.

  Fixed problem with the script crashing after a 3647 error ("Cannot create
  embedded arrays").

  New data types for BinaryOleType:

    10   R4 pointer (VT_R4 | VT_BYREF)
    11   R8 pointer (VT_R8 | VT_BYREF)

  Fixed problem with GoTo and GoSub not ignoring labels inside a
  #DefineSubroutine block.

  Fixed problem with ObjectCollectionNext crashing when given an invalid OLE
  object.

  Message text is now truncated to 20,000 characters in the following functions:

    AskYesNo
    IntControl(1)
    Message
    Pause
    Terminate

  ItemLocate will now successfully find a blank item ("") in a list.


Windows NT extender 37000  First showing up in WB 2002E

  New function:

    wntAcctList(s:server-name, i:request [, i:output-format-flag])
      Rapidly lists accounts on an NT/2K/XP system.

  Fixed problem with wntSvcCfgGet crashing.

  The following functions now accept 2 new object types, 600 and 601:

      wntAccessAdd
      wntAccessDel
      wntAccessGet
      wntAccessList
      wntAuditAdd
      wntAuditDel
      wntAuditGet
      wntAuditList

  Fixed problem with wntShareList hanging when specifying a server with
  more than 2044 shares.

  Fixed problem with wntServiceAt crashing when there are a very large
  number of servers.

  Added an optional "display-flags" parameter to wntServiceAt.

  Fixed problem with wntSvcList running in an infinite loop.

  Fixed a bug where any of the wntAccess*()/wntAudit*() functions
  could cause an access violation error if a progress dialog box was being
  displayed.

  Fixed a bug where the permissions of "Everyone" - "Full Control"
  could not be properly deleted from the root folder of a NTFS volume that
  had the default permissions on it that are applied when the volume is
  first formatted.  Code in the extender that automatically fixes security
  descriptors that Win2K has corrupted on its own was not properly
  handling a situation where Win2K corrupts the security descriptor on the
  root folder in a manner different from how it corrupts the security
  descriptor on other folders.  Let's just say that the code handles these
  problems properly now.

  The wntListGroups() and wntUserList() functions now have some new
  output-format-flag bit values that allow multiple fields of group/user
  information to be obtained all at once instead of having to list all
  groups/users and then call wntGroupInfo()/wntUserGetDat(), respectively.
  This should cut down on the time that is required to obtain lists of
  groups/users such that actual group/user names and their corresponding
  descriptions/full-names are obtained for presentation in a GUI dialog
  box control.

  The wntListGroups() and wntUserList() functions now have a new
  output-format-flag bit value that allows a progress dialog box to be
  displayed while the extender is gathering information.  In situations
  where several thousands of group/user accounts are being enumerated,
  these extender functions can execute for very long periods of time
  leading the user to believe that the script has gotten "hung up".  The
  progress dialog box is updated every second to indicate that the
  extender function is still alive and what group/user it has most
  recently enumerated.

  The wntUserList() and wntListGroups() functions have had their performance
  improved by re-writing the internal functions that manage delimited lists.
  This re-write of the list management functions results in a significant
  improvement in the efficiency of the memory allocation/copy/de-allocation
  tasks that are performed while building a delimited list.

  Fixed problem with wntLsaPolSet not properly handling an empty SID string
  value passed in for element #2 in the class "PrimaryDomain".


WB 2002F  Jul 10, 2002


DLL 3.7fcg  First showing up in WB 2002F

  Added new request to IntControl(77):

    Request  Meaning
    -------  -------
       62    tab-delimited list of OLE objects

  In Dialog function, increased item, dropdown, and file list box number of
  items capacity for WinNT/Win2k/XP machines.


WB 2002G  Jul 15, 2002


DLL 3.7gcg  First showing up in WB 2002G

  Fixed problem with Random() function crashing on negative values.

  Fixed problem with variables beginning with high ASCII characters causing
  a crash.

  Changes to the Dialog function and related functions:

    Added code to work around Windows bug that caused hard crash when user
    pressed button accelerator keys that produced dialog termination.

    Added documentation for DialogControlSet/Get request code 13. (Change
    text color.)

    Changed DialgControlGet so that it reports the user's first edit to edit
    box part of drop down list control. (Windows does not report the content
    of the edit box as the selected item the first time the user changes the
    text: go figure.)

    Added workaround for WinXP bug that caused WB crash, if user cancels
    dialog from a Droplist change procedure event.

    Fixed bug in DialogControlState function that would not permit it to set
    the focus (request code 1) to a spinner control.

    Added new request-code to the dialogControlState function.  New request
    returns the number of the control with the focus or 0, if no control has
    the focus.


WB 2002H  Aug 22, 2002

  Fixed problem with some of the Box functions when in a Dialog callback.


DLL 3.8hch  First showing up in WB 2002H

  New functions:

    ObjectType(s:variant-type, s/i:value)
      Creates a WIL variable with a specific OLE variant type.

    ObjectTypeGet(s:varname)
      Gets the OLE variant type of a WIL variable.

    BinaryChecksum(i:handle, i:request)
      Returns the MD5 digest (fingerprint) or simple CRC of a binary buffer.

  New IntControl:

    IntControl(81, p1, 0, 0, 0)
      Sets seed for the Random() function.

  Improved WinPlace on multi-monitor systems, but it will only work properly
  if all monitors are the same resolution.

  In the Dialog function, the value of the WIL variable associated with a
  VARYTEXT control is no longer modified by the function.

  Fixed problem wih OLE objects being freed when used on a line like:

    If MyObject

  Fixed problem with BinaryStrCnt and high-ASCII characters.

  You can now pass a VT_NULL as a parameter to an OLE function as:

    NULL:""

  When specifying a variant type for a parameter to an OLE function, you
  can now optionally precede the type with "VT_".  For example, the
  following two lines may be used interchangeably:

    MyObject.Pause(BOOL:0)
    MyObject.Pause(VT_BOOL:0)

  Added new request to IntControl(77):

    Request  Meaning
    -------  -------
       63    reference count of OLE object specified by P2

  Changes to the Dialog function and related functions:

    Added "Number-Only" (64) style for edit controls.

    Added "Add-Item" (14) request code to DialogControlSet function. Allows
    addition of single item to File list, Item List and drop down List
    boxes.

    Added "Remove-Item" (15) request code to DialogControlSet function.
    Allows removal of single items from File List, Item List and Drop-down
    List boxes.

    Added "Disable Input" option code (1000) to DialogProcOptions function.
    When set, user input to dialog is ignored and title bar is "grayed" but
    dialog screen images are redrawn as needed.  If DialogProcOptions' third
    parameter is set to 2 instead of one the "Wait" cursor is also
    displayed.

    "Snap-to-default-button" setting now respected on Windows NT 4.x,
    Windows 2000, and Windows XP machines.

    Added "Set-dialog-background" option code (1001) to DialogProcOptions
    function. Allows user to dynamically change dialog's background bitmap
    or color.

    Improved rendering of bitmaps on palette based display devices


Dialog Editor 2002H  First showing up in WB 2002H

  Bug Fix -"multiple radio buttons with same value" error message appear
  when the condition dose not exist.

  Added check to Dialog Editor that looks at the for dialog function's
  parameter value. Necessary because can cause the creation of WIL reserve
  words as dialog attribute variable names when prefixed to attribute names.

  Bug Fix - picture buttons did not always display the default bitmap when
  created.

  Bug Fix - Added File List Box counting (only one permitted) when templates
  saved to the clipboard.

  User now has option to save a dialog template with errors.

  Added "Number-Only" (64) style for edit controls.

  User menu choices for View->Grid and View->Bitmap menu items are now
  remembered between sessions. Also,view menu settings are respected when
  the dialog background is changed.


Windows NT extender 38001  First showing up in WB 2002H

  In wntAccessMod and wntAuditMod, request #3 (re-enable ACL inheritance)
  was not properly stripping explicitly assigned ACEs from the ACL.


NetWare 4 extender 38000  First showing up in WB 2002H

  Fixed problem with n4MemberDel and n4MemberSet with Novell eDirectory.

  n4MemberDel and n4MemberSet now remove/set the "Equivalent To Me" attribute.


WB 2002J  Dec 2, 2002

  New IntControl:

    IntControl(1009, p1, 0, 0, 0)
      Gets name of current service.

  In the compiler, if you press Cancel in the Options dialog it no longer
  resets the target file name to have the same base name as the source file.


DLL 3.9jci  First showing up in WB 2002J

  New functions:

    ItemCountCsv(s:line, i:flags)
      Returns the number of items in a CSV line.

    ItemExtractCsv(i:index, s:line, i:flags)
      Returns the selected item from a CSV line.

  New IntControl:

    IntControl(83, p1, 0, 0, 0)
      Specifies how OLE byte arrays will be handled.

  Fixed problem with WinPlace on multi-monitor systems when using the
  @NORESIZE and @ABOVEICONS constants.

  Labels for GoTo and GoSub can now be up to 249 characters (they were
  restricted to 30 characters in version 2002H).

  When the Run[..] functions retrieve command-line parameters from the
  registry, they now support the %* token, which gets replaced by all
  remaining parameters.

  Added an optional parameter to AppExist and AppWaitClose:

    AppExist(s:program-name [, i:current-session-only])
    AppWaitClose(s:program-name [, i:current-session-only])

  Added a new parameter to IntControl(56):

    IntControl(56, p1, p2, p3, 0)

  The following functions now return an error if "delimiter" is more than a
  single character:

    Arrayize
    AskItemList
    ItemCount
    ItemExtract
    ItemInsert
    ItemLocate
    ItemRemove
    ItemReplace
    ItemSort

  In AskDirectory, fixed problem where "start-dir" specified a UNC.

  StrIndexWild now returns "start" instead of 0 if "pattern" is a blank
  string (unless "start" == 0, in which case it returns 1).

  Fixed problem with TimeDelay at Daylight Savings Time changeover.

  TimeDelay will now always wait at least the specified amount of time.

  Fixed problem with SysParamInfo returning an error if "ini-update" was 3.

  In MousePlay, added support for multiple monitors in Windows 2000 and
  Windows XP.

  Added support for OLE methods and properties that return arrays.  The
  return values will be returned as a WIL array.  Note that byte arrays are
  no longer converted to a binary buffer by default, as in previous versions,
  but this behavior can be changed with the new IntControl(83).

  OLE return types of VT_ERROR are now supported properly.  They now return
  the SCODE associated with the error, instead of 0 as before.

  Changes to the Dialog function and related functions:

    Fixed bug in DialogControlSet function.  Changes to MULTILINE control's
    text now appear immediately.

    Fixed bug in DialogControlGet function.  Request code #13 (Get Text
    Color) now returns correct text color when control also has "DEFAULT"
    background specified.  The function was  returning "DEFAULT" for any
    text color when the control had the "DEFAULT" background.

    Removed limit on the size of individual items in ITEMLIST and
    DROPLISTBOX controls.

    Removed limit on the number of items that can be saved into a ITEMLIST
    control variable on dialog dismissal.

    Fixed bug in automatic sizing of DROPLISTBOX when control has a user
    selected font specified.

    Fixed bug in automatic tab-order reassignment when attempting to
    maintain GROUPBOX member control associations.

    Added 2 new callback request codes for the DialogProcOptions function.
    Callback code 12 produces a user defined dialog procedure callback when
    the dialog's user double-clicks an FILELISTBOX item and callback code 13
    produces a callback when the dialog's user double-clicks an ITEMBOX
    item.

    Extended DialogControlSet/Get request code #10 functionality to
    MUILTLINEBOX controls so control can be scrolled from within a user
    defined dialog procedure.

    Dialog window now will minimize to the windows taskbar.  IntControl(49,
    1, 0, 0, 0) must be used to turn on system menus for this feature to
    take effect.

    Spinner controls no longer permit user to type or paste invalid text
    into control.  Invalid text is text that contains characters other than
    decimal digits and sign (+,-) characters.  As a side effect the control
    no longer considers the thousands separator (,) as valid text.

    Added <dialog-var>config varaible to dialog template.  This variable
    controls how the dialog editor creates the "dialog" statement in the
    template.

    Added new "flat" (128) style to dialog push and picture buttons.

    Added support for embedded double quotes in control text attribute.
    Each double quote must be specified by placing two double quotes at the
    desired location of the double quote.  Also the entire text attribute
    must be surrounded by single double quotes.

    "Snap-to-default-button" functionality is now supported on secondary
    monitors of multi-monitor desktops (Windows 2000 and Windows XP only)

    Fixed bug in that caused AskItemList function to fail when called from
    dialog procedure.

    Fixed crash bug that occurred when user dialog procedure returns a
    positive number in response to a DROPLISTBOX change event (Windows XP
    only.)


Dialog Editor 2002J  First showing up in WB 2002J

  Editor changed to display control text as it will appear when the dialog
  is displayed by the dialog function.

  Editor now respects beginning and ending double quotes in the controls
  text attribute.

  Editor changed to automatically add a second set of double quotes to
  template when the text attribute is specified containing double quotes.
  (User only needs to add one double quote in control property sheet.)

  Added checking for invalid values for SPINNER control's pre-selected item
  attribute to editor.  Does not error but does substitute DEFAULT key word
  for invalid value.

  Added ability to move multiple controls simultaneously with either mouse
  or arrow keys.

  Added ability to select multiple controls simultaneously with keyboard by
  using the Control+tab key combination.

  Ok button now has default button style in Dialog Editor's default
  template.


WB 2002K  Dec 6, 2002


DLL 3.9kci  First showing up in WB 2002K

  Fixed problem with TimeWait not working correctly.


WB 2003A  Dec 23, 2002


DLL 4.0ada  First showing up in WB 2003A

  New IntControl:

    IntControl(84, p1, 0, 0, 0) (Windows NT/2000/XP only)
      Itemize desktops, or windows on specified desktop.

  Fixed problem with WinPlace using the @NORESIZE and @ABOVEICONS constants.

  Added an optional parameter to ItemCountCsv and ItemExtractCsv:

    ItemCountCsv(s:line, i:flags [, s:delimiter])
    ItemExtractCsv(i:index, s:line, i:flags [, s:delimiter])

  DirMake no longer returns an error if a root directory is specified.

  DirMake now returns an error if the specified directory has more than one
  consecutive slash (other than the two backslashes at the beginning of a UNC).

  Changes to the Dialog function and related functions:

    Fixed bug that causes the edit part of a Spinner control to remain
    visible when the control's state is changed to invisible via a call to
    DialogControlState.

    Changed error message associated with memory allocation errors.

    Dialogs can now be created without any controls
    (<dialog template name>NumControls=000 will not cause error.)

    Fixed very rare system access violation error that occurred when
    displaying bitmaps.


Dialog Editor 2003A  First showing up in WB 2003A

  Editor now creates the 2 parameter version of the "Dialog" statement only
  when "Create dialog statement that WinBatch will ignore" is selected on
  the configuration page of the Dialog Attributes property sheet.


WB 2003B  Jan 8, 2003


WB 2003C  Jan 10, 2003


DLL 4.0cda  First showing up in WB 2003C

  IntControl's 39 and 40 were not properly handling p1 == 0.

  Fixed a memory leak problem in ObjectCollectionClose.  There may now be a
  slight performance degradation in ObjectCollectionNext as a result.


Dialog Editor 2003C  First showing up in WB 2003C

  Fixed several problems with the "Dialog" statement generated when changes
  are made to the Dialog configuration.


WB 2003D  Feb 21, 2003

  Redesigned compiler interface.


DLL 4.0dda  First showing up in WB 2003D

  New functions:

    BinaryIndexBin(i:handle, i:offset, s/i:item, i:direction, i:match-case)
      Searches a buffer for an item.

    WinPlaceChild(x-ulc, y-ulc, x-brc, y-brc, partial-parent-winname, partial-child-winname)
      Places a child window.

    WinPositionChild(partial-parent-winname, partial-child-winname)
      Returns child window position.

  Changed the way the internal path name expansion functions determine the
  current directory, and fixed a problem where the current directory was a
  UNC and a file or path name beginning with '\' was specified.  This
  affects FileFullName and other file management functions.

  Fixed a problem that could occur if GoSub failed due to a missing label,
  but this error were trapped by a user-specified error handler routine,
  then there would be a missing Return statement and control would return
  to the wrong place in the script.

  Fixed a problem with ObJectType returning an error if "value" already had
  an OLE type.

  ArrDimension and Arrayize will now let you create a 0-dimension array.

  If AddExtender fails, the extender will now be unloaded.

  Changes to the Dialog function and related functions:

    Fixed bug that caused the default button boarder to not display after a
    dialog box was disabled and then enabled with the DialogProcOptions
    function request 1000.

    Fixed bug in DialogControlState function that caused a button to loose
    style 32 (default button) when the request code 3 (add style) was
    specified with style 32 and the button already had style 32.

    Fixed bug in DialogControlState function that caused a control to
    sometimes not become invisible when the control style was set to 1
    (invisible) with request code 3 (add style). This problem usually
    occurred with the Calendar control when rapidly turning the style 1
    (invisible) on and off.

    Fixed problem with multi-selection Itembox's incorrectly displaying an
    item with selection coloring when the item was not actually selected.
    This only occurred on Windows 2000/XP computers and was usually
    associated with the user selecting an item using alphanumeric keystrokes
    as apposed to mouse clicks or arrow keystrokes.  The problem appears to
    stem from a defect in the Windows operating system but WinBatch was
    modified to compensate for the aberrant behavior.

    Spinner control's display window changed to right justified text.

    Fixed bug that caused a blank line to be added to the list part of a
    Droplistbox when the selection was cancelled using the DialogControlSet
    function with request code 6 (select item) and an empty string to clear
    the current selection in the control.

    Modified behavior of  DialogControlSet request code 14 (add single item)
    to preserve the sort order of Droplistbox controls when the existing
    contents are in sort order.

    Fixed bug that caused an dialog procedure option 6 (file selection
    change) or 7 (item selection change) call to the user defined dialog
    procedure when a FILELISTBOX's or ITEMBOX's selection is changed
    programmatically using the DialogControlSet function with request code 6
    (set selection).


Dialog Editor 2003D  First showing up in WB 2003D

  Change the key mnemonic associated with the "Text Color" edit control in
  the "Text Appearance" property page of the "Attribute" property sheet from
  "c" to "l".

  Fixed problem with editor not properly displaying a new background color
  when the user changed the existing background color for "Editbox",
  "Multilinebox" and "Droplistbox" controls.


Windows NT extender 39001  First showing up in WB 2003D

  The wntGetCon() function was generating an error instead of simply
  returning an empty string [""] on WinXP when an LPTx: port was not
  currently connected to a network resource and did not currently exist as a
  physically present parallel printer port.  This function now suppresses
  the error that is produced only on WinXP and returns an empty string [""]
  instead.

  The wntAccess*(), wntAudit*() and wntSecurity*() functions were plagued
  with some problems specific to Win2K/WinXP.  These problems were caused by
  some security descriptor control flags that were not being properly
  reported by the low-level security Win32 API functions.  Despite the fact
  that many of the high-level security Win32 API functions are horribly
  broken in many ways across many versions of the NT platform family, and
  even broken differently across different service packs, it was necessary
  to use one of them to retrieve the security information for NTFS folders &
  files in order to work around this particular bug.

    The end result of this is that managing NTFS permissions on Win2K &
    WinXP from a Win2K or WinXP system will now work OK even when the
    corrupted SD control flags are encountered.  However, WinNT systems
    might not be able to manage NTFS permissions on a remote Win2K/WinXP
    system in certain situations; the error that the extender will generate
    in this situation is error #716.

  A new function, wntProfileInfo(), has been added.  This function allows
  you get some profile related information on WinNT v4.0, Win2K and WinXP
  systems.

  A new function, wntProfileDel(), has been added.  This function allows for
  profiles to be deleted from the system.

  A new function, wntDfsList(), has been added.  This function allows for
  DFS shares to be listed in a domain [AD mode] or on a standalone DFS
  server.

  A new function, wntDfsGetInfo(), has been added.  This function allows for
  detailed DFS share information to be obtained, including information about
  all of the storage targets associated with any particular DFS share.


WB 2003E  Feb 24, 2003

  Fixed problem with compiler not properly initializing the project
  configuration (.CMP) file.


DLL 4.0eda  First showing up in WB 2003E

  Fixed bug in DialogControlState function that caused a control to
  sometimes not become invisible when the control style was set to 1
  (invisible) with request code 3 (add style).  The problem usually appeared
  when controls overlapped.


WB 2003F  Mar 4, 2003


DLL 4.0fda  First showing up in WB 2003F

  New Functions:

    BinaryPeekHex(i:handle, i:offset, i:count)
      Extracts data from a binary buffer as a hex string.

    BinaryPokeHex(i:handle, i:offset, i:hex-string)
      Writes data in hex string form into a binary buffer.

  Fixed problem assigning an array to itself.


WB 2003G  Apr 23, 2003

  WinBatch now returns one of the following exit codes to indicate a startup
  error:

    Code  Meaning
    ----  -------
     255  StartServiceCtrlDispatcher failed (service)
     254  RegisterServiceCtrlHandler failed (service)
     253  expired beta version
     252  beta copy -- user cancelled warning dialog
     251  RegisterClass failed
     250  CreateWindow failed
     249  DLL(s) not found or created (compiled script)
     248  Batch DLL initialization error
     247  RegisterClass failed (entering shutdown mode)
     246  CreateWindow failed (entering shutdown mode)


DLL 4.0gda  First showing up in WB 2003G

  New functions:

    ArrayFileGet(s:filename [, s:null-char [, i:extra-alloc]])
      Converts a file to a one-dimension array.

    ArrayFileGetCsv(s:filename, i:flags [, s:delimiter [, i:extra-rows [, i:extra-cols]]])
      Converts a CSV file to a two-dimension array.

    ArrayFilePut(s:filename, a:array [i:write-undef])
      Writes a one-dimension array to a file.

    ArrayFilePutCsv(s:filename, a:array [, s:delimiter [, i:write-undef]])
      Writes a two-dimension array to a file.

    FileGet(s:filename [, s:null-char])
      Converts a file to a string variable.

    FilePut(s:filename, s:string)
      Writes a string to a file.

  OLE object names can now be 30 characters long (was 29).

  OLE method and property names can now be 256 characters long (was 29).

  Fixed a problem with AskItemList crashing in some cases when more than 64K
  of data was returned from a multiple-selection listbox.

  Fixed a problem with DebugTrace(2) dumping the variable table when a UDF
  returned.

  In AppExist, AppWaitClose, and IntControl(56), changed the method used to
  handle the "current-session-only" flag.  Note that if "current-session-only"
  is @TRUE, then "program-name" will be treated as a file name and not a
  module name.  If "program-name" includes an extension, then it will have
  to match the filename of a running process in the current session.  If
  "program-name" does not include an extension, then only the root parts of
  the file names will have to match.  Any path information is ignored.

  ParseData no longer has a limit of 9 parameters.  The tenth parameter now
  gets stored as "param10", etc.

  There is no longer a limit of 9 command-line parameters.  The tenth
  parameter now gets stored as "param10", etc.

  Arrays created in a UDF are now freed automatically when the UDF returns.

  In RunWithLogon, you can now specify "." for "domain" in Windows 2000.

  Added new "flags" values to AskDirectory:

    Flag   Meaning
    ----   -------
      4    Use the new user interface.
      8    Do not include the "New Folder" button in the browse dialog box.

  Selecting Cancel in a Debug dialog now ends the program even if it was in
  a called script.

  Changes to the Dialog function and related functions:

    Change how the dialog function accesses the Windows Common Control
    dynamic link library so that user of Windows NT 3.51 can install and run
    WinBatch.

    Fixed bug that caused floating point numbers to be incorrectly displayed
    by controls when the number was assigned to the control's associated
    variable before calling the "Dialog" function.

    Fixed bug that caused 3097 error on dialog exit when a dialog template
    contained a ITEMBOX control and "IntControl(33)" was called inside the
    dialog procedure to change from single to multi-select list boxes.

    Fixed problem with default button style (again). Default button style
    was being ignored and the first button on the dialog with any style set
    was getting the default designation.

    Added new "No Auto Height Resizing" (256) style for ITEMBOX and
    FILELISTBOX controls. The style turns off the automatic height
    adjustment that occurs to prevent the last visible item form being just
    partially displayed.


Dialog Editor 2003G  First showing up in WB 2003G

  Fixed bug that allowed controls from a previous template to appear in a
  new template loaded from a file. In order for this bug to occur the new
  template need to have an incorrect number of controls specified in the
  "NumControls" dialog variable and the new dialog needed to have the same
  dialog variable name as the previous dialog.

  Fixed bug that sometimes caused invalid values to be written to the
  <dialogvariable>Configuration line of dialog templates.

  Added new "No Auto Height Resizing" (256) style to ITEMBOX and FILELISTBOX
  control's style property pages.


Windows NT extender 39002  First showing up in WB 2003G

  The wntShare*() functions have been updated to accept 2 new types of
  shares.  It is now possible to add & delete IPC shares [share type = 3] and
  Special shares [share type = 2147483648].  Please note that when adding
  Special shares like "ADMIN$" it is necessary to specify an empty string as
  the resource name; WinNT/2K/XP will take care of associating the proper
  resource name with the special share name.


WB 2003H  May 8, 2003

  Added compiler setting to enable large EXE's to extract files on removable
  drives.


DLL 4.0hda  First showing up in WB 2003H

  Fixed a problem with flag 4 in AskDirectory.

  "Line too long" errors can now be trapped with IntControl(73).

  In AppExist, AppWaitClose, and IntControl(56), fixed a problem using the
  "current-session-only" flag while specifying a "program-name" without an
  extension.

  Changes to the Dialog function and related functions:

    Added two new styles for VARYTEXT and STATICTEXT controls.  The "Center
    Text" (512) style centers text in the control's rectangle.  The "Right
    Text" (1024) style places the text flush with the right side of the
    control's rectangle.


Dialog Editor 2003H  First showing up in WB 2003H

  Fixed bug that allowed controls from a previous template to appear in a
  new template loaded from a file when a new dialog was created between
  loading the two templates from a file or the clipboard.

  Fixed bug that allowed controls to be expanded outside the bounding dialog
  when using the shift key in combination with the arrow keys.

  Improved tracking of "undo" modification so the "Save" toolbar button and
  menu option are not left enabled when all changes have been undone.

  Added control id number to the title of control's properties sheet.  This
  is the number that uniquely identifies a control in a user's Dialog
  procedure.

  Added two new styles to VARYTEXT and STATICTEXT controls property pages.
  The "Center Text" (512) style centers text in  the control's rectangle.
  The "Right Text" (1024) style places the text flush with the right side of
  the control's rectangle.


WB 2003J  Jun 30, 2003

  Fixed IntControl(1009).


DLL 4.2jdb  First showing up in WB 2003J

  ParseData no longer has a limit of 256 characters for each parameter.

  Added an error check for a #DefineFunction (or #DefineSubroutine) without
  a matching #EndFunction (or #EndSubroutine).

  Fixed problem passing an array to a #DefineSubroutine where the UDF
  parameter name was the same as the existing array variable name.

  In the following functions, "delimiter" may not be a carriage return or
  line feed.  It may now be a tab, in which case tabs will not be treated
  as whitespace:

    ArrayFileGetCsv
    ArrayFilePutCsv
    ItemCountCsv
    ItemExtractCsv

  In ItemRemove and ItemReplace, you can now specify -1 for "index" to
  represent the last item in the list.

  ArrayFilePutCsv now doubles any existing quote marks.

  Named parameters in OLE are no longer limited to 255 characters.

  Added an optional parameter to ArrayFilePutCsv:

    ArrayFilePutCsv(s:filename, a:array [, s:delimiter [, i:write-undef [, i:flags]]])

  Changes to the Dialog function and related functions:

    Fixed bug that prevented dialogs from being displayed on a secondary
    monitor of multi-monitor systems when the secondary monitor it to right
    or above the primary monitor.

    Added error checking that detects and declines to load any dialog
    template with an inverted dialog window rectangle.


Dialog Editor 2003J  First showing up in WB 2003J

  Added a warning message during the template loading processing that is
  displayed when an empty or inverted dialog window rectangle is detected.

  Removed restriction on a dialog window's origin (position) that did not
  permit coordinates of less than -1.

  Added detection of WIL operators and arrays in control variable names.  An
  error message is generated if an attempt is made to add one of these
  characters to variable name using the "General" property page.  If an
  offending character is found while loading a template from file or
  clipboard, a warning is displayed and the control is not used in the
  dialog.

  Standardized tab order of controls in and added missing accelerator keys
  to attribute property pages.

  Removed disabling of edit boxes and push buttons on the "Background" and
  "Text Appearance" property pages when the "Use Default ..." check box is
  checked.  The check box is automatically unchecked when values are
  modified by the user.


WinInfo 2.1a  First showing up in WB 2003J

  Changed the way top-level windows are identified.


WB 2003K  Nov 19, 2003

  In IntControl(1007), if "p1" == 3 (suspend script), then "p2" now
  specifies a timeout value in milliseconds after which the script will
  automatically continue.  If "p2" == 0, there is no timeout.

  If a BoxDataClear error was suppressed, it could cause the program to hang.

  Fixed a problem with the compiler not handling nested "#include"
  directives properly.


DLL 4.3kdc  First showing up in WB 2003K

  New functions:

    BinaryBufInfo(i:handle, i:request)
      Returns information about a binary buffer.

    FileBaseName(s:filename [, i:add-dot])
      Returns the base part of a filename.

    WaitForKeyEx(s:key-codes, f:timeout)
      Waits for a specific key to be pressed.

  New IntControl:

    IntControl(87, p1, 0, 0, 0)
      Sets Execute recovery mode.

  Fixed problem with the "flags" parameter in ArrayFilePutCsv.

  Fixed problem with "For" statements where "initial-value" was a complex
  expression.

  Fixed problem with AskDirectory flag 4 not being ignored in Windows 95/98.

  Added new request to ArrInfo:

    Request   Returns
    -------   -------
      -1      @TRUE if "array" is an array, @FALSE otherwise.

  AskDirectory now resolves names typed in the edit box that begin with a '.'
  (but this does not work properly on older platforms such as Windows 95).

  Fixed a problem if an omitted OLE positional parameter was followed by a
  quoted string constant.

  OLE calls now return an error if the object pointer has become invalid.

  Added an optional parameter to Debug:

    Debug(i:mode [, s:init-string])

  MsgTextGet now accepts a Window ID for the window name parameter.

  WaitForKey now yields a bit more processor time.

  Added an optional parameter to WinWaitClose:

    WinWaitClose(s:partial-winname [, i:timeout])

  FileGet now supports Unicode files.

  Fixed a problem with the notification message set via IntControl(12) not
  working from within a UDF.

  FileTimeGetEx now strips off any trailing backslash in "filename".

  IntControl(22) now returns the actual value returned by the call to the
  SendMessage API.

  IntControl(23) now returns @TRUE on success and @FALSE on failure.

  When using IniItemizePvt to list section names in a file, and the
  specified file name doesn't contain path information, it no longer looks
  for the file in any directory other than the Windows directory.

  Changes to the Dialog function and related functions:

    The optional second parameter of the Dialog function now works properly
    if it's a string that represents an integer.

    Fixed bug that caused individual radio button control styles to be
    ignored when the buttons were group via a common control variable.  All
    buttons were using the style of the button of the group with the lowest
    tab order number.

    Fixed bug that caused GP Fault on Windows 9x based machines when a PUSH
    BUTTON control was specified without text.  Crash occurred when an ATL +
    "key" combination was pressed while a dialog had the input focus.

    Fixed bug that caused a PUSHBUTTON control's text to shift when the
    button's text contained an ampersand (&) and the button was disabled
    inside a User Defined Dialog procedure.

    Changed "DialogProcOption" option 9 (call User Defined Dialog procedure
    on calendar control data change) to call the user dialog procedure when
    an implicit date change occurs.  Implicit data changes are performed by
    clicking one of the control's arrows or right clicking on the month or
    year.


WinInfo 2.1b  First showing up in WB 2003K

  Fixed language string localization problem.


WILX extender 39001  First showing up in WB 2003K

  Fixed problem with xBaseConvert and xHex converting values equal to -2.


WB 2004A  Jan 9, 2004


DLL 4.4add  First showing up in WB 2004A

  FileRead in buffered mode wasn't stripping Ctrl-Z characters, if present.

  The AskFileName dialog can now be resized in Windows 98/ME/2000/XP.

  When processing goes to a Cancel or Error handler routine, the WIL variable
  "wberrorhandlerfile" is now set to the name of the currently-executing script.

  Changes to the Dialog function and related functions:

    Fixed bug that prevented a User Defined Dialog Procedure from being
    called for dialogs with one or more DROPLISTBOX  controls even though
    selection change calls were requested ("DialogProcOptions" request code
    8).  This problem occurred if the DROPLISTBOX control had the list only
    style(4) and a user selected a list item by pressing the keyboard key
    associated with the first character of the item.

    Add "DialogControlGet" option (16) which retrieves the control number of
    the radio button with the dot or zero (0) if no radio button of a group
    has the dot.

    Changed EDITBOX, MULTILINEBOX, SPINNER, and DROPLISTBOX controls to
    retain their user specified background color when disabled.


WB 2004B  May 19, 2004

  Increased maximum variables from 1,000 to 2,000.

  The command-line parameter string passed to WinBatch is no longer
  truncated at 255 characters.

  Fixed a problem with BoxDrawText hanging with "alignment" mode 32.


DLL 5.1bea  First showing up in WB 2004B

  Revised the OLE interface.  No longer uses a separate DLL for OLE calls.
  Among the many OLE improvements:

    There is no longer a fixed limit on the number of open OLE objects.

    You can now specify multi-level OLE objects, eg, App.Document.Title.

    You can now assign values to parameterized OLE properties, eg,
    App.Info("Author") = "John Doe".

    Added support for many more OLE types, including arrays.

  Changed the DLL name suffix from "34I" to "44I".

  New functions:

    CreateObject(s:object-name/proj-id [, s:remote-server])
    GetObject([s:moniker/filename] [, s:proj-id/object-name])
    ObjectCreate(s:object-name/proj-id [, s:remote-server])
    ObjectGet([s:moniker/filename] [, s:proj-id/object-name])

    FileAttrGetEx(s:filename)
      Gets file attributes (extended).

      The return value is a bitmask comprised of one or more of the following
      integer values, combined using the bitwise OR ('|') operator:

        Value     Name                 Meaning
        -----     ----                 -------
            1     READONLY             The file or directory is read-only.  Applications can
                                       read the file but cannot write to it or delete it.
                                       In the case of a directory, applications cannot delete it.

            2     HIDDEN               The file or directory is hidden.  It is not included
                                       in an ordinary directory listing.

            4     SYSTEM               The file or directory is part of, or is used
                                       exclusively by, the operating system.

           16  *  DIRECTORY            Identifies a directory.

           32     ARCHIVE              The file or directory is an archive file or directory.
                                       Applications use this attribute to mark files for
                                       backup or removal.

          128     NORMAL               The file or directory has no other attributes set.
                                       This attribute is valid only if used alone.

          256     TEMPORARY            The file is being used for temporary storage.  File
                                       systems avoid writing data back to mass storage if
                                       sufficient cache memory is available, because often
                                       the application deletes the temporary file shortly
                                       after the handle is closed.  In that case, the system
                                       can entirely avoid writing the data.  Otherwise, the
                                       data will be written after the handle is closed.

          512  *  SPARSE_FILE          The file is a sparse file.

         1024  *  REPARSE_POINT        The file or directory has an associated reparse point.

         2048  *  COMPRESSED           The file or directory is compressed.  For a file, this
                                       means that all of the data in the file is compressed.
                                       For a directory, this means that compression is the
                                       default for newly created files and subdirectories.

         4096     OFFLINE              The data of the file is not immediately available.
                                       This attribute indicates that the file data has been
                                       physically moved to offline storage.  This attribute
                                       is used by Remote Storage, the hierarchical storage
                                       management software.  Applications should not
                                       arbitrarily change this attribute.

         8192     NOT_CONTENT_INDEXED  The file will not be indexed by the content indexing
                                       service.

        16384  *  ENCRYPTED            The file or directory is encrypted.  For a file, this
                                       means that all data streams in the file are encrypted.
                                       For a directory, this means that encryption is the
                                       default for newly created files and subdirectories.

      The values with an asterisk next to them cannot be set using FileAttrSetEx.

    FileAttrSetEx(s:file-list, i:attributes, i:mode)
      Sets file attributes (extended).

        "attributes" specifies the attributes to apply to the specified
        file(s).  See FileAttrGetEx for information on the attribute values
        (and note that values with an asterisk next to them cannot be set
        using FileAttrSetEx).

        "mode" specifies the method by which "attributes" are applied to
        the specified file(s), and can be one of the following:

           0  "attributes" replaces the existing file attributes
           1  "attributes" are added to the existing file attributes
          -1  "attributes" are removed from the existing file attributes

      Returns @TRUE on success, or @FALSE if unable to change the
      attributes on any of the specified files.

    DirAttrGetEx(s:dirname)
      Gets directory attributes (extended).

      This function is like FileAttrGetEx, but operates on directories
      instead of files.

    DirAttrSetEx(s:dir-list, i:attributes, i:mode)
      Sets directory attributes (extended).

      This function is like FileAttrSetEx, but operates on directories
      instead of files.

    StrCnt(s:string, s:sub-string, i:start-pos, i:end-pos, i:flags)
      Counts the occurrences of a substring within a string.

        "string" specifies the main string.

        "sub-string" specifies the substring to search for within "string".

        "start-pos" specifies the position in "string" at which to begin
        searching, or -1 to indicate the end of the string.  The first
        character of the string is at position 1.

        "end-pos" specifies the position in "string" at which to end
        searching, or -1 to indicate the end of the string.  The first
        character of the string is at position 1.  Note that if the string
        begins at or before "end-pos" and continues past "end-pos", it will
        be counted.

        "flags" can be set to 0, or can specify one or more of the following
        values combined with the bitwise OR ('|') operator:

          Value   Meaning
          -----   -------
            1     match case

      Returns the number of occurrences.

    SoundVolume(i:level)
      Sets the speaker volume.

        "level" specifies the volume level, from 0 (min) to 100 (max), or -1
        to return the current volume level without changing it.

      Returns the previous volume level.

    RegQueryQword(i:handle, s:subkey-string)
      Returns QWORD value at subkey position.

      The value is returned as a space-delimited string of hex bytes,
      beginning with the low byte of the QWORD.

    RegSetQword(i:handle, s:subkey-string, s:value)
      Sets a QWORD value in the Registration Database.

      The value is specified as a space-delimited string of hex bytes,
      beginning with the low byte of the QWORD.

      Returns 1.

    DllCallCdecl(dllname, returntype:epname [,paramtype:parameter ...] )
      Calls an external DLL using the Cdecl calling convention.

      This function is the same as DllCall, except it calls DLL functions
      using the Cdecl calling convention, rather than the StdCall calling
      convention which most Win32 DLL's use.

    BinaryAllocArray(a:array)
      Converts an array to a binary buffer.

      This replaces part of the functionality of (obsolete) IntControl(83).

      Returns a binary buffer handle.

    FileInfoToArray(s:file-list [, i:flags])
      Returns information on a set of files, as an array.

        "file-list" specifies a list of filenames, which may be wildcarded.

        "flags" can be set to 0, or can specify one or more of the following
        values combined with the bitwise OR ('|') operator:

          Value   Meaning
          -----   -------
            1     Return file sizes as huge numbers.  This is a long decimal
                  number string, which may represent a number too large to
                  be converted to an integer.

            2     Return file names with full paths

      This function creates and returns a 2-dimension array.  There are
      [n + 1] rows in the array, where 'n' is the number of files that were
      returned.  Each row has 7 columns.  The first row (row 0) is a header
      containing summary information.  Each subsequent row contains
      information about one returned file.  The columns are as follows:

      Header row:

        Column  Value
        ------  -----
           0    number of files returned
           1    total size of files returned
          2-6   (unused, set to 0)

      Other rows:

        Column  Value
        ------  -----
           0    file name
           1    file size
           2    file last modified time, in YmdHms format
           3    file last accessed time, in YmdHms format
           4    file created time, in YmdHms format
           5    file attribute string in the form "RASH" (see FileAttrGet)
           6    file attribute bitmask (see FileAttrGetEx)

    DirInfoToArray(s:dir-list [, i:flags])
      Returns information on a set of directories, as an array.

        "dir-list" specifies a set of sub-directory names, which may be
        wildcarded.

      This function is like FileInfoToArray, but returns information on
      directories instead of files.  See FileInfoToArray for more
      information.  Note that all sizes (column 1) for directories will be 0.

    ObjectConstantsGet(r:object)
      Creates a Constants object.

        (r) object reference: COM object reference.

      Returns:
        (r) constants reference: Constants object reference.

      Use this function to create a constants object for a COM Automation object:

        adoApp = ObjectCreate("ADODB.Connection")
        adoConst = ObjectConstantsGet(adoApp)

      The function will produce an error, if the supplied parameter is not a
      COM object or is a COM object that does not have any associated
      constants.

      A constants object is a special WIL language construct that allow you
      to access the constant values associated with a COM object by name.
      You access values by using the constants.name syntax where constants
      is the name of the variable holding this function’s return and name is
      the name of constant whose value you wish to use.  For instance, if
      the constants object from the example above is used, then

        conVal = adoConst.adBSTR

      assigns the value of the constant adBSTR to the variable conVal.  In
      this case, the constant adBSTR has the value eight(8), so after the
      assignment the variable conVal will hold the number 8.

      You can use the constants.name syntax anywhere you would use a
      literal.  This includes using it as an object method parameter, as the
      right-hand-side of an object property assignment, and in relational
      and arithmetic expressions.  You cannot, however, assign a new value
      to an individual constant name.  They are in effect read-only.

      NOTE: This function may have an impact on the performance of you
      scripts.  Some COM objects have thousands of constants and you may
      experience a small delay while the function collects the constants’
      names and values.

    ObjectConstToArray(r:constants)
      Creates an array of Constants object names and values.

        (r) constants: Constants object reference.

      Returns:
        (a) constants array: Two dimensional array of constants names and values.

      ObjectConstToArray creates an array that contains the textual names
      and numeric values of a constants object:

        adoApp = ObjectCreate("ADODB.Connection")
        adoConst = ObjectConstantsGet(adoApp)
        aConstants = ObjectConstToArray(adoConst)

      This function can be used during the script writing process to examine
      the contents of a constants object obtained using the
      ObjectConstantsGet function.

      Note: Refer to the ObjectContantsGet documentation for details about
      constants object.

      The returned array has two dimensions.  There is one row for each
      constant and two columns for each row.  The first column contains the
      string name of a constant and the second column contains the value of
      the constant.  The  name is the same one used following the dot (.) in
      the constants.name syntax and the value is the same one returned by
      constants.name.

      In addition, row zero column zero of the array contains the number of
      constants stored in the array. Using the example above, the number of
      constants is obtained with:

        nNumberOfConstants = aConstants[0,0]

      The name of the first constant stored in the array is accessed with:

        sName = aConstants[1,0]

      And the first value is accessed with:

        nValue = aConstants[1,1]

  New structure operator:

    ForEach

  Object handles are now represented as variants instead of integers.  This
  affects the following functions which take object handles as parameters:

    ObjectClose
    ObjectCollectionClose
    ObjectCollectionNext
    ObjectCollectionOpen
    ObjectType

  IntControl(77, 61) is now obsolete, and will return -1.

  There is no longer a limit of 65,535 elements per array dimension.  Arrays
  can now contain at least 10 million total elements, although this may be
  constrained by available memory.  The current limit is actually more than
  100 million elements, but this is subject to reduction in future versions.

  Changed the default internal file buffer size, which controls the maximum
  supported file line length for the following functions:

      ArrayFileGet
      ArrayFileGetCsv
      AskFileText
      FileRead

    By default, the allocated buffer size will be between 4K and 32K
    according to a "smart size" method, based on the file size.  As before,
    you can change the default buffer size using IntControl(65).

  IntControl(65) is revised as follows:

    P1   Meaning
    --   -------
    -1   Don't change (just return current setting)
    -2   Smart size (default)
     0   Don't buffer file reads - max line length limited by generic buffer (currently 1280 bytes)
    ##   Any other positive value specifies the actual buffer size

  IntControl(83) is now obsolete.  See BinaryAllocArray.

  Increased the maximum number of UDF's from 200 to 512.

  Attempting to redefine an existing UDF will no longer count against the
  maximum allowed.  The second definition will be silently ignored.

  Changed IntControl(76) to work properly under Windows 2000/XP.

  Fixed a problem with BinaryStrCnt where "start-offset" and "end-offset"
  were the same.  Also note that if the string begins at or before
  "end-offset" and continues past "end-offset", it will be counted.

  Added support for new "type" to RegQueryEx and RegSetEx:

    Value  Meaning
    -----  -------
      11   (REG_QWORD) 64-bit number

  DllCall now supports 'double' (64-bit floating point value) as a return
  type and parameter type.

  Added new "flags" value to AskDirectory (maybe just temporary/experimental):

    Flag   Meaning
    ----   -------
     16    Suppress "drive not ready" errors

  FileDelete was returning an error if the specified partial file name
  existed in another directory on the path.

  There is no longer a 1 MB limit for the size of the list returned by
  DirItemize, FileItemize, or FileItemPath.

  The following functions were returning a blank string instead of a 0 in
  huge number mode:

    DirSize
    DiskSize
    FileSize
    FileSizeEx

  When processing goes to a Cancel or Error handler routine, the WIL variable
  "wberrortextstring" is now set to the description of the WIL error, and
  "wberroradditionalinfo" is set to the additional error information, if any.

  When a minor error is suppressed with ErrorMode(@OFF), the following WIL
  variables are now automatically set:

    Variable                  Type     Meaning
    --------                  ----     -------
    wberrorhandlerline        string   error line (ie, line in script that caused error)
    wberrorhandleroffset      integer  offset into script of error line, in bytes
    wberrorhandlerassignment  string   variable being assigned on error line, or "" if none
    wberrorhandlerfile        string   name of the currently-executing script
    wberrortextstring         string   description of the error
    wberroradditionalinfo     string   additional error information, if any

  Increased the maximum command line length for Run-type functions to 8192 bytes.

  Changes to the Dialog function and related functions:

    Added work around for WinXP bug that caused WB crash, if a script is
    canceled from a DROPLIST change procedure event associated with a
    DROPLIST control with the "List Only" style.

    If a Dialog callback returns a non-integer value, it will be converted
    to an integer if possible.


WB 2004C  May 24, 2004


DLL 5.2ceb  First showing up in WB 2004C

  Changes to the Dialog function and related functions:

    Changed text limits of EDITBOX and MULTILINEBOX controls.  The new limit
    for EDITBOX controls on Windows 95/98/Me is unchanged but for
    MULTILINEBOX controls it is increased to approximately 65535 characters.
    The new limit for EDITBOX controls on Windows NT4/2000/XP/2003 is
    increased to the lesser of approximately 2147483646 characters or
    available memory and for MULTILINEBOX controls on Windows
    NT4/2000/XP/2003 it is increased to available memory.


WB 2004D  Jun 18, 2004

  New function:

    DirScript()
      Returns the directory of the current WinBatch program.

      If the current WinBatch script is a child program that was called with
      the Call() function, this function will return the directory of the
      main (calling) program.

  Fixed a problem with using BoxDestroy in a Dialog callback.


DLL 5.2deb  First showing up in WB 2004D

  When processing goes to a Cancel or Error handler routine, the WIL variable
  "wberrorinsegment" is now set to the name of the currently-executing UDF,
  or a blank string ("") if not in a UDF.

  When processing goes to a Cancel or Error handler routine, the WIL array
  variable "wberrorarray" is now created with the following elements:

    wberrorarray[0]  =  LastError()
    wberrorarray[1]  =  wberrorhandlerline
    wberrorarray[2]  =  wberrorhandleroffset
    wberrorarray[3]  =  wberrorhandlerassignment
    wberrorarray[4]  =  wberrorhandlerfile
    wberrorarray[5]  =  wberrortextstring
    wberrorarray[6]  =  wberroradditionalinfo
    wberrorarray[7]  =  wberrorinsegment

  When processing goes to a Cancel or Error handler routine after an
  extender error or a user-defined error, "wberrortextstring" is now set to
  a more specific value.

  Fixed crash bug that resulted from returning a very large BSTR Variant
  from a user defined function after the Variant had been assigned to a local
  UDF variable.  User defined subroutines were not affected by this bug.

  Improved detection of misplaced Continue and Break statements.

  Fixed a problem with FileInfoToArray and DirInfoToArray, where the 100th
  file would be missing from the output list, and there would be an extra
  entry at the end of the list.


WILX extender 39004  First showing up in WB 2004D

  New function:

    xEnumStreams(s:filename, i:flags) (Windows NT/2000/XP only)
      Enumerates named streams in a file.

        "filename" specifies the name of a file which may contain streams.

        "flags" can be set to 0, or can specify one or more of the following
        values combined with the bitwise OR ('|') operator:

          Value   Meaning
          -----   -------
            1     Return stream sizes as huge numbers.  This is a long
                  decimal number string, which may represent a number too
                  large to be converted to an integer.

      This function creates and returns a 2-dimension array.  There are
      [n] rows in the array, where 'n' is the number of named streams in the
      file.  Each row has 4 columns.  Each row contains information about
      one returned stream.  The columns are as follows:

        Column  Value
        ------  -----
           0    stream name
           1    stream size
           2    stream type -- one of the following values:

                  Value   Meaning
                  -----   -------
                    1     Standard data
                    2     Extended attribute data
                    3     Security descriptor data
                    4     Alternative data streams
                    5     Hard link information
                    6     Property data
                    7     Objects identifiers
                    8     Reparse points
                    9     Sparse file

           3    stream attributes -- zero or more of the following values:

                  Value   Meaning
                  -----   -------
                    1     Stream contains data that is modified when read
                    2     Stream contains security data


WB 2004E  Jul 9, 2004


DLL 5.3eec  First showing up in WB 2004E

  Enhanced the file search routine used by many functions (such as
  FileLocate) to find files in directories that were added to the path in
  the current process.

  Fixed a problem passing variants to older extenders.


WB 2004F  Jul 29, 2004

  In IntControl(1007), if "p1" == 3 (suspend script), it now resets the
  "clicked" state to 0 right before the function returns.


DLL 5.4fed  First showing up in WB 2004F

  If IgnoreInput is enabled, it will be temporarily disabled when using
  SendKey (and SendKeysTo and SendKeysChild) to send an Alt key combination
  in Windows 2000 and XP.

  Changes to the Dialog function and related functions:

    Fixed a problem with Dialog callback crashing when returning a string
    that could not be converted to an integer.

    Fixed bug that caused the User Defined Dialog Procedure's return value
    to be ignored when the procedure was returning from processing DROPLIST
    change event.  The return value was instead always set to 0.


WB 2004G  Nov 29, 2004


DLL 5.5gee  First showing up in WB 2004G

  Increased the maximum script line length from 255 to 2048 characters.

  Fixed a problem with ClipPut and ClipAppend failing with more than 64K of data.

  Fixed a problem with FileCopy, FileMove, FileCopyAttr, and FileMoveAttr,
  if an overwrite warning dialog was displayed, and one of the file names
  contained an ampersand, the file name would not be displayed correctly.

  You can now obtain the exit code of an application that is launched with
  the RunShell function by specifying @GETEXITCODE as the "waitflag".  This
  is the same as specifying @WAIT, except that on success the function will
  return the exit code of the application that was launched.

  Added an optional parameter to RegQueryDword:

    RegQueryDword(handle, subkey-string [, flags])

      If "flags" is 1, the registry value will be returned in hexadecimal
      format.  If "flags" is 0 (or omitted), the registry value will be
      returned in decimal format.

  Added an optional parameter to RegSetDword:

    RegSetDword(handle, subkey-string, value [, flags])

      If "flags" is 1, "value" will be treated as a hexadecimal number.  If
      "flags" is 0 (or omitted), "value" will be treated as a decimal number.
      Note that "value" must be a delimited string if it contains any letters.

  RegQueryDword no longer returns values larger than 2147483647 as negative
  numbers.

  IsFloat, IsInt, and IsNumber now support non-string variables.

  Added an additional parameter to IntControl(73):

    IntControl(73, p1, p2, 0, 0)

      p2 is a @TRUE/@FALSE flag specifying whether any existing
      "wberroradditionalinfo" data should be cleared first.

  The "wberroradditionalinfo" variable (which is set when processing goes to
  a Cancel or Error handler routine) is now a delimited string if it
  contains more than one incident.  The delimiter character is an ASCII 160.

  When processing goes to a Cancel or Error handler routine:

    The WIL variable "wberrorhandlerlinenumber" and the WIL array variable
    wberrorarray[8] are now set to the line number in the script where the
    error occurred, or 0 if the error can't be matched to a particular line.
    If wberrorarray[10] is set to 0 or -1 (see below), these values may not
    be accurate, especially if the error occurred in a UDF.

    If the error occurred in a UDF, the WIL array variable wberrorarray[9]
    is now set to the line number in the UDF where the error occurred (when
    the line after the #DefineFunction statement is considered to be line 1).
    If the error didn't occur in a UDF, wberrorarray[9] is set to 0.

    The WIL array variable wberrorarray[10] is set to a positive integer if
    the reported line numbers (see above) can be considered accurate, or 0
    if the line numbers may be inaccurate because the error occurred in an
    encoded script that had already been pre-processed by an older version
    of the compiler which removed blank lines and comment lines and merged
    in #include files, or -1 if the script is being run from an application
    (such as WinBatch Studio) that doesn't do file pre-processing so that
    consequently if an error occurs in a UDF the line numbers are relative
    to the beginning of the UDF instead of the beginning of the file.

  Fixed a problem with FileTimeGetEx and FileYmdHms on an NTFS partition, if
  the file time had 59 seconds, the minute would be off by one.

  IniRead and IniReadPvt now support strings up to 65,535 characters, if
  supported by the operating system.

  Fixed a problem with FileGet and Unicode files, where there could be extra
  data at the end of the returned string.

  Changes to the Dialog function and related functions:

    Fixed crash bug that occurred when an error was detected in a user
    dialog procedure while processing a text change notification(5) from a
    MULTILINEBOX. (Windows XP only.)

    Added new option to DialogProcOptions function. Option 1002 provides
    control over system menu button display in the dialog's title bar.  The
    function's third parameter can be set to 0 for no buttons, 1 for close
    button, 2 for close and minimize button, 3 for close and maximize
    button, and 4 for all three buttons. -1 will return current setting.

  Changes to OLE support:

    Fixed problem that caused a "Type Mismatch" error when attempting to
    assign a connection string to the ActiveConnection property of the ADO
    recordset object.

    Fixed problem with handling zero length string when passed to certain
    object methods.

    Added conversion of object method parameters from WIL arrays to variant
    arrays when parameter's variant type is not known. This is necessary for
    some WMI and ADSI methods that do not specify their parameter's types.

    Changed default handling of property assignment for objects that do not
    provide type information. Addresses problem encountered with Lotus
    Notes' non-standard implementation of property assignment.


WB 2005A  Jan 6, 2005

  Compiler now sets "CompileTime" version string to time of compilation.


DLL 5.6aef  First showing up in WB 2005A

  New functions:

    PipeServerCreate(s:pipe-name, i:timeout) (Windows NT/2000/XP/2003 only)
      Creates an instance of a named pipe and waits for a client to connect.

        "pipe-name" specifies the name of a pipe, in the form:

          \\.\pipe\PipeName

        "timeout" specifies the timeout period in seconds, or -1 for no timeout.

      This function creates a pipe and then waits "timeout" seconds for a
      client to connect.

      A maximum of 100 instances of a pipe can be created.

      Returns a pipe handle on success, or "*TIMER*".

    PipeServerRead(i:pipe-handle:, i:timeout)
      Reads a message from a named pipe.

      Returns a message string on success, or "*ERROR*" or "*TIMER*".

    PipeServerWrite(i:pipe-handle, s:data)
      Writes a message to a named pipe.

      Returns 1 on success, or "*ERROR*".

    PipeServerClose(i:pipe-handle, i:timeout)
      Closes a named pipe instance.

      If there is a client connected to the pipe, the function will wait
      "timeout" seconds for the client to close its end of the pipe.

      Returns 1 on success, or "*TIMER*".

    PipeClientOpen(s:pipe-name, i:timeout)
      Connects to a named pipe.

        "pipe-name" specifies the name of a pipe, in one of these forms:

          \\ServerName\pipe\PipeName
          \\.\pipe\PipeName

        "timeout" specifies the timeout period in seconds, or -1 for no timeout.

      Returns a pipe handle on success, or "*TIMER*".

    PipeClientSendRecvData(i:pipe-handle, s:data, i:read-timeout)
      Writes a message to a named pipe and then reads a message back.

      Returns a message string on success, or "*ERROR*" or "*TIMER*".

    PipeClientClose(i:pipe-handle)
      Closes a named pipe connection.

      Returns 1.

    PipeInfo(i:request, i:pipe-handle)
      Returns information about a pipe or pipe operation.

        Request   Returns
        -------   -------
           0      Error code for last unsuccessful pipe function ("pipe-handle" is ignored)

    IconExtract(s:filename, s:iconfilename, i:index)
      Extracts an icon group from an EXE/DLL.

        "filename" specifies the name of the EXE or DLL from which the icon
        group will be extracted.

        "iconfilename" specifies the name of the ICO file to which the icon
        group will be written.  If the file exists, it will be overwritten.

        "index" specifies the ordinal position in "filename" of the icon
        group to be extracted, where the first icon group is 1.

      Returns the number of images in the icon group that was extracted.

    IconInfo(s:filename, i:filetype)
      Returns information about the icons in an EXE/DLL or ICO file.

        "filename" specifies the name of the file from which the icon
        information will be returned.

        "filetype" specifies the type of file:

          0 = EXE or DLL (Win32)
          1 = ICO file

      The icon information is returned as an array.

      For filetype 0, the array is a three-dimension array in the following format:

        arr[0,0,0] = number of icon groups in the file

        arr[1,*,*] = icon group 1
        arr[2,*,*] = icon group 2 (if any)
        etc.

        For each icon group 'x':

          arr[x,0,0] = number of icon images in the group
          arr[x,0,1] = the string "WIDTH"
          arr[x,0,2] = the string "HEIGHT"
          arr[x,0,3] = the string "COLOR DEPTH"

        Then, for each icon image 'y' in the group:

          arr[x,y,0] = image index, where the first image in the group is 1
          arr[x,y,1] = image width, in pixels
          arr[x,y,2] = image height, in pixels
          arr[x,y,3] = image color depth, in bits

      For filetype 1, the array is a two-dimension array in the following format:

        arr[0,0] = number of icon images in the file
        arr[0,1] = the string "WIDTH"
        arr[0,2] = the string "HEIGHT"
        arr[0,3] = the string "COLOR DEPTH"

        arr[1,*] = icon image 1
        arr[2,*] = icon image 2 (if any)
        etc.

        For each icon image 'x':

          arr[x,0] = image index, where the first image in the file is 1
          arr[x,1] = image width, in pixels
          arr[x,2] = image height, in pixels
          arr[x,3] = image color depth, in bits

  Added a new parameter to IntControl(35):

    IntControl(35, p1, p2, 0, 0)

      p2 = amount of time to delay in MouseClick and MousePlay between
      pressing and releasing the mouse button for a single click (not a
      double-click), in milliseconds.  Default is 0 (no delay).

  Added an optional parameter to IconReplace:

    IconReplace(s:filename, s:iconfilename [, i:index])

      "index" specifies the ordinal position of the icon group to modify,
      where the first icon group is 1.

  EndSession and IntControl 66/67/68 now set the shutdown reason code to
  "Application: Maintenance (Planned)".  This only affects Windows Server
  2003, and Windows XP if enabled with the Shutdown Event Tracker.

  Fixed a problem if a UDF were defined in Winbatch Studio in debugging
  mode and then used in normal mode, or vice versa.

  Fixed a problem with FileGet possibly crashing if it tried to read a file
  that was growing in size (ie, a file that another application was
  simultaneously writing to).

  Fixed a memory leak if an array was created and passed as a parameter to a
  function but not assigned to a variable.

  Fixed a problem with WinBatch crashing if UDF calls went more than 70 levels deep.

  IntControl(37) is now obsolete and may be removed in a future version.


WB 2005B  Jan 26, 2005

  Added support for an additional "state" to SvcSetState:

    Value  Service state             Meaning
    -----  -------------             -------
      2    SERVICE_START_PENDING     The service is starting

  Made a change to the way WinBatch behaves when it runs as a service.
  Instead of launching with a state of SERVICE_RUNNING, it now launches with
  a state of SERVICE_START_PENDING.  You can use SvcSetState to change the
  state to SERVICE_RUNNING, and if SvcSetState is not called within 3 seconds
  from the time the service launches, the state will automatically be changed
  to SERVICE_RUNNING.


DLL 5.6bef  First showing up in WB 2005B

  Fixed a memory leak if an array was created but not passed as a parameter
  to a function or assigned to a variable.

  Fixed a problem with IconReplace and some ICO files introduced in 2005A.

  Fixed a problem with IconInfo returning incorrect values for color depth
  for some ICO files.

  In IconInfo, the "color depth" value is the number of bits per pixel.
  This corresponds to the number of colors as follows:

    Depth   Colors
    -----   ------
       1    2
       2    4
       4    16
       8    256
      16    65536
      24    16 million
      32    4 billion

  The Beep command now does two beeps, using different methods.

  Changes to OLE support:

    Added the collection of more detailed contextual error information from
    COM servers that support the IErrorInfo interface.

    Corrected problem that caused a resource leak when accessing type
    information for some COM Automation objects.

    Added support for assignment of variant arrays to properties that do not
    provide type information.

    Fixed problem with accessing individual elements of an array of variant
    strings. Problem caused variant strings elements to sometimes be
    corrupted.

    Fixed problem with passing a variable containing a COM variant array to
    WIL functions expecting a WIL array as one of its parameters. The
    process sometimes corrupted the variable containing the variant array.

    Fixed memory leak that occurred when converting a COM variant array
    function parameter to WIL array function parameter.

    Corrected problem with handling method "out" parameters for objects that
    do not pass parameters by reference(which is the COM standard
    technique.)   Addresses a problem encountered with some "WMI" class
    methods.

    Improved performance when using members of COM objects in "for" and
    "while" loops.  This primarily affects COM servers like "Excel" that
    have a large number of members associated with each object in the
    programming model.


WB 2005C  Apr 7, 2005

  Fixed a problem with the new service behavior introduced in 2005B, where
  the service state wasn't automatically getting set to SERVICE_RUNNING in
  some cases.


DLL 5.7ceg  First showing up in WB 2005C

  New function:

    RegQueryKeyLastWriteTime(handle, subkey-string) (Windows NT/2000/XP/2003 only)
      Returns the last write time for a registry key.

        This function returns the last write time for a registry key, in
        YmdHms format.

  New IntControl:

    IntControl(91, p1, 0, 0, 0)
      Sets file mask matching mode.

        p1   Meaning
        --   -------
         0   Only match long version of file names (default).
         1   Match long and short versions of file names.

      This controls the behavior of functions which take file masks.  By
      default, masks only match the long version of the file name.  For
      example, if you do FileItemize("*.htm"), it will not match a file
      "home.html" whose short name is "HOME~1.HTM".  If you want it to match
      the short version of the file name as well, set "p1" to 1.

      Returns the previous setting.

  New '&' address operator returns a "pointer" to a variable:

    ptr = &var

      Note that the "pointer" is a string, and not a real memory address.

  New '*' pointer operator gets or sets the value of a variable referenced
  by a "pointer".  It sets the value when it appears in a statement as the
  first item on the left side of an '=' assigment:

    *ptr = val
    If answer == @TRUE Then *ptr = val
    Execute *ptr = val

  In other contexts, it gets the value:

    val = *ptr
    array[*ptr] = 5

  Added a new parameter to IntControl(34):

    IntControl(34, p1, p2, 0, 0)

      "p2" = error type.  If p2 == 0, then p1 specifies a WIL error code.
      If p2 == 1, then p1 specifies a Windows error code.

  Added a new parameter to IntControl(70).  Revised documentation is as follows:

    IntControl(70, p1, p2, 0, 0)
      Set delay after WinWait[..] functions or PostMessage's.

        "p1" specifies the delay, in milliseconds, after the type of
        operation specified by "p2".

        "p2" specifies the type of operation that the delay applies to:

          If "p2" == 0, then "p1" specifies the delay after a successful
          WinWaitExist, WinWaitChild, or WinWaitClose.  The default is 500
          (ie, 1/2 second).  Specify 0 for no delay.

          If "p2" == 1, then "p1" specifies the delay after successful calls
          to the Windows PostMessage API (except when performing mouse clicks).
          The default is 100 (ie, 1/10 second).  Specify 0 for no delay.

      Returns previous setting.

  Added an optional parameter to AskFileText and AskItemList:

    AskFileText(title, filename, sort mode, select mode [, i:selection-required])
    AskItemList(title, list variable, delimiter, sort mode, select mode [, i:selection-required])

      If "selection-required" is @TRUE, the OK button will be grayed out
      unless an item is selected in the listbox.  The default is @FALSE.

  Added an additional parameter to IntControl(72):

    IntControl(72, p1, p2, p3, 0)

      "p2" is a @TRUE/@FALSE flag specifying whether any existing
      "wberroradditionalinfo" data should be cleared first.

  Added a new "p1" mode and additional parameter to IntControl(72) and
  IntControl(73):

    IntControl(72, p1, p2, p3, 0)
    IntControl(73, p1, p2, p3, 0)

      p1   Meaning
      --   -------
       3   Call the UDF specified by "p3"

      "p3" specifies the name of the UDF.

    The cancel/error handler UDF must be defined to accept exactly one
    parameter.  The parameter it receives will be the "wberrorarray" array.
    None of the other WIL variables will be automatically set.

    By default, the cancel/error handler mode is reset to 0 when the UDF
    returns.  If the UDF returns 1, the handler mode will not be reset.

    If the cancel/error handler UDF is invoked in a variable assignment
    statement (eg, "variable = function()"), and you set wberrorarray[11] to
    a value inside the handler UDF, that value will be assigned to the
    variable.  Note that this does not work for a property assignment.  By
    default, the value assigned when a cancel or error occurs is 0.

  Fixed a problem with buttons in the error message dialog having the wrong
  names if an older version of the language localization file was in use.

  It is now an error to return a value from a GoSub.

  Fixed a problem with RunWithLogon failing when running under the
  LocalSystem account in Windows XP Service Pack 2 and Windows Server 2003.

  If BinaryReplace makes the buffer smaller by moving up the binary EOD, it
  now fills the data past the new binary EOD with NULL's.

  BinaryStrCount no longer counts strings which extend past the binary EOD.

  It is now an error to attempt to Drop a variable while an assignment is
  pending (eg, "x = MySubroutine()" where x is dropped within MySubroutine).

  Fixed a problem with PipeServerRead truncating the second character of a
  2-character string.

  Fixed some problems with the conversion of parameters and strings to
  floating point numbers.

  Added a 100 millisecond delay after calls to the Windows PostMessage API.
  This can be changed with IntControl(70).

  In the Display function, you can now specify a negative number for "seconds",
  in which case the negative number will be treated as a positive number (eg,
  -5 will be treated as 5), and the display dialog will be invisible.

  When processing goes to a Cancel or Error handler routine, the WIL array
  variable wberrorarray[11] is set to 0.

  Fixed a problem with WinArrange not calculating the screen area correctly.

  Fixed a problem with IsFloat, IsInt, and IsNumber returning @FALSE for
  some variant types.

  All functions which take file masks now restrict the mask-matching to the
  long version of the file name.  For example, if you do FileItemize("*.htm"),
  it will no longer return a file "home.html" whose short name is "HOME~1.HTM".
  You can modify this behavior with the new IntControl(91).

  RegSetQword no longer requires the value to be 8 bytes long.

  Changes to OLE support:

    Even more performance improvements when using COM servers that have a
    large number of members associated with each object in the programming
    model(significantly speeds looping through Excel cell values.)

    Added work around to allow access to Acrobat's buggy JSObject interface.

    Corrected problem with IntControl(77,62,0,0,0) and single element arrays.

    Added support for the variant type "ARRAY" to the "ObjectType"
    function.  This allows the creation of embedded safe arrays as required
    by a few COM object members.

    Variant bstr to number convertions now follow regular WIL string to
    number conversion rules.

    Variant currency and decimal tests for numeric type are now done
    based on content and variant type rather than just variant type.


WB 2005E  Nov 28, 2005

  New function:

    ExtractAttachedFile(s:source-name, s:target-name/request) (compiled version only)
      Extracts or lists embedded files in a compiled large EXE.

        To extract an embedded file:

          "source-name" specifies the name of the embedded file.  This must
          not contain any path information.  The embedded file may be the
          WIL DLL, an extender DLL, or an "other file".

          "target-name/request" specifies the name of the output file that
          will be written.  This may contain path information.

          Returns 1.

        To list embedded files:

          "source-name" must be a blank string ("").

          "target-name/request" specifies the type of embedded files to list:

            Request   Meaning
            -------   -------
               0      WIL DLL
               1      Extender DLL's
               2      "Other files"

          Returns a tab-delimited list of embedded file names, which do not
          contain any path information.

  Added an option to the compiler to skip auto-extraction of extenders and
  "other files" from large EXE's.  The WIL DLL is always extracted from a
  large EXE, if necessary.

  Command-line parameters (param1, param2, etc.) may now be Unicode.

  IntControl(1006) now returns a Unicode string.


DLL 5.9eei  First showing up in WB 2005E

  New Functions:

    BinaryPeekStrW(i:handle, i:offset, i:maxsize [, i:reverse-bytes])
      Extracts a Unicode string from a binary buffer.

        This function is like BinaryPeekStr, except that the return value is
        a Unicode string.  The end of the string is reached when a Unicode
        NULL character is found.

        "maxsize" specifies the maximum number of *bytes* in the string, and
        must be an even number.

        If "reverse-bytes" is @TRUE, the bytes in each Unicode character are
        reversed from the normal byte order.

    BinaryPokeStrW(i:handle, i:offset, u:Unicode-string [, i:reverse-bytes])
      Writes a Unicode string into a binary buffer.

        This function is like BinaryPokeStr, except that it writes a
        Unicode string.  Each character in "Unicode-string" requires 2 bytes
        in the buffer.  The return value is the number of bytes written.

        If "reverse-bytes" is @TRUE, the bytes in each Unicode character are
        reversed from the normal byte order.

    ChrGetCodePage(i:request)
      Gets the current code page.

        "request" specifies the code page to be returned:

          Request   Meaning
          -------   -------
             0      WIL code page being used for Unicode conversions
             1      ANSI code page associated with the default system locale
             2      ANSI code page associated with the default user locale

      Returns the requested code page.

    ChrSetCodePage(i:code-page)
      Sets the current WIL code page.

        "code-page" specifies a valid available code page, or one of the
        following system default code pages:

          Value   Meaning
          -----   -------
              0   ANSI code page
              1   OEM code page
              2   Macintosh code page
              3   The current thread's ANSI code page (Windows 2000/XP)
             42   Symbol code page (Windows 2000/XP)
          65000   Translate using UTF-7 (Windows 98/ME/NT4/2000/XP/2003)
          65001   Translate using UTF-8 (Windows 98/ME/NT4/2000/XP/2003)

      Returns the previous WIL code page.

    ChrHexToUnicode(s:hex-string)
      Converts a hex string to a Unicode string.

        "hex-string" specifies a Unicode string in hex format, with four
        hex bytes per Unicode character (eg, "480065006C006C006F00").

      Returns a Unicode string.

    ChrStringToUnicode(s:string)
      Converts an ANSI string to a Unicode string.

        "string" specifies a string.

      Returns a Unicode string.

    ChrUnicodeToHex(u:Unicode-string)
      Converts a Unicode string to a hex string.

        "Unicode-string" specifies a Unicode string.

      Returns a hex string, with four hex bytes per Unicode character.

    ChrUnicodeToString(u:Unicode-string)
      Converts a Unicode string to an ANSI string.

        "Unicode-string" specifies a Unicode string.

      Returns a string.

    PtrGlobalDefine(var)
      Marks a variable as being globally accessible.

        "var" specifies a variable name.

      This function can only be called from the main script, not from a UDF.

      If "var" does not already exist, it will be created.

      Returns a pointer string.

    PtrGlobal(var)
      Retrieves a "pointer" to a global variable.

        "var" specifies a variable name.

      "var" must have been previously been marked as global using PtrGlobalDefine.

      Returns a pointer string.

    PtrPersistent(var, value)
      Creates a "pointer" to a persistent variable.

        "var" specifies a variable name which CANNOT be longer than 25 characters.

        "value" specifies a value which will be assigned to "var" if "var"
        does not already exist.

      This function marks a variable as persistent.  If called from a UDF,
      the variable will retain its value after the UDF returns.

      If "var" does not already exist, it will be created.  If it already
      exists, its value will not be changed.

      Returns a pointer string.

    StrByteCount(s/u:string, i:request)
      Returns the length of a string, in bytes.

        "string" specifies an ANSI or Unicode string.

        "request" specifies how "string" should be treated in order to
        calculate its length:

          Request   Meaning
          -------   -------
            -1      current format (ANSI or Unicode)
             0      ANSI string (including double-byte ANSI character sets)
             1      Unicode string


    FileGetW(s/u:filename [, u:null-char])
      Converts a file to a Unicode string variable.

        This function is like FileGet, except that the return value is
        a Unicode string, and "null-char" specifies a Unicode character.

        "filename" specifies an ANSI file name in Windows 95/98/ME, and a
        Unicode file name in Windows NT/2000/XP/2003.

      Returns a Unicode string containing the file contents.

    FilePutW(s/u:filename, u:string)
      Writes a Unicode string to a file.

        This function is like FilePut, except that "string" specifies a
        Unicode string.

        "filename" specifies an ANSI file name in Windows 95/98/ME, and a
        Unicode file name in Windows NT/2000/XP/2003.

      Returns the number of bytes (not characters) written to the file.
      This will include a 2-byte Unicode header written to the beginning
      of the file.

    RegOpenFlags(i:flags)
      Specfies registry view.

        This function lets you specify an alternate view of the registry for
        Reg[..] functions which create, open, and delete registry keys, when
        running on (or accessing) a 64-bit Windows platform.

          Flags   Meaning
          -----   -------
            0     32-bit view under Win32, 64-bit view under WOW64 (default)
            1     32-bit view
            2     64-bit view

      Returns 1.

  Added an optional parameter to AskLine:

    AskLine(title, prompt, default [, i:format])

      "format" specifies the format of the returned string:

        Format   Meaning
        ------   -------
          0      ANSI string (default)
          1      Unicode string (Windows NT/2000/XP/2003 only)
          2      hex string, with four hex bytes per Unicode character

  Added an optional parameter to FileOpen:

    FileOpen(filename, mode [, i:Unicode])

      The "Unicode" option will affect how FileRead and FileWrite process
      the file data, as below.

    FileRead now returns a Unicode string if the file was opened with
    FileOpen specifying "Unicode" as @TRUE.  FileRead can also now be used
    to read files containing Unicode data, and will automatically determine
    the correct file type (ANSI or Unicode), regardless of the "Unicode"
    parameter in FileOpen, and will convert the return string if necessary.

    The FileWrite "output-data" string is now treated as a Unicode string if
    the file was opened with FileOpen specifying "Unicode" as @TRUE.
    However, if you open an existing file in "APPEND" mode, FileWrite will
    always output data to match the existing file type (ANSI or Unicode).

  You can pass a Unicode string to any function that accepts an ANSI string.
  If the function doesn't specifically support Unicode strings, they will be
  converted to ANSI.

  Message() will now call a Unicode version of the function if "title" or
  "text" is a Unicode string.

  AskLine will now call a Unicode version of the function if "title",
  "prompt", or "default" is a Unicode string, or if "format" is 1 or 2
  (Windows NT/2000/XP/2003 only).

  StrLen will now call a Unicode version of the function if "string" is a
  Unicode string.

  StrLen now returns the length of "string" in characters instead of bytes.
  New function "StrByteCount" can be used to return the length in bytes.

  StrCharCount will now call a Unicode version of the function if "string"
  is a Unicode string.

  StrCat will now call a Unicode version of the function if any of the
  parameters are Unicode strings, in which case the return value will be a
  Unicode string.

  ClipAppend and ClipPut will now copy "string" to the Clipboard in Unicode
  format if it is a Unicode string.

  ClipGet will now return a Unicode string if the Clipboard contains Unicode
  data.

  ClipGetEx will now return a Unicode string if "format" = 13.  This format
  now works properly on all Windows platforms.

  The following functions will now call a Unicode version of the function if
  any of the string parameters are Unicode strings, in which case if the
  return value is a string it will be a Unicode string:

    ItemCount
    ItemCountCsv
    ItemExtract
    ItemExtractCsv
    ItemInsert
    ItemLocate
    ItemRemove
    ItemReplace
    ItemSort

  The following functions will now call a Unicode version of the function in
  Windows NT/2000/XP/2003, and will return Unicode lists (or arrays
  containing Unicode file names) on all platforms:

    FileItemize
    FileItemPath
    DirItemize
    FileInfoToArray
    DirInfoToArray

  Call() will now call a Unicode version of the function if "parameters" is
  a Unicode string, in which case the parameters passed to the called script
  will be Unicode strings.

  Unicode strings may be passed as parameters to UDF's, in which case the
  corresponding variable will be set to a Unicode string.

  Fixed a problem with the "For" statement when "initial-value" was a string.

  Changed the method IniItemize and IniItemizePvt use to itemize section
  names when "section" is a blank string.  This will affect the behavior
  when there are multiple sections in the file with the same name but
  different cases, and they contain high ASCII characters (eg, [cliché] and
  [CLICHÉ]).  The behavior now matches the Windows method.

  You can now use IniItemize("") to itemize section names in WIN.INI.

  The following functions will now call a Unicode version of the function in
  Windows NT/2000/XP/2003:

    Run
    RunEnviron
    RunHide
    RunHideWait
    RunIcon
    RunIconWait
    RunShell
    RunWait
    RunWithLogon
    RunZoom
    RunZoomWait

  Fixed a problem with PtrPersistent and more than 9 UDF's.

  The following functions will now call a Unicode version of the function in
  Windows NT/2000/XP/2003 if "filename" is a Unicode string:

    BinaryRead
    BinaryReadEx
    BinaryWrite
    BinaryWriteEx

  FileCompare will now call a Unicode version of the function in Windows
  NT/2000/XP/2003 if "filename1" or "filename2" is a Unicode string.

  SnapShot now supports multi-monitor systems.

  The following functions now accept a Unicode string for "filename" in
  Windows NT/2000/XP/2003:

    FileAttrGet
    FileAttrGetEx
    FileExist
    FileGet
    FileOpen
    FilePut
    FileTimeCode
    FileTimeGet
    FileTimeGetEx
    FileYmdHms

  The following functions now accept a Unicode string for "file-list" in
  Windows NT/2000/XP/2003:

    FileAttrSet
    FileAttrSetEx
    FileTimeSet
    FileTimeSetEx

  The following functions now accept a Unicode string for "source-list" and
  "destination" in Windows NT/2000/XP/2003:

    FileAppend
    FileCopyAttr
    FileMoveAttr

  The following functions now accept Unicode strings in Windows
  NT/2000/XP/2003:

    FileCopy
    FileDelete
    FileMove
    FileRename
    FileSize
    FileSizeEx
    FileTimeTouch

  The following functions now accept and return Unicode strings in Windows
  NT/2000/XP/2003:

    FileBaseName
    FileCreateTemp
    FileExtension
    FileFullName
    FileLocate
    FileMapName
    FileNameLong
    FileNameShort
    FilePath
    FileRoot
    FileVerInfo

  The line length specified by IntControl(65) is now in characters, not bytes.

  DllHinst was returning a non-zero value for an invalid window in some cases.

  When running in WOW64 (32-bit emulation under 64-bit Windows), Reg[..]
  functions which create, open, and delete registry keys now access a 64-bit
  view of the registry by default.  This can be changed with RegOpenFlags.

  IntControl(77, 12) was listing a variable with a blank name, resulting in
  a tab at the beginning of the list.

  ParseData now accepts a Unicode string for "string", in which case the
  variables created (param1, param2, etc.) will be Unicode.

  Fixed a problem with SysParamInfo using request 8203.

  Added new return value for WinMetrics(-2):

    3 = Win64

  Added new request to WinMetrics:

    Req   Return value
    ---   ------------
     -7   2 if WOW64 (32-bit emulation under 64-bit Windows), 0 otherwise

  IniItemizePvt now returns "(NONE)" instead of "(File not found)" when
  listing sections in a non-existent file.

  Fixed a problem specifying multiple handler UDF's with IntControl(72) and
  IntControl(73).

  In FileCopy, if "destination" is a file name of the form "USB###" where
  "#" is a digit between 0 and 9, it will now be treated as a port number.

  Fixed a string memory leak.

  IntControl(22) and IntControl(23) now work if "p1" = 65535.

  FileInfoToArray and DirInfoToArray no longer have a limit of 100 names in
  "file-list"/"dir-list".

  Added additional "levels" for WinVersion, on Windows
  NT4[SP6+]/2000/XP/2003/Vista:

    Level  Returns
    -----  -------
      6    Major version number of the latest Service Pack installed.

      7    Minor version number of the latest Service Pack installed.

      8    Bit flags that identify the product suites available on the
           system.  This can be 0, or one or more of the following values,
           combined using the bitwise OR ('|') operator:

             Value  Meaning
             -----  -------
                 1  Microsoft Small Business Server was once installed on the
                    system, but may have been upgraded to another version of
                    Windows (see note below).

                 2  Windows Server 2003, Enterprise Edition, Windows 2000
                    Advanced Server, or Windows NT Server 4.0 Enterprise
                    Edition is installed (see note below).

                 4  Microsoft BackOffice components are installed.

                16  Terminal Services is installed.

                32  Microsoft Small Business Server is installed with the
                    restrictive client license in force (see note below).

                64  Windows XP Embedded is installed.

               128  Windows Server 2003, Datacenter Edition or Windows 2000
                    Datacenter Server is installed.

               256  Terminal Services is installed, but only one interactive
                    session is supported.

               512  Windows XP Home Edition is installed.

              1024  Windows Server 2003, Web Edition is installed.

           Note that you should not solely rely upon the '1' flag to
           determine whether Small Business Server has been installed on the
           system, as both this flag and the '32' flag are set when this
           product suite is installed.  If you upgrade this installation to
           Windows Server, Standard Edition, the '32' flag will be unset,
           however, the '1' flag will remain set.  In this case, this
           indicates that Small Business Server was once installed on this
           system. If this installation is further upgraded to Windows
           Server, Enterprise Edition, the '1' flag will remain set.

      9    Additional information about the system.  This can be one of the
           following values:

             Value  Meaning
             -----  -------
               1    The operating system is Windows Vista, Windows XP
                    Professional, Windows XP Home Edition, Windows 2000
                    Professional, or Windows NT Workstation 4.0.

               2    The system is a domain controller.

               3    The system is a server.

           Note that a server that is also a domain controller is reported
           as '2', not '3'.

    A blank string will be returned for these "levels" on unsupported
    Windows platforms.

  Changes to the Dialog function and related functions:

    Added new option to DialogProcOptions function. Use 1003 to change the
    dialogs title by placing a new title in the function's third parameter.
    Place -1 in the third parameter to return current title.

    Added two new control styles that can be used to control text selection
    and cursor placement when a EDITBOX and MULTILINEBOX control receives
    the input focus. Style 2048 prevents text selection and places the
    cursor to the left side of the text. Style 4096 prevents text selection
    and places the cursor to the right of the text. Both style only effect
    selection when the control initially get the input focus. The user is
    still able to manually selection text.

    Changed rendering method for dialog buttons to fix an occasional problem
    with dialog client area redraws.

    New dialog control type COMCONTROL.

  Changes to OLE support:

    New functions:

      ObjectEventAdd
      ObjectEventRemove
      DialogObject

    Fixed problem that occurred when handling invalid parameters to the
    ObjectGet/GetObject functions.

    Fixed problem handling individual WIL array elements passed to object
    methods as out parameters.

    Fixed problem accessing members of safearray elements that are object
    references stored as variants.

    Changed type information handling for legacy COM Automation servers that
    use variable descriptors instead of function descriptors to store object
    property information in their type library.  (Found a COM serve that
    still uses variable descriptors.)

    Changed the values returned by IntControl(77,62,0,0,0) so they match the
    integer values used when an unqualified COM object variables participate
    in an integer expressions.

    Add COM Controls and COM event support.

    Fixed problem with assigning an object reference to an element of a
    Variant array of variants when using WIL array syntax.

    Added error to the ObjectEventAdd function to trap attempts to pass an
    object reference that is not stored in WIL variable as the first
    parameter to the function.

    Fix bug that prevented ObjectEventAdd from finding an object's events in
    certain situations.

    Fixed problem that on rare occasions could cause a memory exception or an
    "Object type mismatch" error during object property assignment.


Dialog Editor 2005E  First showing up in WB 2005E

  Added Resize menu option.

  Added Run Dialog menu option.

  Added support for arrow keys to Script View mode.

  Added simple context menu to Script View.

  Sorted "Insert" menu items.

  Added ability to change anchor control in multi-select alignment
  operations.

  Added visual feedback to identify the current anchor during multi-select
  operations.

  Fixed several tab key navigation problems associated with the deletions
  of controls.

  Added new option to the "Save" options property page. This option turns
  off the Save prompting for templates loaded from the clipboard, modified
  and then saved back to the clipboard.


WB 2005F  Dec 6, 2005


DLL 5.9fei  First showing up in WB 2005F

  PipeClientSendRecvData was returning a blank string ("") instead of
  "*TIMER*" if no data was placed in the pipe before "read-timeout" elapsed.

  Changes to the Dialog function and related functions:

    PICTURE controls now displays dialog background color when the specified
    bitmap file cannot be found.

  Changes to OLE support:

    Fixed problem with error reporting when a COM event source passes an
    invalid VARIANT as a parameter.

    Added handling of non-standard event parameter types that the regular
    Windows APIs cannot process.

    Fixed rarely occurring memory leak caused by COM method parameters with
    more than one level of indirection.


WB 2005G  Dec 7, 2005


DLL 5.9gei  First showing up in WB 2005G

  RegOpenFlags no longer has any effect on 32-bit platforms.

  Changes to OLE support:

    Fixed problem that caused the unused fifth parameter of a dialog
    user-defined callback procedure to not always be instantiated during a
    COM event callback.


WB 2006A  Feb 7, 2006


DLL 5.10aej  First showing up in WB 2006A

  New Functions:

    StrFixBytes(s:base-string, s:pad-string, i:length)
      Pads or truncates a string to a fixed length using bytes.

        This replaces the previous "StrFix" function.

        "length" specifies the length in bytes.

        If either "base-string" or "pad-string" is a Unicode string, then
        "length" must be an even number (each character is two bytes).

    StrFixBytesL(s:base-string, s:pad-string, i:length)
      Pads or truncates the left side of a string to a fixed length using bytes.

        This replaces the previous "StrFixLeft" function.

        "length" specifies the length in bytes.

        If either "base-string" or "pad-string" is a Unicode string, then
        "length" must be an even number (each character is two bytes).

  Fixed a problem when using an extender constant (or an extender function
  missing parentheses) on the left side of a '&' operator.

  StrFix now works based on characters instead of bytes, and is identical to
  StrFixChars.  New function "StrFixBytes" can be used to specify the length
  in bytes.

  StrFixLeft now works based on characters instead of bytes, and is
  identical to StrFixCharsL.  New function "StrFixBytesL" can be used to
  specify the length in bytes.

  The following functions will now call a Unicode version of the function if
  any of the string parameters are Unicode strings, in which case if the
  return value is a string it will be a Unicode string:

    StrCmp
    StrFill
    StrFix
    StrFixChars
    StrFixCharsL
    StrFixLeft
    StriCmp
    StrIndex
    StrReplace
    StrScan
    StrSub
    StrTrim

  The following functions will now call a Unicode version of the function in
  Windows NT/2000/XP/2003 if any of the string parameters are Unicode strings,
  in which case if the return value is a string it will be a Unicode string:

    StrClean
    StrCnt
    StrIndexNc
    StrIndexWild
    StrLenWild
    StrLower
    StrSubWild
    StrUpper

  The following functions will now call a Unicode version of the function in
  Windows NT/2000/XP/2003:

    AskDirectory
    AskFileName
    AskFileText
    AskItemList
    AskPassword
    AskTextBox
    AskYesNo

  Improved the performance of Arrayize.

  Improved the performance of StrCat.

  Fixed a problem with doing an Exit within a cancel/error handler UDF.

  Added an optional parameter to WinItemizeEx:

    WinItemizeEx(partial-winname, multiple, hidden [, i:return-type])

      "return-type" specifies the format in which the list of windows will
      be returned, and can be one of the following:

        Type	Meaning
        ----  -------
          0   Tab-delimited list of window titles (default)
          1   Tab-delimited list of window ID's
          2   List of window titles and their corresponding window ID's,
              in the form: "window1-name|window1-ID|window2-name|window2-ID|..."

        Note that the "return-type" values are numbered differently than in
        WinItemProcID.

  Fixed a problem with crashing on startup.

  Changes to the Dialog function and related functions:

    Added new request code to DialogControlState function.  Request code 6
    positions the mouse cursor over an indicated control.

    Modified DialogControlState request-code=remove style(4),
    style=invisible(1) to work with more COMCONTROL controls.

  Changes to OLE support:

    Fixed divide by zero fault caused when loading type information for a
    very unusual COM server with only old style property type information
    and no method type information.

    Modified COM hosting to support undocumented ambient property call made
    by OWC pivot tables.  Necessary to make pivot tables user modifiable.

    Fixed a small memory leak that occurred when an object reference was
    passes as a parameter to an object method or assigned to an object
    property.

    Fixed resource leak that occurred when the DialogObject function was
    used to create a picture object.

    Modified DialogControlState request-code=remove style(4),
    style=invisible(1) to work with more COMCONTROL controls.


WB 2006B  Apr 3, 2006


DLL 5.11bek  First showing up in WB 2006B

  New functions:

    ComputerNameGet(i:format)
      Gets the name associated with the local computer.

      In Windows 95/98/ME, "format" must be 0.  In Windows NT/2000/XP/2003,
      "format" can be one of the following values:

        Value   Meaning
        -----   -------
           0    The NetBIOS name of the local computer.

         100    The NetBIOS name of the local computer.  If the local
                computer is a node in a cluster, returns the NetBIOS name of
                the cluster virtual server.

         101    The DNS host name of the local computer.  If the local
                computer is a node in a cluster, returns the DNS host name
                of the cluster virtual server.

         102    The name of the DNS domain assigned to the local computer.
                If the local computer is a node in a cluster, returns the
                DNS domain name of the cluster virtual server.

         103    The fully qualified DNS name that uniquely identifies the
                local computer.  This name is a combination of the DNS host
                name and the DNS domain name, using the form
                HostName.DomainName.  If the local computer is a node in a
                cluster, returns the fully qualified DNS name of the cluster
                virtual server.

         104    The NetBIOS name of the local computer. If the local
                computer is a node in a cluster, returns the NetBIOS name of
                the local computer, not the name of the cluster virtual
                server.

         105    The DNS host name of the local computer.  If the local
                computer is a node in a cluster, returns the DNS host name
                of the local computer, not the name of the cluster virtual
                server.

         106    The name of the DNS domain assigned to the local computer.
                If the local computer is a node in a cluster, returns the
                DNS domain name of the local computer, not the name of the
                cluster virtual server.

         107    The fully qualified DNS name that uniquely identifies the
                computer.  If the local computer is a node in a cluster,
                returns the fully qualified DNS name of the local computer,
                not the name of the cluster virtual server.  The fully
                qualified DNS name is a combination of the DNS host name and
                the DNS domain name, using the form HostName.DomainName.

      Returns an ANSI string in Windows 95/98/ME, and a Unicode string in
      Windows NT/2000/XP/2003.

    ComputerNameSet(s/u:new-computername, i:format)
      Sets the name for the local computer.

      In Windows 95/98/ME, "format" must be 0.  In Windows NT/2000/XP/2003,
      "format" can be one of the following values:

        Value   Meaning
        -----   -------
           0    In Windows 95/98/ME, sets the NetBIOS name.  In Windows
                NT/2000/XP/2003, same as 105 (below).

         104    Sets the NetBIOS name.  The name cannot exceed 15 characters.

                Warning: Using this option to set the NetBIOS name breaks
                the convention of interdependent NetBIOS and DNS names.
                Applications that use the DnsHostnameToComputerName function
                to derive the NetBIOS name from the first label of the DNS
                name will fail if this convention is broken.

         105    Sets the NetBIOS and the Computer Name (the first label of
                the full DNS name).  If the name exceeds 15 characters, the
                NetBIOS name is truncated to 15 characters.

         106    Sets the primary DNS suffix of the computer.

      Changes do not take effect until the computer is restarted.

      This function replaces IntControl(76).

    DataCast(value, i:mode)
      Converts or casts a value from one data type to another.

        "value" specifies the value to be converted or cast.

        "mode" species the operation to perform:

          Mode   Meaning
          ----   -------
            0    Cast single-precision floating point to double-precision floating point

                   "value" specifies a single-precision (32-bit) floating
                   point value, represented as a WIL long value containing
                   the same bit sequence as the float value.

                   Returns a WIL floating point value (64-bit).

            1    Cast double-precision floating point to single-precision floating point

                   "value" specifies a WIL floating point value (64-bit).

                   Returns a single-precision (32-bit) floating point value,
                   represented as a WIL long value containing the same bit
                   sequence as the float value.

      Casting a value involves changing it from one data type to another,
      and may involve a loss of precision depending on the type of cast.

    ErrorEvent(i:severity, i:error-code, s:error-message)
      Causes a user-defined error.

      This function replaces IntControl(79).

    SendMessageA(s/i:window, i:message-id, i:wParam, s:lParam)
      Issues a Windows "SendMessage", with lParam as an ANSI string.

        "window" specifies either a window ID or a window handle.

      This function replaces IntControl(22).

    SendMessageW(s/i:window, i:message-id, i:wParam, u:lParam) (Windows NT/2000/XP/2003 only)
      Issues a Windows "SendMessage", with lParam as a Unicode string.

        "window" specifies either a window ID or a window handle.

      This function is like SendMessageA, except "lParam" specifies a Unicode
      string, and a Unicode version of "SendMessage" is called.

    TerminateApp(s/u:winname/apppname, i:name-type, i:flags)
      Terminates an application.

        "winname/apppname" specifies a window name or application name,
        depending on the value of "name-type"

          name-type   winname/apppname
          ---------   ----------------
              0       full or partial windowname of a WinBatch program window
              1       full or partial windowname of a DOS program window
              2       full or partial windowname of a Windows program window
              3       application file name of a Windows program

        "flags" can be set to 0, or can specify one or more of the following
        values combined with the bitwise OR ('|') operator:

          Value   Meaning
          -----   -------
            1     "current-session-only" flag (valid only if "name-type" == 3).
                  If this flag is specified, and the script is running in a
                  Terminal Services environment, then the specified application
                  will only match if it is running in the same session as the
                  script.  Otherwise, the specified application will match
                  regardless of what session it is running in.

      This function replaces IntControl(47), IntControl(48), and IntControl(56).

    WindowOnTop(s/u:partial-winname, i:mode)
      Keep window on top.

      This function replaces IntControl(54).

    WinWaitReady(s/u:partial-winname, i:timeout)
      Waits until an application is waiting for user input.

      This function replaces IntControl(36).

  "Execute" statement now handles extender errors.

  Fixed a problem with AskFileText displaying a blank file listing.

  The following functions now receive Unicode "window-name" parameters in
  Windows NT/2000/XP/2003:

    DllHinst
    DllHwnd
    WinActivate
    WinActiveChild
    WinClose
    WinCloseNot
    WinExeName
    WinExist
    WinExistChild
    WinHide
    WinIconize
    WinIdGet
    WinIsDOS
    WinItemChild
    WinItemizeEx
    WinPlace
    WinPlaceChild
    WinPlaceGet
    WinPlaceSet
    WinPosition
    WinPositionChild
    WinShow
    WinState
    WinTitle
    WinWaitChild
    WinWaitClose
    WinWaitExist
    WinZoom

  The following functions now return Unicode strings in Windows NT/2000/XP/2003:

    FindWindow
    WinGetActive
    WinItemChild
    WinItemize
    WinItemizeEx
    WinItemNameId
    WinItemProcId
    WinName

  Fixed problem with Unicode ITEMBOX controls in version 5.0 dialogs.

  Added an optional parameter to IconReplace (and IntControl(37)):

    IconReplace(s:filename, s:iconfilename [, i:index [, i:flags]])

      "flags" can be set to 0, or can specify one or more of the following
      values combined with the bitwise OR ('|') operator:

        Value   Meaning
        -----   -------
          1     delete un-replaced icon images in the target icon group
                (32-bit EXE's only) (Windows NT/2000/XP/2003 only)

                For example, if the target icon group in the EXE has 6 icon
                images, and the specified .ICO file has only one icon image,
                if you specify this flag then the one matching icon image in
                the EXE will be replaced and the other 5 will be deleted.

  Fixed a problem with RegQueryValue (and possibly other RegQuery[..] functions)
  returning erroneous data if the registry value was NULL (0 bytes long).

  Added an optional "format" parameter to WinResources:

    WinResources (request# [, i:format])

      This controls the format in which the value is returned if it is too large
      to be returned as an integer.  The default format, 0, is floating point.
      If you specify "format" of 1, the value will be returned as a huge number.

  Added new request # to WinResources:

    Req#	Return value
    ----  ------------
     17   number of bytes of unreserved and uncommitted memory in the extended
       		portion of the virtual address space of the calling process
       		(Windows 2000/XP/2003/Vista only).

  WinResources now supports return values larger than 2 gigabytes in
  Windows 2000/XP/2003/Vista.

  Fixed a problem with arrays getting freed after a syntax error in a
  function call, before any error handler would be called.

  DllCall and DllCallCdecl now support 'lpwstr' (Unicode string) as a return
  type and parameter type.

  Changes to the Dialog function and related functions:

    Fixed problem with dialog background not updating properly when a
    PICTURE control bitmap was removed with the DialogControlSet function
    request-code 12.

  Changes to OLE support:

    Fixed minor memory leak that occurred when creating a COMCONTROL from a URL.

    Add Work-around for problem in WebBrowser control that sometimes causes
    WIL dialogs that use the control to hang on exit.

    Fixed variable scope problem that occurred when attempting to handle a
    COMCONTROL event for a dialog with a template defined in a UDF.

    Removed restriction on handling COM events in dialogs launched from COM
    event handlers.


WB 2006C  Jun 1, 2006

  Fixed a problem with the compiler creating invalid EXE's if certain types
  of custom icons were used, in Windows NT/2000/XP/2003.


DLL 5.12cel  First showing up in WB 2006C

  Fixed a small memory leak when calling a function with an optional
  string parameter.

  Added a new mode to IntControl(91):

    p1   Meaning
    --   -------
     2   Only match long version of file names, using alternate method
         (PathMatchSpec API).

  RegQueryItem no longer returns blank items in the list.

  Added new requests to IntControl(77):

    Request  Meaning
    -------  -------
       72    LF-delimited list of tab-delimited structure stack information
      110    number of DDE conversations open
      111    number of DDE conversations available

  For IntControl(81/82), you can now specify -1 for "p1", in which case it
  will set the seed to a random value.

  For DebugTrace, you can now specify a "mode" of 3 or 4, in which case
  "filename" specifies a string to be written to the debug log file if
  DebugTrace mode is already @ON.  Mode 4 writes the string surrounded by
  a series of "$" signs.

  Fixed another problem with doing an Exit within a cancel/error handler UDF.

  Fixed a problem with IconExtract, IconInfo, and IconReplace possibly
  crashing on an EXE containing invalid resource entries.

  IconInfo no longer returns an error if the file is invalid.

  Changes to the Dialog function and related functions:

    Fixed problem with WIL dialogs sometimes not handling key stroke events
    associated with COMCONTROL controls.

  Changes to OLE support:

    Fixed problem handling variants that are a NULL reference to an object
    reference.


WB 2006D  Sep 22, 2006


DLL 5.12del  First showing up in WB 2006D

  New functions:

    StrTypeInfo(value, i:flag)
      Gets character-type information for a string, or information for a character-type.

        If "flag" = 0 or 1, "value" specifies a string of 1 or more characters.
        For each character in the string, a character-type is determined.  The
        character-type is comprised of one or more of the following values,
        combined using the bitwise OR ('|') operator:

          Value  Name        Meaning
          -----  ----        -------
             1   C1_UPPER    Uppercase
             2   C1_LOWER    Lowercase
             4   C1_DIGIT    Decimal digits
             8   C1_SPACE    Space characters
            16   C1_PUNCT    Punctuation
            32   C1_CNTRL    Control characters
            64   C1_BLANK    Blank characters
           128   C1_XDIGIT   Hexadecimal digits
           256   C1_ALPHA    Any linguistic character: alphabetical, syllabary, or ideographic
           512   C1_DEFINED  A defined character (not used in Windows 95/98/ME)

        If "flag" = 0, the function returns a value comprised of the
        character-types of all the characters in the string, combined using
        the bitwise AND ('&') operator.

        If "flag" = 1, the function returns a value comprised of the
        character-types of all the characters in the string, combined using
        the bitwise OR ('|') operator.

        If "flag" = -1, "value" specifies a character-type, and the function
        returns a string describing the bits that make up the character-type.
        The string is comprised of a space-delimited list of words, with one
        word describing each bit contained within the character-type:

          Value  Name        Word in string
          -----  ----        --------------
             1   C1_UPPER    "Upper"
             2   C1_LOWER    "Lower"
             4   C1_DIGIT    "Digit"
             8   C1_SPACE    "Space"
            16   C1_PUNCT    "Punct"
            32   C1_CNTRL    "Cntrl"
            64   C1_BLANK    "Blank"
           128   C1_XDIGIT   "HexDg"
           256   C1_ALPHA    "Alpha"
           512   C1_DEFINED  "Undef" if the C1_DEFINED bit is NOT set (not used in Windows 95/98/ME)

      String parameters and return values are ANSI in Windows 95/98/ME, and
      Unicode in Windows NT/2000/XP/2003/Vista.

    ChrHexToString(s:hex-string)
      Converts a hex string to a string.

        "hex-string" specifies a string in hex format, with two
        hex bytes per character (eg, "48656C6C6F").

      Returns a string.

    ChrStringToHex(s:string)
      Converts a string to a hex string.

        "String" specifies a string.

      Returns a hex string, with two hex bytes per character.

  New IntControl:

    IntControl(92, s:operation, i:value, 0, 0) (64-bit Windows only)
      Disable file system redirection.

      This IntControl disables or reverts file system redirection when
      running in WOW64 (32-bit emulation under 64-bit Windows).

        "operation" may be either "Disable" or "Revert".

        If "operation" is "Disable", file system redirection is disabled,
        and the function returns a value that should be specified on a
        subsequent "Revert" operation.  "Value" should be set to 0.

        If "operation" is "Revert", file system redirection is reverted to
        the state specified by "value", which should be the result of a
        previous "Disable" operation.  Returns a non-zero value on success.

      Returns a value as specified above, or -1 on error.

  New ':' string concatenation operator concatenates two strings (or
  values which can be converted to strings).  For example:

    Message("Windows version", WinVersion(1) : "." : WinVersion(0))

  When prepending the path specified in the registry under "App Paths" when
  launching a program, the registry value is no longer limited to 260
  characters.

  The return value of a cancel/error handler UDF is now treated as a bitmask
  of values which may be combined using the bitwise OR ('|') operator.  The
  following values may be specified:

    Value  Meaning
    -----  -------
      1    Don't reset the handler mode to 0 when the UDF returns.
      2    Treat this error event as unhandled, and do normal error processing.

  Revised DebugTrace.  The new syntax is:

    DebugTrace(i:request [, s/i:param [, s/i:param2]])
      Controls and customizes the WIL debugging trace logs.

        Request   Meaning                                     Param
        -------   -------                                     -----
           -1     Just return previous trace mode             (Ignored)
            0     Turn trace off                              (Ignored)
            1     Turn trace on                               Filename, or "" to use the previously-specified filename
           10     Turn trace on and delete file               Filename, or "" to use the previously-specified filename
           22     Continue prev trace mode in a UDF or Call   (Ignored)
          100     Specify output filename                     Filename
          101     Specify output filename and delete file     Filename
          102     Dump variable table on error                @TRUE or @FALSE (default)
          103     Dump debug data on keyword lookup           @TRUE or @FALSE (default)
          104     Suppress statement timestamps               @TRUE or @FALSE (default)
          200     Reset trace mode and flags                  New log file name, or "" to clear filename
          203     Write a string to the log file              String
          204     Write a string surrounded by "$"            String
          205     Dump function tables now                    (Ignored)
          206     Dump variable table now                     (Ignored)
          207     Dump structure stack info now               (Ignored)
          208     Dump system info now                        (Ignored)
          277     Dump internal info now                      "" for summary, or specific request (w/optional "param2") (see IntControl 77)

        For requests which take a file name, if "Filename" is "*DEBUGDATA*"
        then debug output will be written to the system debugger using the
        OutputDebugString Windows API (see WIL DebugData function).

      Returns previous trace mode (@ON or @OFF).

  IntControl(71) has been superseded by DebugTrace (old p1 = new request: 1 = 205, 2 = 103, 3 = 206).

  Fixed a problem with AskDirectory when selecting a shortcut to a folder
  in Windows 2000/XP/2003.

  Fixed a problem with "#include" directives inside a called script not
  searching the path for the specified file.

  Fixed a memory leak when passing a variable as a parameter to a function
  or UDF using the address ('&') or pointer ('*') operator.

  Fixed a problem with FileInfoToArray and DirInfoToArray, where "flag" 2
  was specified, and "file-list" (or "dir-list") contained an invalid file
  (or directory) name or mask.

  Fixed a problem with arrays sometimes not getting freed on variable reassignment.

  Changes to the Dialog function and related functions:

    Dialogs support the display of UNICODE text on Windows NT/2000/XP/Vista.
    Dialogs still convert UNICODE to ANSI on Windows 96/98/Me.

    DialogControlSet/Get functions modified to pass UNICODE text directly
    between Windows NT/2000/XP/Vista dialogs and functions.

    Dialog control variable handling modified to pass UNICODE text directly
    between Windows NT/2000/XP/Vista dialogs and variables.

    Fixed problem with the old default button's thick border not being
    removed when DialogControlState is used to change a dialog's default
    button.

  Changes to OLE support:

    Allow use of the colon(:) without a type name in type specification for
    COM object method parameters.  This permits the use of the string
    concatenation operator in actual parameter expressions.

    Fixed a rarely occurring problem caused by calling ObjectEventRemove
    inside a UDF event handler for the event being removed.

    Changed handling of Windows message reflection to COMCONTROL controls
    after the final release of the COM control host object.

    Turned on support for the undocumented "return" property of "EventInfo"
    object.  The "EventInfo" object is the fourth parameter of a user
    defined dialog callback UDF/UDS.  The property allows passing the
    equivalent of a function return value to a COMCONTROL after the control
    fires an event.

    Added better support for several required COM container interfaces to
    make COM control support conform to published standards.  Appears to
    have no noticeable effect on control or dialog behavior.

    COM controls are now supported as UNICODE windows on Windows
    NT/2000/XP/Vista systems.


WB 2006E  Nov 15, 2006


DLL 5.12eel  First showing up in WB 2006E

  Fixed a problem with PtrPersistent when "value" was an expression.

  Fixed a problem with Unicode text not being displayed properly in the
  following functions:

    AskFileText
    AskItemList
    AskLine
    AskPassword
    AskTextBox

  Fixed a problem with the Unicode version of AskPassword not returning a
  Unicode string.


WB 2007B  Feb 23, 2007

  For the Box functions which take a "coordinates" parameter, the maximum
  length of each coordinate has been increased from 5 to 6 characters.

  Compiler modified to insert Vista UAC manifest information into the EXE.
  Options available in the compiler "Settings" dialog to specify the
  "requested execution level" and "user interface access" flags for the
  compiled EXE.

  Compiler modified to optionally codesign "Authenticode" the compiled EXE
  with a purchased code signing certificate.


DLL 5.13bem  First showing up in WB 2007B

  New functions:

    ArraySwapElements(array, subA1, subA2, subA3, subA4, subA5, subB1, subB2, subB3, subB4, subB5)
      Swaps elements in an array.

        This function swaps the values of two elements in an array.

          "subA1" to "subA5" specify the subscripts of element "A"
          "subB1" to "subB5" specify the subscripts of element "B"

            Specify "0" for unused dimensions.  For example, to identify the
            array element "arr[1,5]", subA1 is 1 and subA2 is 5.

      Returns 1.

    PtrGlobalTest(var)
      Tests whether a variable has been marked as being globally accessible.

        "var" specifies a variable name.

      Returns @TRUE or @FALSE.

    StrInsert(u:base-string, u:new-string, [u:pad-string [, i:start [, i:length]]]) 
      (Windows NT/2000/XP/2003/Vista or newer)
      Inserts a new string into an existing string.

        "base-string" specifies the existing string.

        "new-string" specifies the string to be inserted into "base-string".

        "pad-string" specifies a character or string to be used for padding,
        if necessary.  The default is a space (' ').

        "start" specifies the position in "base-string" after which
        "new-string" is to be inserted, where the position of the first
        character of the string is 1.  To insert at the very beginning of
        "base-string", specify a value of 0.  You can specify -1 to
        insert after the end of "base-string".  If "start" is past the end
        of "base-string", padding will be inserted between the end of
        "base-string" and the beginning of "new-string".  The default is 0.

        "length" specifies the number of characters to insert.  If "length"
        is shorter than the length of "new-string", "new-string" will be
        truncated.  If "length" is longer than the length of "new-string",
        padding will be inserted after the end of "new-string".  The default
        is the length of "new-string".

      Returns the modified string.

    StrOverlay(u:base-string, u:new-string, [u:pad-string [, i:start [, i:length]]]) 
      (Windows NT/2000/XP/2003/Vista or newer)
      Overlays a new string onto an existing string.

        "base-string" specifies the existing string.

        "new-string" specifies the string to be overlaid onto "base-string".

        "pad-string" specifies a character or string to be used for padding,
        if necessary.  The default is a space (' ').

        "start" specifies the position in "base-string" at which "new-string"
        is to be overlaid, where the position of the first character of the
        string is 1.  You can specify -1 to overlay after the end of
        "base-string".  If "start" is past the end of "base-string", padding
        will be inserted between the end of "base-string" and the beginning
        of "new-string".  The default is 1.

        "length" specifies the number of characters to overlay.  If "length"
        is shorter than the length of "new-string", "new-string" will be
        truncated.  If "length" is longer than the length of "new-string",
        padding will be overlaid after the end of "new-string".  The default
        is the length of "new-string".

      Returns the modified string.

  New IntControls:

    IntControl(93, p1, p2, p3, 0)
      Performs certificate operations.

        p1   Meaning
        --   -------
         0   Sign a file (Windows XP/Vista or newer)
               p2 specifies a tab-delimited string with the following five parameters:
                 file to sign
                 certificate friendly name
                 description of file being signed (can be "" if not needed)
                 location (URL) of information about file (can be "" if not needed)
                 URL of timestamp server (can be "" if not needed)

         1   Get the thumbprint of a certificate in a file
               p2 specifies a .CER or .SPC file

         2   Set the friendly name of a certificate
               p2 specifies the thumbprint of a certificate
               p3 specifies the friendly name to set

    IntControl(94, i:filehandle, 0, 0, 0)
      Returns the real file handle corresponding to a WIL file handle.

      Returns a Windows file handle, or 0 if "filehandle" is invalid.

  Changed the optional parameters in AppExist and AppWaitClose:

    AppExist(s:program-name [, i:flags [, i:retries]])
    AppWaitClose(s:program-name [, i:flags [, i:retries]])

      The old "current-session-only" parameter has been expanded to a "flags"
      parameter, which is a bitmask of values that may be combined using the
      bitwise OR ('|') operator.  The following values may be specified:

        Value  Meaning
        -----  -------
          1    current-session-only (same meaning as before)
          2    "program-name" specifies a process ID instead of a program name

      By default, AppExist and AppWaitClose retry up to 7 times (with a
      half-second delay between tries) before returning, if the specified
      application doesn't exist.  You can override this by specifying a
      different value for "retries", which may be >= 0 (0 = no retries).

  Added a parameter to IntControl(31):

    IntControl (31, p1, 0, 0, 0)

      p1  Meaning
      --  -------
       0  enumerate Explorer windows of class ExploreWClass
       1  enumerate 32-bit Explorer windows of class CabinetWClass

  Changed the method ShortcutDir uses, for better compatability.  It now
  uses an API call instead of a registry lookup.  If the new method fails,
  it will fall back to use the old method.  The "source" parameter is no
  longer used.

  FileGet and FileRead now use the code page set by ChrSetCodePage for
  Unicode conversion of file contents, instead of the ANSI code page.

  WWWBATCH.INI is now placed in the [Application Data]\WinBatch\Settings
  directory, instead of in the Windows directory.

  Note that IntControl(31) only enumerates 32-bit Explorer windows.

  Display and Pause will now call a Unicode version of the function in
  Windows NT/2000/XP/2003/Vista or newer if "title" or "text" is a Unicode string.

  Fixed a problem with FileInfoToArray and DirInfoToArray returning negative
  numbers for file sizes between 2GB and 4GB, when "flag" 2 was specified.

  ExeTypeInfo now returns 20 for 64-bit Windows EXE's (Windows NT/2000/XP/2003/Vista or newer).

  Changes to OLE support:

    Fixed problem that occasionally caused an error message to display when
    a COMCONTROL fired an event before its dialog's dialog callback finished
    processing the previous event.


WB 2007C  Apr 26, 2007


DLL 5.14cen  First showing up in WB 2007C

  New functions:

    FileDigest(u:filename, s:algorithm, i:format)
      Computes a message digest (hash) for a file.

        "filename" specifies the file to hash.

        "algorithm" specifies the hash algorithm to use, and can be one of
        the following:

          MD2
          MD5
          SHA
          SHA1

            Note that "SHA" and "SHA1" are the same.

        "format" specifies the format of the returned string.

          If "format" is 0, the message digest is returned as an unformatted
          sequence of hex characters, with each byte in the digest
          represented by two hex characters in the returned string.  For
          example:

            00112233445566778899AABBCCDDEEFF          (MD2/MD5  = 16 bytes)
            00112233445566778899AABBCCDDEEFF00112233  (SHA/SHA1 = 20 bytes)

          If "format" is 1, then hyphens (for MD2 and MD5) or spaces (for
          SHA and SHA1) are inserted after every 8 characters in the
          returned string.  For example:

            00112233-44556677-8899AABB-CCDDEEFF           (MD2/MD5  = 16 bytes)
            00112233 44556677 8899AABB CCDDEEFF 00112233  (SHA/SHA1 = 20 bytes)

    UacElevationLevel() (Windows Vista or newer)
      Gets the current UAC elevation level.

      Return value is one of the following levels:

        Level  Meaning
        -----  -------
          0    Error, or unsupported platform.
          1    Process is default (UAC is disabled, or standard user).
          2    Process is running elevated.
          3    Process is not running elevated (user is in Administrators group).

    UacExePromptTest(u:program-name) (Windows Vista or newer)
      Determines whether a program would require a UAC elevation prompt.

        "program-name" specifies the EXE to be run.

      Return value is one of the following:

        Value  Meaning
        -----  -------
         -1    running program would return an error
          0    program would not require elevation
          1    program would require elevation

    UacManifestSettings(i:request)
      Gets information on manifest and signature.

      This function retrieves information about the currently running program.

        Request  Meaning
        -------  -------
           0     Manifest present? (@TRUE or @FALSE)
           1     Manifest requested execution level (string)
           2     Manifest uiAccess (string)
           3     Does file have a valid signature? (@TRUE or @FALSE)

  Fixed a problem using the ':' string concatenation operator in an OLE
  property assignment.

  RegOpenFlags now returns the previous flag value.

  ArrInitialize now supports a Unicode "value".

  Changed StrInsert to treat the optional "start" parameter as the position
  in "base-string" BEFORE which "new-string" is to be inserted, instead of
  after which.  Therefore, to insert at the very beginning of "base-string",
  you would specify a "start" value of 1, and 1 is now the default value if
  the "start" parameter is not specified.

  Fixed problem with the MousePlay function not recognizing secondary
  monitors when they are logically above or to the left of the primary
  monitor on multi-monitor systems.

  Fixed a problem with MouseMove not handling negative coordinates properly.

  Added an optional parameter to FileOpen:

    FileOpen(filename, mode [, i:Unicode [, i:timeout]])

      The "timeout" option specifies the number of seconds to spend retrying
      the file open operation if it fails due to a sharing violation.  The
      default is 0, for no retry.  If "timeout" is 1 to 20, the operation
      will be retried 20 times, evenly-spaced over the specified time period.
      If "timeout" is greater than 20, the operation will be retried once
      every second for the specified time period.  If "timeout" is -1, the
      operation will be retried once every second with no timeout.  If the
      file can be opened before the specified time period has elapsed,
      FileOpen will return successfully, otherwise it will fail.

  Fixed a problem with input not being re-enabled for a Terminate command
  (if it had been disabled with IgnoreInput).

  Fixed a problem with the Run[..] commands crashing if there was a registry
  key under "App Paths" that matched the name of the program being run, but
  whose "(Default)" value didn't match the path of the program being run.

  Changed the RegSet[..] functions to open the registry key with
  KEY_SET_VALUE access instead of KEY_WRITE access, if "subkey-string"
  was specified.  Also made a similar change to AskColor and AskFont.

  Changes to the Dialog function and related functions:

    Added Security Icon Shield (Vista Only) style (8192) to PUSHBUTTON and
    PICTUREBUTTON controls.

    Fixed problem with DialogControlGet returning zero (0) instead of an
    empty string ("") for single selection ITEMBOX and FILELISTBOX controls
    without a user selection.


WIL Type Viewer  First showing up in WB 2007C

  Fixed bug that sometimes caused property parameters to not be shown in
  the "Syntax:" section of the "Selected member detail" window.

  The viewer now displays the names of properties and methods that
  have been flagged as hidden by the type information's author.  Text has
  been added to the "Selected member detail" window to indicate that a
  member is flagged as hidden.


WB 2007D  Aug 28, 2007


DLL 5.14den  First showing up in WB 2007D

  Fixed a problem with AppExist always returning @TRUE if 2 was specified
  for "flags".  Also, note that for AppExist and AppWaitClose, if 2 is
  specified for "flags", then the function returns a result immediately
  regardless of the "retries" parameter.

  Added a new request # to DiskScan:

    Request   Returns
    -------   -------
       32     list of remembered (persistent) but currently non-connected drives.

  DiskScan(0) no longer returns drives that are remembered (persistent) but
  not currently connected.  These are now returned by DiskScan(32).

  Fixed a problem that could occur when using comparison operators on
  strings containing integer values larger than 2147483647.

  RegLoadHive no longer returns a "file not found" error if "filename" is
  relative to a remote computer where "handle" is connected from.

  Fixed a problem with StrFixBytesL, StrFixCharsL, and StrFixLeft, when
  "pad-string" specified more than one character.

  Changed IntControl(59) and IntControl(60) to use SendMessageTimeout
  instead of SendMessage.


PopMenu and FileMenu 2007D  First showing up in WB 2007D

  Changes made to PopMenu and FileMenu to fix the Error 1932: Winexec
  Function Failed [ The requested operation requires elevation ] on Windows
  Vista.  Changed Run statements to ShellExecute in menu files.

WB 2007E  Oct 24, 2007

DLL 5.16dep  First showing up in WB 2007E

  Manifested versions of various WinBatch tools (WinBatch and WinBatch Studio).

  Menu files updated to use ShellExecute rather than Run. This allows Vista to 
  prompt the user for elevation, if necessary.

  Debugtrace now logs COM and Dialog Callback Events.

  Fixed a problem with ChrStringtoHex and ChrUnicodetoHex crashing when passed 
  high order characters.

  Fixed problem with DebugTrace accessing dangling COM object references.

  Fixed problem that incorrectly allowed assignment to COM object properties 
  in the 'if' line of a structured 'if' statement block.
  
  Fixed daylight saving time problem with IntControl 58.

  Added Unicode support to Arrayize.

   Fixed problem with DebugTrace accessing dangling COM object references.

  Fixed problem that incorrectly allowed assignment to COM object properties
  in the 'if' line of   a structured 'if' statement block.

  The following functions now return and accept Unicode strings directory path
  names without conversion to MBCS on Windows NT/2000/XP/2003/Vista or newer:

  DirAttrGet
  DirAttrGetEx
  DirAttrSet
  DirAttrSetEx
  DirChange
  DirExist
  DirGet
  DirHome
  DirMake
  DirRemove
  DirRename
  DirSize
  DirWindows

  
WB 2008A Jan 30, 2008

DLL 6.08aha  First showing up in WB 2008A
  
  Added request 64 to the DiskScan function. This request causes the function 
  to return a list of all USB bus disk drives. (Windows 2000 and later only)

  Added test to LogDisk, DiskFree, DiskSize, DiskInfo, DiskVolInfo to prevent 
  system error 13 dialogs from appearing when the functions attempt to access 
  drives that the DiskScan function lists but have actually been removed or do 
  not contain media.

  Fixed memory leak that occurred during certain string coercion processing.

  Fixed corrupted string return issue in IntControl 77 option 72. 

  Changed WIL DLL version strings scheme.

WB 2008B  Feb 20, 2008

DLL 6.08bhb  First showing up in WB 2008B
   
   Fixed Winsock Extender dll unload issue when debugging in WinBatch Studio 
   causing future Winsock AddExtender statments to fail.  

   Documentation updates. New COM help file with lots of example code.

WB 2008C  May 13, 2008
   
DLL 6.08chc  First showing up in WB 2008C
   
   Modified imbedded manifests to handle high resolution monitors (DPI aware).

   Fixed DebugTrace problem that caused option 102 to be ignored.

   WIL Type Viewer 
 
	   Added environment variable expansion to type library paths displayed in the 
	   Type Library List page for Vista.
	
	   Added a "Previous" button to the Object Tree search dialog.
	
	   Added a "Cancel" button to the Object Tree repeat search message dialog.
	
	   Fixed occasional memory corruption problem caused by switching tabs after 
	   using tree control search dialog.
	
	   Added check for and removal of quotes surrounding type library full file 
	   names before attempting to find and open the library file.
	
	   Added ability to sort by any column of either the type library and programmic 
	   identifier lists.
	
	   Made searches on the Programmic Identifier List page circular.
	
	   Miscellaneous usability and stability improvements.

WB 2008D July 18, 2008
   
DLL 6.08dhd  First showing up in WB 2008D
   
   Fix to allow a compiled script to pass MS Logo certification as tested by 
   MS Application Verifier.

WB 2008E November 12, 2008
   
DLL 6.08ehe  First showing up in WB 2008E
   
   Floating point COM VARIANTs (ObjectType types 'R4' and 'R8') now use 
   standard WinBatch decimal conversion rules when displayed as text. The 
   display rules do not affect the actual value of the VARIANT variable.

   Changed the RegOpenFlags function to accept the parameter values 32 and 64. 
   These values supersede the old values 1 and 2 and set the registry view to either
   32-bit or 64-bit respectively. Using the new values on 64-bit Windows causes all
   registry function that accept subkey string paths to error, if a subkey contains the
   string 'wow6432node'.

   Changed registry functions to accept an optional parameter the controls which registry
   view the function uses when accessing the Windows registry. The optional parameter's
   values can be 32 to use the 32-bit view, 64 to use the 64-bit view, or 0 to use the view
   indicated by the last call to the RegOpenFlags.The parameter value of 0 can also causes
   a  function to use the WinBatch default 64-bit view, if no call to RegOpenFlags has been
   made and setting the parameter to 0 is equivalent to omitting the parameter entirely. 
   Using the 32 or 64 values cause these functions to error if a function's subkey parameter
   contains the string 'wow6432node'. Setting the parameter to one of the valid values 
   has no effect when running on 32-bit Windows. This change applies to the following 
   functions:

      RegCreateKey
      RegExistKey
      RegDeleteKey
      RegDelValue
      RegExistValue
      RegOpenKey
      RegOpenKeyEx
      RegEntryType
      RegSetBin
      RegSetExpsz
      RegSetQword
      RegSetValue
      RegSetMulsz
      RegSetEx
      RegQueryBin
      RegQueryExpsz
      RegQueryQword
      RegQueryStr
      RegQueryValue
      RegQueryDword
      RegQueryMulsz
      RegQueryEx
      RegQueryItem
      RegQueryKeyLastWriteTime

   The following two functions have been modified to accept the 32 and 64 view values
   as values for their existing optional parameter. The new values can be use to combine 
   with the previously existing values by using the 'OR' (|) operator:

      RegSetDword
      RegQueryDword

   The following function has been modified to accept the three view values 0, 32 and
   64 in it's previously reserved fourth parameter:

      RegOpenKeyEx


 Changes to the Dialog function and related functions:

   New 6.2 dialog adds a required 'Name' attribute to control definition strings. The new 
   attribute is passed as the third parameter to user-defined-callback procedures and must be 
   used as the second parameter to the DialogControlSet, DialogControlGet,DialogControlState, 
   and DialogObject functions. Note: 6.1 style dialogs are still fully supported.

   DialogControlState now returns the control name of the control with the input focus and 
   an empty string when using request-code 5 and no control has the input focus. (Applies to 
   dialogs with 6.2 or later format only)

   The User Defined Dialog Callback function now receives a control name instead of control 
   number in the third parameneter. (Applies to dialogs with 6.2 or later format only)

   The function DialogControlSet, DialogControlGet, DialogControlState, and DialogObject now 
   take a control name instead of a control number as their second parameter. (Applies to 
   dialogs with 6.2 or later format only)

   Added new request 17 to DialogControlGet/Set. Retrieves/sets the size and location of a 
   control within a dialog's client area.

 WIL Dialog Editor Changes:

   Added 'Convert' menu item and tool bar button to WIL Dialog Editor that converts the current 
   dialog template from the 6.1 to the 6.2 dialog format. (Any user-defined-callback procedure 
   associated with a converted dialog must still be modified to be used with the new format.)

   Added an input for the 'Name' control attribute to the Dialog Editor's General page of the 
   Control Attribute property sheet.

   WIL Dialog Editor no longer runs on Microsoft Windows operating systems earlier than 
   Windows 2000.

   Miscellaneous minor fixes and improvements to WIL Dialog Editor.
   
   Changed the virtual to screen coordinates conversion technique in MouseMove
   and MousePlay to better match the technique used in other WIL functions.

   Change WinMacro's script generator to match the new coordinates conversion now used 
   by MousePlay.

   Added new optional string parameter to the RegConnect function. Use optional parameter
    to indicate the processor acrhitecture or 'bitness' used by the remote operating system. 
   Set the optional parameter to the string "RemoteOS32", if the remote computer is running 
   a 32-bit version of Windows and the computer running the script is using a 64-bit version 
   of Windows. Set the optional parameter to "RemoteOS64", if the remote computer is 
   running a 64-bit version of Windows and the computer running the script is using 32-bit
   version of Windows. If the remote computer and the computer running the script are using
   the same bitness, do not supply a value for this parameter.

   Modified the TimeDelay function to no longer be sensitive to changes to the system time
   settings when a positive time value is used.


  The dialog changes require changes to the DialogProcOptions help file topic.

WB 2009A January 12, 2009
   
DLL 6.09aia  First showing up in WB 2009A

   The registry functions will now call a Unicode version of the function on 
   Windows NT/2000/XP/2003/Vista/2008 systems.

 Changes to the Dialog function and related functions:

   Added DialogProcOptions request-code 1004. Accepts a dialog control number 
   as the third parameter and returns the name of the control associated with the 
   number.

   Added DialogProcOptions request-code 1005. Accepts a dialog control name as
   the third parameter and returns the control number associated with the name.

WB 2009B January 28, 2009
   
DLL 6.09bib  First showing up in WB 2009B 
   
   Fixed problem in TimeDelay function that caused the function to sometimes 
   hang in dialog user-defined-callback procedures.

  Fixed problem in several registry functions that could cause a memory access
  violation.

 WIL Dialog Editor Changes:

  Removed duplicate control names warning message that sometime appeared
  when saving 6.1 dialog templates with Dialog Editor.

  Fixed problem in Dialog Editor that prevented control text that contained extended 
  ANSI characters from being used properly when creating control names.

  Fixed problem in the UacManifestSettings function that prevented it from reading
  internal manifests correctly.


WB 2009C October 16, 2009

DLL 6.09cic First showing up in WB 2009C

   
   Added "Compatibility" section to application manifests for Windows 7 support. 
   
   Added surrounding quotes to the WinBatch Studio tools command line for the WIL 
   Dialog Editor and the WinBatch Compiler.
   
   Added Dialog Editor, WinBatch Compiler, and Type Viewer buttons to WinBatch 
   Studio main tool bar and removed them as user tools.
   
   Fixed WinBatch Studio problem that caused the Status Bar time display to be 
   off by one hour around DST changes.

   Fixed WinBatch Studio install problem that caused the registry update failure 
   with some low privilege Vista user accounts.

   Added WinBatch Studio detection of read-only file status changes to allow or 
   prevent editing of files after outside program adds or removes read-only status 
   from a file open in the work space.

   Fixed RunWithLogon function problem that caused the dot "." to not work properly 
   as the domain parameter when using cached domain credentials.
   
   Fixed error in ArrInitialize function that caused UDF variable table corruption 
   when a UDF is passed a persistent pointer to an array.

   Fixed problem in the ItemSort function that caused an extra delimiter to be 
   added to return lists that contained ony delimiters.

   Added test and error for a negative offset parameter to the BinaryEodSet function.

   Fixed memory handle management issue that on rare occasions caused the unexpected 
   termination of the WinBatch and WinBatch Studio.

   Setup doesn't install Filemenu.exe on Win7 64-bit, because 32 bit Windows explorer
   no longer available on this platform.
  
   Dialog function modified to work on Win7 64-bit. 

   Changed IntControl 31 request 1 to return 64-bit Explorer window ID's on Windows 7 64-bit.

   Added request 10  to the MouseInfo function. Similar to request 0 except it also
   returns the window name of static, hidden and disabled child windows that have 
   a caption. Examples of static windows include WIL Dialog VARYTEXT, STATICTEXT 
   and PICTURE controls.

 Changes to the Dialog function and related functions: 

   Fixed bug in WIL Dialog SPINNER control that allow the control to accept out of 
   numeric range or character data.

   Added two new "control" types, MENUBAR and MENUITEM. The two new types provide        
   support for menus in WIL dialogs.  Adding a MENUBAR to a dialog template causes a
   menu bar to  be displayed at the top of a dialog's client area.  MENUITEMs can be
   associated with the dialog's menu bar, another MENUITEM as a sub menu or a 
   control or the dialog as a context menu.

   Added two new styles for the DialogControlState request #3 that are applicable 
   to MENUITEMs. Style 32768 causes the MENUITEM to display a check to the left of 
   the control. Style 65536 is used to display a dot graphic to the left of the 
   menu item.

   Added DialogProcOptions event-option-code 15 to indicate that a user-defined 
   callback procedure should accept MENUITEM commands.
   
   Increased the maximum number of controls per WIL dialog from 200 to 300.

   Fixed problem that caused parts of a CALENDAR control to remain visible when 
   the control's style was changed to invisible while process a CALENDAR date selection 
   notification in the callback.
   
 WIL Dialog Editor Changes:

   Add Menu Editor to support MENUBAR and MENUITEM controls.

   Add F10 hotkey to the Run Dialog menu item.

WB 2009D December 1, 2009 [ Beta Only ]

WB 2010A January 27, 2010

DLL 6.10aja First showing up in WB 2010A

   New functions:

      ArrayFromStr(string)
        Accepts a text string and returns a one dimension array with one string 
        character per array element. 
       
      ArrayToStr(array)
        Accepts a single dimension array and returns a text string constructed from the 
        concatenation the array's elements.
 
      ArraySort(array,[options,[sort-column,[start-sub,[end-sub]]]])
        Performs an in-place sort of arrays with one or two dimensions.
          
          "array"       array to sort.

          "options"     @ASCENDING for an ascending sort (the default) or 
                        @DESCENDING for a descending sort.

          "sort-column" subscript of column to sort on for two-dimensional arrays. 
                        The default is 0.
          
          "start-sub"   subscript of first row to include in sort. Default is 0.

          "end-sub"     subscript of last row to include in sort. Default is ArrInfo(array,1)-1

      ArrayLocate(array,value,[sub1, [sub2, [sub3, [sub4, [sub5]]]]])
        Searches for an array an element that matches a value. 

        Returns a single dimensioned array that with one element per dimension of the 
        searched array. Each element of the returned array holds one subscript of the 
        element with the value when found and -1 if the value is not found.
           
           "array"      array to search

           "value"      value to search for in "array"

           "sub1-sub5"  specifies the subscripts of the first element to search 
                        in the array. The default for each parameter is 0.

   Added new 'elseif' conditonal statement for use in conjunction with the structured 
   'if', 'else' and 'endif' syntax.  Like the 'if' the 'elseif' evaluates the expression 
   following it and the expression must evaluate to an integer.  But unlike the 'if' 
   statement the 'elseif' statement is only evaluated if a preceding 'if' or 'elseif' 
   statement has evaluated to zero (@False).  When an 'elseif' statement evaluates to 
   a non zero value (@TRUE), the series of statements after the 'elseif' statement up 
   to the next matching 'elsif','else' or 'endif' are executed. Once an 'if' or 'elseif' 
   statement in a if...elseif...else...endif syntax group evalutes to a non zero value (@TRUE),
   no other 'elseif' statements in the group are evaluated. The 'elseif' statement cannot 
   be used with standalone 'if' and 'else' statements.

   Fixed problem that caused a memory access violation when converting a variable 
   containing COM object references to a floating point number.

   Fixed memory leak in WinBatch Studio.

   Fixed WinBatch Studio's variable content display window so that it no longer 
   displays extraneous contents under certain conditions.
 
   Changed WinBatch Studio so that for most installations previously defined user tools are 
   not lost when upgrading from a pre 2009C version of WinBatch. (Tool bar buttons may 
   still need to be re-added.)

   Increase the 'DllCall' and 'DllCallCdecl' entry point parameter limits from 15 to 20.

   Fixed problem in WinBatch Studio hints on Windows 7.

   Fixes WinBatch Studio stack corruption problem that would occasionally cause a crash.


 Changes to the Dialog function and related functions: 

   Changed EDITBOX and SPINNER controls so they can be drawn on top of other 
   dialog controls while still drawing correctly on Windows 7.
   
   Added DialogProcOptions event-option-code 16 which causes a user-defined callback 
   procedure to receive an event notification when a dropdown menu, submenu, or context 
   menus is about to be displayed.  The name of the menu hosting control or menu item 
   is passed to the user-defined callback as the value of its third parameter.

   Added DialogControlGet request-code 18 which accepts the name of a regular control, 
   menu item or the menu bar and returns a list of the names of MENUITEMs directly 
   associated with the named control or menu item.
 
   DialogProcOptions now errors if an attempt is made to use 6.2 format dialog only 
   event-option-code with a 6.1 or older dialog format.

   Added DialogControlGet request-code 19 which accepts the name of a regular control
   and returns a window handle. The request cannot be used on MENUITEM and MENUBAR 
   controls because these controls are not windows.
 
  
 WB 2010B July 28, 2010

 DLL 6.10bjb First showing up in WB 2010B

   New functions:

      ArrayRedim ( array, sub1, [sub2, [sub3, [sub4, [sub5]]] )
         Changes array dimensions in-place while preserving existing content when possible.

         "array" array to re-dimension
         "sub1" to "sub5" specifies the new "array" dimensions or -1 to keep existing dimensions.

         The default for "sub2" through "sub5" is 0 which deletes the existing dimension.
         Once an array dimension is set to 0, all subsequent array dimensions must be
         set to 0 or omitted.  -1 can also be used  for subsequent dimensions if current
         corresponding dimension is already 0.

         Returns @True on successful completion.

      ArrayRemove(a:array,i:sub, [i:dim])
         Performs in-place removal of an element from a single dimension array, or 
         the in-place removal of a row or column from a two dimension array. 
 
         "array" remove an element, row, or column from this array.
         "sub" subscript of the element to remove in single dimension array. Subscript of the
               row or column to remove in a two dimension array.
         "dim" must be 1 or omitted for one dimension arrays. Must be either 1 to delete an
               array row or 2 to delete an array column from a two dimension array.

         Returns @True on successful completion.

   Changed ArraySort to return 1 instead of 0 on successful completion.

   Fixed problem that caused the contents of the wberrorarray variable to be destroyed 
   when the variable was passed as a parameter to a function.
      
   Change behavior of BinaryBufInfo request -1 to return @false and not generate an 
   error when passed a freed binary buffer.

   Fixed problem with ShortcutInfo that prevented the return of the shortcut's target 
   file when both the shortcut and target are on a remote machine.

   Changed IntControl 31 to enumerate only 64-bit Explorer windows on X64 versions 
   of Windows.

   DiskScan request 64 no longer causes an error when checking a virtual drive letter 
   created with the SUBST command.

   Added manifest settings, code signature status and elevation level to the debug 
   trace file's system status information section.

   The 'Debug' dialog displayed by the Debug function now displays the contents of 
   variables by truncating any text that would otherwise extend beyond the dialog's 
   boarders. Previously, the dialog some times did not display any text when the 
   variable's text was to long to fit within the dialog.


 FileMenu Shell Extension

   The WinBatch FileMenu shell extension now works with 64-bit Explorer on X64 versions 
   of Windows and is no longer dependant on the 32-bit Explorer on 64-bit systems.

 Changes to the Dialog function and related functions

   Add two new dialog template variables <dlg-variable>MinWidth and <dlg-variable>MinHeight 
   that can be used to indicate the approximate minimum width and height of the dialog 
   window that can be set by dragging the dialog's boarders. The values are assumed 
   to be in dialog units and to not include the height of the title and menu bars. When 
   either of these variables is present in a dialog template, the dialog becomes re-sizable 
   by either directly dragging the dialog's boarder or by using the 'Size' system menu.

   Added new DialogProcOptions request code 17 that causes a call to a dialog's 
   user-defined-callback procedure when the dialog is resized, maximized, or restored from 
   maximized to normal size. 

   When the user-defined-callback is called with the resize request, the fifth parameter 
   to the user-defined-callback procedure contains a space delimited 
   list who's items represent the delta (change) in width and height of the dialog in dialog 
   units and can be either negative or positive numbers and the actual dialog width and height 
   in dialog units. The dialog height and width represent the internally maintained size of 
   the dialog's client area.  The client are is the area of a window used to display controls 
   and its size does not include the dialog window's borders, menu bar, nor title bar. 
   The data returned by the user-defined-callback is in this format:
   {delta_width} {delta_height} {actual_width} actual_height}

   The dialog template must use the <dlg-variable>MinWidth and/or 
   <dlg-variable>MinHeight variables in order to use DialogProcOptions option 17. 
   The DialogProcOptions function will error, if this request code is used with a dialog 
   template that does not contain at least one of these variables.

   The Dialog Editor now disables the "Run Dialog" menu item and button when a dialog 
   contains a FILELISTBOX but no Cancel button (a button with the value attribute of zero.)
  
   Fixed problem on Windows Vista and 7 that caused a the dialog to be too small when
   the  dialog was created with a resize borders.

   Added request-code #1007 to the DialogProcOptions function.  This request-code returns the
   internally maintained width and height of the dialog's client area in dialog-units as a space
   delimited list. The returned client area dimensions are the dialog's size not including the width
   and height of  borders, the height of the menu bar, nor the height of the title bar. The third
   parameter to DialogProcOptions must be set to -1 when using this request code.

 WB 2010C July 29, 2010

 DLL 6.10cjc First showing up in WB 2010C

   Fixed a problem in the ArrayLocate and ArraySort functions that under certain conditions 
   could cause a memory leak in the WinBatch string table.

 WB 2010D Nov 17, 2010 [ Beta Only ]

 WB 2011A Jan 19, 2011
 
 DLL 6.11aka First showing up in WB 2011A

   Fixed problem in Dialog Editor's 'Attribute' property sheet that caused error messages
   to be displayed even though no error existed.

   Fixed problem in the BoxDataClear function when used with error suppression that could
   cause the WinBatch Studio debugger to hang.

   Fixed memory leak caused by the 'ArrayRedim' function when a re-dimensioned array was
   later dropped using either the 'Drop' or 'DropWild' function.

   Added support for the new Vista/Windows 7 style shell file dialogs to the 'AskFileName'
   function. The new dialog style can be invoked by adding 100 to the values passed in the
   function's 'flag' parameter.  Each of the four values 100, 101, 102 and 103 otherwise
   have the same effect as the corresponding 0, 1, 2, and 3 values. If one of the 100-plus
   values is used on a system running a version of Windows predating Vista/2008, the added
   100 is ignored and the function reverts to the older common file dialog style.

   ArrayFileGet and ArrayFileGetCsv now attempt to report the line number of the first
   invalid line encountered as "More Error Information".

   Made a minor performance improvement to the 'ArraySort' function.

   Made minor change to the search order used by WinBatch tools and compiled WinBatch 
   scripts when attempting to locate the WIL interpreter. This change addresses a protential 
   security issue describe in Microsoft Security Advisory No. 2269637.

   Added the compile script executable's name to the "DLL File not found in path." error 
   message box's title.

   Added workaround in the dialog COM Automation event handler implementation to process
   invalid event parameter data supplied by a COM object or control. This workaround 
   prevents some "Invalid Argument" COM errors during event callbacks to a user defined 
   function.

   Fixed problem that caused all dialog check boxes with a value greater than or equal to 
   32768 to be selected when a common check box variable contained the value of single 
   check box greater than or equal to 32768.

   Fixed problem that could cause a memory access violation when a COM Automation
   object is destroyed inside the object's event handler UDS while also accessing a 
   member of the same object outside the event handler UDS. This problem did not 
   effect event handler UDFs.

  New Functions
  
      ArraySearch( array, value[, options[, search-column[, start-sub[, end-sub]]]])
         Searches a one or two dimension array for an element that matches a value. Returns the
         index of the found element of a single dimension array, the index of the row containing
         the found element of two dimension array , or -1 if the value is not found. The function
         can optionally search using a fast binary search but the array must first be sorted on
         
         "search-column' using the "ArraySort" function.

         "array"         array to search.

         "value"         value to find in "array".

         "options"       0 to match case (the default), 
                         1 to do a fast search on a sorted "search-column",
                         2 to search ignoring case, or 
                         3 to do a fast search and ignore case.

         "search-column" subscript of column to search for two-dimensional arrays. 
                         The default is 0.

         "start-sub"     subscript of first element or row to include in search. 
                         The default is 0.

         "end-sub"       subscript of last element or row to include in search. 
                         The default is ArrInfo(array,1)-1.

      ArrayInsert( array, sub[, dim [,value]] )
         Performs in-place insertion of an element into a single dimension array, or the in-place 
         insertion of a row or column into a two dimension array.  Returns @True on successful 
         completion.

         "array"   insert an element, row, or column into this array.

         "sub"     subscript of the element to insirt into single dimension array. 
                   Subscript of the row or column to insert into a two dimension array.

         "dim"     must be 1 or omitted for single dimension arrays. Must be either 1 
                   to insert an array row or 2 to insert an array column into a two 
                   dimension array.

         "value"   initial value of inserted element(s).

  WinBatch Studio Changes

     Corrected debug window problem that sometimes caused a memory access violation when
     viewing the contents of a zero dimension array after viewing the contents of a 
     multi-dimension array.
     
     Corrected problem that under certain conditions could cause corruption
     of the PATH environment variable used by scripts started with the 
     WinBatch Studio 'Run' command.

 Introduction To Programming Book Mar 1, 2011

   Released the second edition of the Introduction to Programming Book in PDF form. 
   Available for download from our website or from the CD-ROM.

 WB 2011B Aug 30, 2011
 
 DLL 6.11bkb First showing up in WB 2011B

   WinBatch and the WinBatch+Compiler are now available with native 64-bit (x64) executables.
   The x64 version of WinBatch or WinBatch+Compiler are available for installation whenever
   32-bit WinBatch or WinBatch+Compiler is installed onto a 64-bit system. Native 64-bit
   WinBatch and WinBatch+Compiler are not available for installation on 32-bit only or 64-bit
   systems without the WoW64 (Windows 32-bit On Windows 64-bit) subsystem.  However, scripts
   compiled with the WinBatch 64-bit compiler can be executed on x64 systems without WoW64
   installed. 64-bit WinBatch is not intended for use on Itanium (IA-64) based systems and 
   compiled WinBatch scripts cannot be executed as a native Itanium program.
   
   Changed implementation of the 'SvcWaitForCmd' native service function's logoff notification
   handling (SERVICE_CONTROL_LOGOFF return value) so that it now works reliably on Windows XP
   and newer.
   
   Compiled WinBatch script running as a native service can now receive startup parameters from
   the 'wntSvcStart' Network Extender function or from the Services.msc management console applet.
   This is in addition to command  line parameters already recieved via the Windows registry.
   
   The following additional control codes are now accepted by  the 'SvcSetAccept' function:
   1. SERVICE_ACCEPT_HARDWAREPROFILECHANGE (32) - the computer's hardware profile has changed.
   2. SERVICE_ACCEPT_POWEREVENT (64) - computer's power status has changed.
   3. SERVICE_ACCEPT_SESSIONCHANGE(128) - computer's session status has changed (requires XP/2003 or newer.)
   4. SERVICE_ACCEPT_PRESHUTDOWN(256) - computer is about to shutdown (requires Vista/2008 or newer.)
   
   The 'SvcWaitForCmd' function returns the following new values for the cooresponding new
   'SvcSetAccept' control codes:
   1. SERVICE_CONTROL_HARDWAREPROFILECHANGE (12) - the computer's hardware profile has changed.
   2. SERVICE_CONTROL_POWEREVENT (13) - power status has changed.
   3. SERVICE_CONTROL_SESSIONCHANGE (14) - session status has changed (requires XP/2003 or newer.)
   4. SERVICE_CONTROL_PRESHUTDOWN (15) - the system will be shutting down (requires Vista/2008 or newer.)
   
   Modified IntControl 1007 to improve responsiveness to mouse clicks on the notification area icon.
   
   Fixed problem that sometimes caused the directory parameter of AskFileName to be ignored.
   
   Modified ArraySearch to continue searching past undefined array elements rather than halt the
   search when an undefined element is encountered.

   The ArrayToStr function now errors if passed a multi-dimension array.
   
   Added support for the new 'callback' parameter type to the DllCall or DllCallcdec functions. This
   parameter type should be used for external DLL function parameters that accept pointers to
   application-defined callback functions.  The 'callback' type can only be used in conjunction
   with the callback handle supplied by the 'DllCallbackCreate' function. See the documentation for
   the new 'DllCallbackCreate' function for details.

   Added support for VT_I8 ("I8") and VT_UI8 ("UI8")  variants to the 'ObjectType' and 
   'BinaryAllocArray' functions.

   Added support for "I8" and  "UI8" parameter type specifications to COM object 
   method call parsing.
   
   Updated WIL extender SDK with new 'addons.h' file for 64-bit extenders.
   
   Fixed intermittent problem with the WindowsInfo.exe utility that prevented it 
   from starting.

   Modified the 'ShortcutDir' function to support "Known Folder Id" GUIDs on Windows 
   Vista/2008 and newer versions of Windows.

   Fixed slow initial Explorer file context menu display problem caused by FileMenu on 
   32-bit Windows Vista and newer versions of 32-bit Microsoft Windows.

   Fixed FileInfoToArray issue were the total file size returned was zero. It will 
   now return an integer or (if the value is greater than max signed integer) 
   a floating point value.
   
  New Functions
   
      ItemLocateWild(pattern, list, delimiter, start)
         Searches 'list' for first item that fully matches 'pattern' and returns the position 
         of the matching item or 0 if no item fully matches. The search starts with the item 
         indicated by the 'start' parameter. When an item satisfies the pattern, checking 
         of that item is halted. If the pattern is satisfied without consuming the entire 
         item, it is not considered a match and checking continues with the next item.
   
         In the wild-card pattern, "*" matches zero or more characters, and "?" matches any 
         one character.
   
         ItemLocateWild searches are case insensitive.
      
          "pattern"       the pattern to search for. May contain wildcards.
          "list"          a string containing a list of items.
          "delimiter"     a character to act as a delimiter between items in the list.
          "start"         position of first item to search.
   
      DllCallbackCreate(UDF-name, return-type, parameter-types)
          Associates a user defined function or subroutine with a callback handle.
          The returned handle can be used with DllCall or DllCallcdecl when calling
          external DLL functions that require a pointer to an application-defined callback
          function as a parameter. The UDF/UDS associated with the handle is executed
          when the external DLL function calls the application-defined function.
   
          The associated UDF/UDS must have the same number of parameters that the external
          DLL function expects for the application-defined callback.  The parameter types and
          return type specified in the second and third parameters must be compatible with the
          documented types for the application-defined callback function.
      
          Use the callback handle with DllCall or DllCallcdecl by passing the handle to
          the external function with the new 'callback' parameter type specifier. A maximum
          of 512 callback handles can be active at one time.
             
          "UDF-name"        name of previously defined user defined function or subroutine.
          "return-type"     Expected return data type. WORD, LONG, VOID, or DOUBLE
          "parameter-types" Space delimited list of the expected types of each parameter 
                            for the application-defined function. Each type must be 
                            either WORD, LONG, LPSTR, LPNULL, DOUBLE, or LPWSTR.
   
      DllCallbackDestroy(handle)
          Releases all resources associated with callback handle created by the 
          'DllCallbackCreate'function.  After destroying the handle, it cannot be used 
          as a parameter to the 'DllCall' or 'DllCallcdecl' functions.  The 
          DllCallbackDestroy function cannot be called from a UDF or UDS while it 
          is executing as an application-defined callback for an external function.
  
          "handle"    Callback handle returned by the DllCallbackCreate function.
   
       IntControl(96,0,0,0,0)
          This IntControl frees all resources associated with all callback handles created 
          by the 'DllCallbackCreate' function. No previously defined callback handles 
          can be used after a call to this IntControl. It cannot be used by a user defined 
          function or subroutine while the function or subroutine is executing an 
          application-defined callback for an external function.
   
          The IntControl returns the number of callback handles destroyed.
   
  64-bit WinBatch only

   WinMetrics(-3) now returns 5 when 64-bit WinBatch is executing the function on an
   Intel64/AMD64 system.
   
   IntControl 92 has no effect when a script is run by native 64-bit WinBatch or
   as a compiled native 64-bit executable.
 
WB 2012A Jan 9, 2012
 
 DLL 6.12ala First showing up in WB 2012A

   Fixed problem in 'RegQueryEx' function that caused an error when the 'subkey-string'
   parameter was a Unicode string and the 'type' parameter was set to 3.

   Changed 'ObjectCreate' function's remote server access to error 
   if it is unable to create the object on the remote system instead of first 
   attempting to use a local copy of the targeted object.
   
   Fixed problem with "IntControl 73" goto (p1=1) error handling 
   that caused the script lines following :WBERRORHANDLER goto label to be ignored when 
   an error occurred in the expression associated with an "ElseIf" or "Case" 
   statement.
   
   Incorporated workaround for bug in Windows Vista and newer Common Dialogs 
   that caused the WinBatch "AskFileName" function to return random 
   characters instead of redisplaying if a user selected to many files 
   when calling the function with multi-selection flag 2.
   
   Added an optional third parameter to the "AddExtender" function which can be 
   used to specify a file name for the 64-bit version of an extender. This allows 
   for the specification of both a 32-bit and 64-bit extender in a single system 
   architecture independent call to AddExtender. Specify zero(0) for the second 
   parameter if version checking is not needed and you are using the optional 
   third parameter.  Note that 64-bit WinBatch still treats the first parameter 
   as the file name of a 64-bit extender when no third parameter is present.
   
   AddExtender(filename, [version[, filename]])
      "Filename"  32-bit or 64-bit WIL extender Dll filename. Must be 32-bit 
                  extender if 3rd parameter is also used
      "Version"   [optional] minimum required extender version number
      "FileName"  [optional] 64-bit WIL extender Dll filename
      
   Added an optional parameter to both the "ChrHexToUnicode" and "ChrUnicodeToHex" 
   functions that permits the functions to either convert or create a hex strings 
   with most significant byte first Unicode (UTF-16) character byte pair order.
   
   ChrHexToUnicode(hex-string[, flag])
      "hex-string"  a Unicode string in hex format.
      "flag"        [optional] 0 (default), or 1 to reverse the byte order 
                    of each "hex-string" byte pair before converting to a Unicode 
                    character.
   
   ChrUnicodeToHex(Unicode-string [, flag])
      "Unicode-string"  a Unicode string
      "flag"            [optional] 0 (default), or 1 to reverse the order of each 
                        character byte pair in "Unicode-string" before adding it 
                        to the returned hex string.
   
   Added level 10 to the WinVersion function. Level 10 causes WinVersion to 
   return 1 when the current native Windows operating system is  32-bit and 
   2 when the current native Windows operation system is 64-bit. The value 
   returned is independent of the bitness of the current script's executable.
   
   Modified the "Drop" function to accept a single array element as a parameter.
   This permits setting an element of an array to the undefined 
   state while keeping the array and other elements defined. The function 
   does not support undefining COM Automation safe array elements.
   
   The "ObjectType" function was modified to no longer accept WIL array 
   with no elements as the second parameter.

   Modified 64-bit DllCall function so that it no longer generates an memory 
   access violation when an incorrect binary buffer is passed as a C structure 
   pointer parameters to a called dll entry point on Windows 7 systems.
   
   WIL Dialog Editor Changes:
   
    Corrected problem that could cause an access violation when an dialog template 
    with an invalid dialog font, text color or background color is loaded from the 
    clipboard.

    Modified menu editor dialog to show the currently selected menu item in high 
    contrast in the list view control even when the list view control does not 
    have the input focus.
   
   Setup Program Changes:
   
    No longer starts WinBatch Navigator when the '/silent' command line option is used.
   
   WinBatch Studio Changes:
   
    Increased the number of characters that can be displayed in the 'Find In Files' 
    window from 64KB to 1MB.
   
    Fixed problem in the arry and binary buffer variable viewing windows that 
    could cause a hard crash when editing variable content.

      
    Changed File related dialogs to use shell file dialog look and feel.
      
    Added a 64-bit debugger to allow scripts to be tested and debugged in a native 64-bit
    process using WinBatch Studio's debugger command. A menu option and tool bar button
    allow toggling between 64-bit and 32-bit debugger modes.
   
    Made numerous minor fixes to improve overall performance and reliability.
   
WB 2012B July 17, 2012
 
 DLL 6.12blb First showing up in WB 2012B

   Modified the ObjectCreate function to interpret a blank string in the second parameter to
   indicate that the object should be created using the local machine as the object server.

   WinBatch is no longer dependent on the msvfw32.dll at run time.  This allows the interpreter 
   and compiled scripts to execute on Server Core for Windows 2008 installations that do not 
   have this system dll installed by default. Note that WIL dialog boxes will not be able to 
   display bitmaps in PICTURE or PICTUREBUTTTON controls, nor will they display dialog background
   bitmap on systems without the dll. This change does not affect all other versions of Windows 
   and Windows Server, including Windows 2008, because these systems have msvfw32.dll installed.

   Changed the order of the WinBatch interpreter's shutdown sequence to workaround a thread 
   deadlock problem in Windows 7 32-bit COM Automation system unloading.

   Fixed problem with the file size displayed for files larger than 2GB in overwrite warning 
   dialogs.

   Fixed a problem that could cause a variable containing an array to become corrupted when 
   the variable was created in a Called script, UDF or UDS that was not exited via a 
   'Return' statement.

   Modified the DllCall and DllCallCdecl functions to also accept ordinal entry points.

   Changed the Terminate function to display Unicode strings without conversion to their 
   ANSI equivalents.

  Changes to the Dialog function and related functions:

   Added the new REPORTVIEW control.  The Reportview control is a ListView common control with the 
   'report' Windows style.  It can be used as either a simple grid control when a full featured 
   grid control is not needed or as an advanced version of the WIL dialog ITEMBOX control.

   The REPORTVIEW control supports all dialog template control definition attributes with the 
   following control specific meanings:

    var - The name of a variable that receives an array of user selected rows from the control 
    on a non-canceling exit from the dialog.  Optionally, the variable can contain an array of 
    values to display in the control. When the variable is used to populate the control, the 
    control will have a column for each column in the array.  The array can optionally contain 
    text for each column heading in the first row of the array. See the style attribute for details.

    Note that the array variable contents will only be used to populate the control when the 'text' 
    control definition attribute is set to 'DEFAULT'.

    text -  The 'text' can either be set to 'DEFAULT' or set to the path and file name of 
    a CSV file used to populate the control. The file must meet the same CSV file requirements 
    specified for the 'ArrayFileGetCsv' function and the value separator must be a comma(,).  
    The first line of the file can optionally contain column headings.  See the style attribute 
    for details.

    style - The control supports the invisible(1) and disable(2) styles. In addition the control 
    accepts the following new styles:

     noheader(524288) The header bar is not display across the top of the control.
     
     firstheader(1048576) The first row of the source array or file is treated as column header 
     text.

     gridlines(2097152) The control displays vertical and horizontal lines to form a grid.

     singleselect(4194304) Only one row can be selected at a time.

     fullrowselect(8388608) Selection highlighting extends to all subitems in the selected row.

     sortascending(16777216)  The control is populated with rows ordered from lowest to highest 
     first column values. Sorts using an "intuitive" sort (See ArraySort for details);  The user 
     can reorder control rows based on any column's values by clicking on the column header.

     sortdescending(33554432) The control is populated with rows ordered from highest to lowest 
     first column values. Sorts using an "intuitive" sort (See ArraySort for details).  The user 
     can reorder control rows based on any column's values by clicking on the column header. 

     Note: if both sortascending and sortdecending are used, sortascending takes precedence.

     edititem(67108864) The first column text can be edited in place.

     checkbox(134217728) Enables check boxes for each first column item in the control.

   Added the following new event codes to the 'DialogProcOptions' function in support of the 
   new REPORTVIEW control:

    REPORTVIEW Item Select(18) User has selected row in the REPORTVIEW control. The text of 
    the first column  of the selected row is passed to the callback UDF/UDS in the callback's 
    fifth parameter.

    REPORTVIEW Double-Clicked(19) User has used the mouse to double-click a row in the REPORTVIEW
    control. The text of the first column of the double-clicked row is passed to the callback 
    UDF/UDS in the callback's fifth parameter.

    REPORTVIEW Checked/Unchecked(20) User has checked or unchecked an item in a REPORTVIEW control 
    with the 'checkbox' style.  The text of the checked item is passed to the callback UDF/UDS in 
    the callback's fifth parameter.

    REPORTVIEW Edited Item Text(21) User has changed the text of a first column item in a 
    REPORTVIEW control. The user modified text of the item is passed to the callback UDF/UDS in 
    the callback's fifth parameter. Note that if more than one first column item of a control 
    contains the same value, it is possible for the fifth parameter to contain a tab delimited 
    list of multiple occurrences of the targeted item's text. The number items in the list 
    indicates which instance of the item is the target of the event.

    REPORTVIEW Column Click(22) User has used the mouse to click a column header of a REPORTVIEW
    control. The one based column number of the clicked column is passed to the callback UDF/UDS 
    in the callback's fifth parameter. The event is fired before the indicated column is sorted 
    so the sort direction can be controlled by setting or changing the sort direction style of the 
    control during the callback. Sorting is effectively cancelled by removing both sorting related 
    styles from the control.

   Modified the 'DialogControlGet' function to support the new REPORTVIEW control.  The function 
   also has a new fourth parameter that is sometimes necessary when the request code is used to 
   query information about a REPORTVIEW control.

   Existing 'DialogControlGet' request codes that have different requirements or return different
   results when used with the REPORTVIEW control:

    1 Returns 1 if the REPORTVIEW control has the checkbox(134217728) style and the indicated 
    item is checked. The functions optional fourth parameter must be used to indicate the text of 
    the item to test.

    5 Returns a one or two dimension array containing the contents of a REPORTVIEW control.

    6 Returns a one or two dimension array containing all selected rows of a REPORTVIEW control.

   New request codes added to support the REPORTVIEW control:

    20 Returns a tab delimited list of REPORTVIEW column headings.

    21 Returns a space delimited list of the width of each REPORTVIEW column in dialog units.

    24 Returns a one or two dimension array containing all REPORTVIEW rows which have first 
    column text matching one of the items specified as a tab delimited list in the functions fourth 
    parameter.

    25 Returns 1 if the next user edit of an item will be canceled upon completion. This request 
    code only applies to REPORTVIEW controls with the  edititem(67108864) style.

    26 Returns a one or two dimension array containing all checked rows of a REPORTVIEW control. 
    This request code is only relevant when a REPORTVIEW control has the checkbox(134217728) style.

    27 Returns a space delimited list of format specification for each REPORTVIEW column. The 
    returned values have the following meanings:
    0 - left justify text
    1 - center justify text
    2 - right justify text

   Request codes 11, 13, 17, 18, 19 also work as expected with the REPORTVIEW control.

   Modified the 'DialogControlSet' function to work with the new REPORTVIEW control.

   Existing 'DialogControlSet' request codes that have different parameter or return types when
   used with the REPORTVIEW control:

    1 Checks or unchecks an item in a REPORTVIEW control. Use the function's set-info(fourth)
    parameter to indicate the first column text of the row to check or uncheck.  The text can be 
    a delimited list to indicate which row should be checked or unchecked when multiple rows 
    have the same first column text.

    5 Replaces the contents of the REPORTVIEW control  The function's fourth parameter must 
    contain either a CSV file path+name, or a one or two dimension array that will be used to 
    replace the existing contents of the control. Supports variant safe arrays.

    6 Toggles the selection state of a row in a REPORTVIEW control. Use the function's 
    set-info(fourth) parameter to indicate the first column text of the row to select or unselect.  
    The text can be a delimited list to indicate which row should be selected when multiple rows 
    have the same first column text. Use an empty string to unselect all selected rows of a 
    control. Note that the control automatically unselects a selected row when a new row is 
    selected when the control has the singleselect(4194304) style.

    10 Scrolls a REPORTVIEW control row into view. Use the function's set-info(fourth) parameter 
    to indicate the first column text of the row to scroll to.  

    14 Adds a row to a REPORTVIEW control.  The functions function's set-info(fourth) parameter 
    can be an array or delimited list.  If the delimited list lacks enough items or the array 
    enough columns the remaining columns of the control will be left empty.  If either the list 
    or array has too many items or columns, the extra text will be ignored. If an array parameter 
    contains multiple rows, all array rows will be added to the control. Supports variant 
    safe arrays.

    15 Removes a row from a REPORTVIEW control. Use the function's set-info(fourth) parameter 
    to indicate the first column text of the row to remove.  The text can be a delimited list 
    to indicate which row to remove when multiple rows have the same first column text.

   New request codes added to support the REPORTVIEW control:

    20 Changes the column headings text of a REPORTVIEW control. Place a tab delimited list
    of the new column headings, one for each column, in the function's set-info(fourth) parameter.

    21 Specify a new width in dialog units for each REPORTVIEW column as a space delimited in 
    the function's set-info(fourth) parameter. Column widths can be set to -1 to cause a column's 
    width to fit the column contents. -2 can be used to set a column's width to match the column's 
    header text. Setting the farthest right column to -2 causes that column to fill the remaining 
    width of the control.

    22 Adds a new column to the far right side of a REPORTVIEW control.  Indicate the columns 
    header text in the functions set-info (fourth) parameter.

    23 Remove a column from a REPORTVIEW control.  The function set-info parameter should contain
    one based number from left to right of the column to remove.  Note that column 1, the left most
    column, cannot be removed from the control.

    25 Toggles canceling of a pending or the next edit of a REPORTVIEW control item.  The 
    set-info parameter should be @True to turn on edit canceling and @False to turn off canceling.
    The function returns the previous edit cancel setting.

    27 Specify the format for each REPORTVIEW column as a space delimited in the function's 
    set-info parameter. Valid values and there meanings:
    0 - left justify text
    1 - center justify text
    2 - right justify text

   Request codes 11, 13, 17 also work as expected with the REPORTVIEW control.

   Note that the above functions apply case insensitive text comparisons when identifying items 
   in a REPORTVIEW control.

WB 2012C Oct 24, 2012
 
 DLL 6.12clc First showing up in WB 2012C
 
   Minor changes to the WinBatch and WinBatch+Compiler setup program to accommodate 
   installation of shortcuts to the Windows 8 start screen.

   Added workaround for a bug in Windows 8 that prevented the 'WindowOnTop' and 
   'WinActivate' functions from working properly.

   Refreshed the icons for many installation executables.

   Made minor improvements to the capture of additional error information generated 
   by COM server dlls and executables.

   Fixed problem caused by specifying a dialog MENUITEM with the DEFAULT keyword 
   as the MENUITEM's text attribute.
   
   Fixed problem with resizeable dialogs that occasionally caused the dialog to be 
   resized when restored from the shell taskbar. 

   Added new 268435456 (Include Header Text) style to dialog REPORTVIEW controls.  
   When this style is set, the REPORTVIEW control column header text is added as 
   the first row of the array returned from an item search request, a selected 
   or checked item request, or a request for all items of the control.  This style 
   will also cause the control's associated variable to contain the column header 
   text as the first row of the array referenced by the variable. The style can be 
   used in a control's dialog template entry and as a parameter to the DialogControlState 
   function's remove and add style request codes.  
   
WB 2013A Apr 24, 2013
 
 DLL 6.13ama First showing up in WB 2013A

   Fixed defect in the 'RegQueryMulSz' function that caused it to not include the 
   last character of the last item in the returned list of registry values.

   Modified the 64-bit version of the 'RegOpenFlags' function to return 2 (64-bit view) 
   instead of 0 on the first call to the function.
 
   Added the "UNKNOWN" variant type to the 'ObjectType' function. The variant type 
   parameter value can only be used with the value 0 in the function's second 
   parameter to create a NULL VT_UNKNOWN variant.

   The 'ObjectType' function now converts WIL arrays and binary buffers to 
   variant safearrays of a specific type. Request conversion by prepending "ARRAY|" 
   to the variant element type in the first parameter.  The function's second parameter 
   should contain a WIL array, a Variant safearray or a binary buffer when using the "ARRAY|" 
   specification. The special type specification "ARRAY|VARIANT" can be used to convert 
   WIL arrays already containing multiple variant types into a safearrays of type VARIANT.

  New Functions

   The following three new functions give WinBatch scripts access to the Microsoft .Net Framework. 
   WinBatch makes this possible by hosting the common language runtime (CLR) and exposing 
   functionality for creating and accessing the members of classes, structures and enumerations 
   of managed code assemblies (DLLs) that are part of or based on the Framework.
  
   The WinBatch CLR hosting environment works by wrapping Framework based classes, structures 
   and enumerations in light weight COM Automation objects to take advantage of the WinBatch 
   interpreter's existing understanding of COM syntax and semantics. This approach lessens 
   the challenge of using managed objects in WinBatch script for those already familiar with 
   COM Automation. However, it is still recommended that you have a basic understanding of 
   object oriented programming concepts as used by the Framework.  It is also important to 
   carefully read and understand the documentation for a Framework based type before using 
   it in a WinBatch script.
 
   WinBatch access to the Framework uses COM but it is not completely dependent on the 
   Framework's COM interop. This is because the WinBatch directly hosts the CLR.  The 
   hybrid approach offers significant advantages over a COM interop only implementation. 
   First, assemblies do not need to be registered in the Windows registry to be accessed. 
   Second, whole classes, class methods and class properties do not need to be attributed 
   as COM visible to be accessed through WinBatch. Third, WinBatch CLR hosting is not tied 
   to a specific Framework Class Library (FCL) or CLR version. WinBatch only requires that 
   the Framework be installed on the system.
   
   While WinBatch CLR hosting has many advantages, this version has limitations that should 
   be considered before deciding whether or not to implement a solution using Framework 
   based assemblies. The following is a partial listing of those limitations:
   - Delegates and event callbacks are not supported. (This limits the effectiveness of UI related classes.)
   - Generics can only be used when pre-instantiated with appropriate type parameters by another CLR object.
   - Remote access to an assembly running in another process is not supported.
   - WinBatch scripts cannot be compiled into CLR applications or assemblies.

            
   ObjectClrNew(s:typename [, u/s/i/f/v:ctorparm,...] )      
      Creates a class, structure or enumeration implemented by a managed assembly. The function returns 
      a Framework based type as a COM Automation reference that can be used to access the members of the 
      underlying Framework based type. The assembly implementing the type specified by 'typename' must 
      be loaded into the WinBatch process before this function can be called to create the type.  The 
      exceptions to this requirement are types implemented by the "mscorlib" assembly. This assembly 
      is automatically loaded by WinBatch when the CLR is loaded. All other assemblies must be loaded 
      into the WinBatch process using the 'ObjectClrOption' function's 'use' option.

      "Typename"     The name of a Framework based class, structure or enumeration. The name must be 
                     fully qualified by including the dot (.) separated namespace prefixed to the type's 
                     immediate name.  The namespace name and immediate name must also be separated by a dot 
                     character. Ctorparm, etc. - 0 to 15 constructor parameters to be used when creating a type. 
                     Since type constructors can be overloaded, the type and number of these parameters control 
                     which constructor will be used to create the type.

      Members of the returned object reference are call using the same variable-name+dot+member-name syntax 
      used by standard COM Automation object references. However, there are some important differences between 
      regular COM calls and CLR type member calls.

      The most significant difference is that CLR constructors and type member names can be overloaded. This means 
      that more than one member can have the same name. When more than one member has the same name, WinBatch 
      and the CLR determine which member to call based on the number and type of the parameters passed in the call 
      statement. The combination of member name, parameter types and parameter count is called the member's signature. 
      This means that using the correct type for each parameter is crucial to calling the correct member. 
                
      Both member overloading and the fact that WinBatch cannot query the object for type information before making 
      a member call as it does with regular COM Automation references means that the colon (:) type qualifier needs 
      to be used more frequently on CLR object member parameters. Fortunately, WinBatch will take standard variant 
      type names like BSTR, UI8, BOOLEAN, R8, e.g., and convert them to equivalent Framework types automatically. 
      It will also automatically deduce the correct Framework type for variant variables passed as parameters to 
      a member without needing to specify a type with the colon qualifier.  When a Framework based type does not 
      have equivalent variant type, the fully qualified Framework based type name can be used with colon type 
      qualifier on a parameter. This is most often necessary when the object member is expecting an up-cast or 
      down-cast of Framework based class, when it is expecting a value from a Framework based enumeration, or when 
      it is expecting an array with elements of a specific Framework based type. In the case of arrays, the type 
      qualifier should be the Framework based type of the elements prefixed to the variable name of a variable that 
      holds either a WIL array or a variant safearray. No array type information ('ARRAY' or 'System.Array') should 
      be included in the type qualifier.  When using a Framework type name qualifier with any parameter the type 
      qualifier's assembly must be loaded before the member with the qualified parameter is called.

      Another significant difference between standard COM Automation object and Framework based wrapped objects 
      is that unlike standard COM Automation objects, Framework based object member names are case sensitive.  

      The function allows access to most Framework based types and there members but there are a few limitations 
      and restrictions.  The following is a partial list of those limitations and restrictions:               
      - WinBatch relies on the CLR hosting's reflection functionality to instantiate classes.  There are a 
        few classes attributed to block instantiation via reflection.
      - WinBatch does not support out parameters.  Method without parameters can still be called but out 
        parameter values are not modified on the method's return.
      - Class member overloads that rely solely on the return type and name for their signature cannot be used. 
      - Value types (structures) that only provide a multiple parameter constructor(s) cannot be used.
      - A small number of type member names conflict with WinBatch identifier naming rules and cannot be called 
        directly.
      - Parameterize properties are not supported.

   ObjectClrOption(s:option-name, s:option-value )
      Sets CLR configuration options before the CRL is loaded and loads an assembly into the current 
      WinBatch process. The function returns @True on success.
      
      "Option-name"  Available options are "version", "appbase", or "use".  See below for details. 

      "Option-value" Can be a CLR version string, file system path, or assembly name depending on the 
                     option-name.

      The Option-name parameter values meaning and usage:
      "version" Use this option to instruct WinBatch to load a specific version of the CLR. The 
                option-value parameter string must start with the character "v" followed by the first three 
                parts of the version number. Currently, Microsoft provides the following CLR versions "v1.0.3705", 
                "v1.1.4322","v2.0.50727" and "v4.0.30319".  The option must be set before the first call to this 
                function with the "use" option or before the first call to the 'ObjectClrNew' function.  If the 
                "version" option is not used before the CLR is loaded, WinBatch will attempt to load the current 
                system's latest installed version of the CLR.
     "appbase"  The option-value parameter for this option is used to indicate the full file system path that 
                presents the location of assemblies you plan on using in your script that are not installed 
                into the global assembly cache (GAC) of the system running the script. This option must be set 
                before the first call to this function setting a "use" option or before the first call to the 
                'ObjectClrNew' function.
     "use"      This option is used to load assemblies into the WinBatch process. Assemblies must be loaded 
                before the types the assembly implements can be used.  The option-value parameter for the is 
                option must be a string variable or literal containing an assembly name.  If an assembly is 
                stored in the GAC, it is generally necessary to use the fully qualified assembly name.  The 
                fully qualified assembly name has the format "assembly's name, version=x.x.x.x, culture=xxxx, 
                PublickeyToken=xxxxxxxxxxxxxxxx".  For example, the fully qualified name of the "System.Data" 
                assembly is "System.Data, version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089". 
                Full assembly names can be found by using the Mscorcfg.msc tool, by view the global assembly 
                cache directory directly, or by using the Gacutil.exe tool. 
                                 
   ObjectClrType(s:typename, u/s/i/f/v:value-reference )
      Use this function to either associate a Framework based type name with a value, or to up-cast or 
      down-cast Framework based object references.  If the second parameter is a simple string, integer, 
      float, variant that is not a reference to a Framework based object, the returned reference can only 
      be used as a parameter to a Framework based object method call, as the right-hand side of a Framework 
      based object property assignment or a constructor argument in a call to 'ObjectClrNew'.  In other 
      words, the returned reference does not have user callable methods, properties or fields.  On the other
      hand, if the second parameter is a reference to a Framework based object and the first parameter is 
      the typename of a base or derived type of that object then the returned reference can be used to 
      access the members of either the base or derived type of the input object.

      "Typename"        The name of a Framework based class, structure or enumeration. The name must be fully 
                        qualified by including the dot (.) separated namespace prefixed to the type's immediate 
                        name.  The namespace name and immediate name must also be separated by a dot character.

      "Value-reference" A value or Framework based object reference to associate with Typename.

      If the second parameter does not contain a Framework based object reference, the assembly implementing 
      typename must be loaded before the return reference is used as a method parameter, property value or 
      constructor argument. If the second parameter contains a Framework based object reference, the assembly 
      implementing typename must be loaded before this function is called.
 
    Fixed several problems with the MousePlay function incorrectly locating the mouse cursor on multi-monitor 
    systems when using a window origin instead of a screen origin. Also fixed problems that caused the function 
    to use an invalid origin instead of the origin of the restored parent window when the parent windows was 
    minimized and a child window was specified. These are breaking change that may require changing existing 
    scripts that use the function. 

    Modified the legacy WinMacro application to reflect the  multi-monitor fix in the MousePlay function.  
    This may require rerecording macros that were recorded using mouse coordinates relative to a specific 
    window instead of to the screen.
    
  Dialog Editor

    Changed General property page's control name verifications to prevent case only name changes from 
    generating a duplicate name error.
     
    Editor no longer clears the undo list when a dialog template is saved. 

  WinBatch Studio Changes

     Fixed Print Preview memory corruption problem in WinBatch Studio.
   
WB 2013B May 22, 2013
 
 DLL 6.13bmb First showing up in WB 2013B

   Modifed the ShellExecute, RunShell, RunEnviron, and RunWithLogon functions 
   to accept the new constant @NOACTIVATE in the functions' "display mode" 
   parameter. The @NOACTIVATE value causes the targeted application's window 
   to be displayed in its most recent size and position but without making the application's 
   window the active windows when another top-level window is already active.

   The ObjectType function will now convert a "NULL" (VT_NULL) variant to a 
   null "BSTR" (VT_BSTR). "NULL" variants are now also converted to null "BSTR" 
   variants when assigned to an element of a SafeArrays of type "BSTR".

   Added auto-detect ability to safearrays passed as parameters to dotNet class 
   methods and constructors. This reduces the need to use either the 'ObjectClrType' 
   function or the colon (:) type indicator on array parameters. 

 WinBatch Studio

   Fixed problem in the WinBatch Studio 64-bit debugger that caused the 'Version' 
   function to report an empty string instead of the current WinBatch Studio version string.

   Modified how the WinBatch Studio 32-bit and 64-bit debuggers load and unload 
   the Common Language Runtime so that scripts exhibit the same behavior when 
   executed more than once in the same debugging session. 

   Fixed a 32-bit and 64-bit debugger problem that caused an intermittent memory 
   access violation when debugging scripts that load the CLR.

   Changed status bar to display a user tool's menu text when the mouse cursor hovers 
   over the associated user tool button.  

 Dialog Editor

   Fixed problem in Dialog Editor that prevented the menu editor from always 
   detecting and preserving menu item position changes.


WB 2013C Aug 13, 2013
 
 DLL 6.13cmc First showing up in WB 2013C 
       
    Fixed string memory leaks in 6.2 WIL Dialogs with a user-defined callback procedures or functions.
    
    Modified the WinBatch 32 bit and 64 bit compilers to workaround a problem that intermittently prevented the compilers 
    from writing options and version information to compiled script executables on Windows 7.

    Modified error handling to reduce the occurrences of the generic CLR "Exception has been thrown..." error in the 
    "More Error Info" error display by suppling more specific error information when that information is made available
    by the error's source object instance. 

    Fixed memory leak that sometimes occurred when using a 'callback' parameter type with the DllCall function.
         
  WinBatch Studio Changes

    Made several general reliability and stability fixes to WinBatch Studio's external tool functionality.
    
    Removed WinBatch Studio's dependence on the Wbml.exe program to start WinBatch scripts as a external process.

    Modified WinBatch Studio's Run command to allow WinBatch scripts with the '.wbt_if' file extension to start from the  
    Run command with medium integrity and restricted access token on Windows 8/8.1/2012. This modification allows the Run 
    command to duplicate the security level of WIL scripts with the '.wbt_if' file extension when started directly from 
    the Windows shell on Windows 8/2012 and newer versions of the OS. All other WinBatch registered script file extensions 
    receive the higher of either the manifest controlled security level associated with the file extension or the current 
    security level of WinBatch Studio on Windows 8 and newer. This change does not effect Windows 7/2008 R2 and older as 
    the Run command still duplicates the security level the script would receive when started from the Windows desktop shell.

    Fixed a problem that under certain conditions resulted in incorrect WinBatch Studio default registry settings being applied 
    when installing WinBatch over an existing installation. 


WB 2014A Jan 15, 2014
 
 DLL 6.14ana First showing up in WB 2014A 
    
    Modified manifests for all executable files to indicate that Windows 8.1 is a supported OS.
    
    Fixed string memory leak in the ArrayLocate, ArraySearch and ArraySort functions that occurred when these functions were used on arrays 
    with floating point number element values.
    
    Enabled jump lists for WinBatch Studio and WIL Dialog Editor.

    Fixed potential heap corruption problem cause by the ArrayRedim, ArrayInsert, and ArrayRemove functions when 
    these functions operated on an array passed as a parameter to a user-defined function or subroutines.

    Added support for a '/silent' command line option to the 'uninstal' program.  When specified, this option causes the 'uninstal'
    program to perform an unattended uninstall of WinBatch or WinBatch+Compiler.

    Increased the maximum number of simultaneously loaded extenders from 10 to 32.  The total extender constants and functions is 
    increased to 750.  Depending on the number of functions and constants defined in each loaded extender, it is still possible to 
    reach the maximum number of extender functions and constants limit before the 32 extender limit is reached. Also note that 
    loading a large number of extenders may degrade script performance.

    New Functions                                               
      
     ArrayItemize(a:array[,s:delimiter])
       Converts a WIL array or variant safearray into a delimited item list. Each array element is converted to its string
       representation before being added as an item to the delimited list. Any element that does not have a string 
       representation or does not have any value is ignored.  This means that it is possible to have fewer items in the 
       delimited list than elements in the passed in array.  It is also possible to have more items in the delimited list
       than elements in the array because an array element may contain an embedded delimiter.  The function's return value 
       is the delimited list representation of the passed in array.

       'array'      array to convert.
       'delimiter'  [optional] item list delimiter (defaults to '@Tab'). Must be a single character.
          
     ArrayReverse(a:array[,i:dimension])
        Reverses the order of the elements in a WIL array or a variant safearray in place. This function is primarily intended 
        for use on single dimension arrays but it also accepts multi-dimensional arrays.  When the optional dimension parameter is 
        used on a multi-dimensional array the reversal process is performed on blocks of elements within the array. The elements
        within each block are not reversed relative to each other.  For example, this feature can be used to reverse the perceived
        order of the columns in a two dimension array without changing the order of the elements within each column. The function
        always returns 1.

        'array'      array to reverse.
        'dimension'  [optional] array dimension to reverse or zero(0) (defaults to 0.) Valid values are 1 to the number of 
                     dimensions in the passed in array or 0 to reverse the array without regard to dimension.   
           
  WinBatch Studio Changes

    Added a new "Quick Help" menu item to the "Edit" menu.  The "Quick Help" menu includes two sub-menu items.  

    The first menu item "Insert parameters" inserts the parameters for function to left of the caret. This menu item takes over the 
    role previously performed by the "Insert parameters" context menu item.  Like the context menu version the new menu item can be 
    invoked using the F12. The new menu implementation is more responsive and reliable than the context menu version.
  
    The second menu item "Auto complete" displays a list of WIL and WinBatch functions that match a partially typed word to
    the left the insertion caret.  When a listed function name is selected and the Enter key is pressed or a function name is
    double-clicked, the partially typed work is replaced with the full function name.  This functionality can also be invoked 
    using the Alt+Right Arrow key combination.

    Added a new "Display syntax sensitive quick help" option to the "File types" tab of the "Options" dialog for "WIL" files.
    When this option is checked and the mouse cursor hovers over a WIL or WinBatch function name, the editor displays a popup 
    window with the function syntax and description. This option also enables the display of a window containing a function 
    parameters whenever an opening parenthesis is typed immediately after a WIL or WinBatch function. 

    WinBatch Studio "Find in Files" searches can now be interrupted during the file search. To halt a search relaunch the 
    "Find in Files" dialog from the Search dropdown menu on the main menu bar and then clicking the "Stop Find" button or 
    pressing the return key. The "Stop Find" button text will change back to "Find" once the search is halted.

WB 2014B Jul 02, 2014
 
 DLL 6.14bnb First showing up in WB 2014B 

    Made several performance related enhancements to the Windows Interface Language parser.

    Modified the 64-bit version of the FileMenu to use the 64-bit version of the WIL interpreter instead of the 32-bit 
    interpreter. This change improves performance and stability on 64-bit versions of Windows.

    Fixed a defect in ArrayItemize function that cause it to return an empty item list when the first array element was 
    an empty string even though the array had additional elements.


    The 'FileAppend' function now writes system error information to the wwwbatch.ini file when the function fails for 
    an otherwise unknown reason.

    Modified the setup program to reduce the occurrence of automatic reboots when performing silent installs. 
    NOTE: This change does not remove the need to manually reboot the system to insure that the installation is completed.

    New Functions

    IntControl(97,0,0,0,0)
       This IntControl frees all resource associated with all Dll Structure handles created by one or more calls to the 
       'DllStructAlloc' function. All Dll Structure handles are invalid after using this IntControl.
       The IntControl returns the number of Dll Structure handles destroyed.

    IntControl(98,p1,p2,0,0)
       Use this IntControl obtain information about a DLL structure handle.
       p1 a valid DLL structure handle returned by a call to the DllStructAlloc function.
       p2 determines the type of information returned by the IntControl.
       1 = return the size in bytes of a structure represented by the DLL structure handle.
       2 = return the memory address of the buffer holding the C-language structure represented by the DLL structure handle.

    DllStructAlloc(s:member-descriptor[, i:memory-address])
       Create a Dll Structure handle to an entry in the WIL Structure descriptor table.

       The returned handle can be used with DllCall or DllCallcdecl when calling an external DLL entry point that 
       requires the memory address of a C/C++ language style structure as a parameter.  The handle can be used to both pass 
       information to or retrieve information from the DLL entry point depending on the entry point's implementation.

       The member descriptor string parameter must contain the string representation of the C/C++ language structure to create.  
       Each member of the structure must have both a supported data type specifier and a name.  The data type specifier 
       can be any data type from the list below.  The member name can be any text excluding tab (@tab), space (" "), colons (:), 
       or semicolons (;).  Each data type/member pair can be separated by white space or semicolons. The member data types must 
       be compatible with the documented data types for the DLL structure. Each structure member descriptor must be listed in 
       the order indicated by the external DLL's documentation or 'header' file.  Use the '[elements]' qualifier to indicate that 
       a member is an array.  The opening square bracket ([) must immediately follow the name with no intervening white space and 
       'elements' must be an integer indicating the number elements in the array.

       When used, the optional second parameter must be a structure memory address returned by an external DLL entry point.  
       The function copies the contents of the supplied memory location into memory allocated for the structure described by 
       the first parameter.  This parameter is only necessary when an entry point returns a memory address to a structure or 
       has an out parameter that is a pointer to a pointer to a structure.

       Use the returned DLL structure handle with DllCall or DllCallcdecl by passing the handle to the external function with 
       the new 'lpstruct' parameter type specifier. The structure descriptor table shares resources with binary buffers so a 
       combined maximum of 128 binary buffer and DLL structure handles can be active at one time.

       "member-descriptor" Tab or space character delimited list of data type*:name pairs of structure members. Data type and 
        name must be separated by a colon (:) character.

       "memory-address" DLL entry point supplied memory address to a DLL structure.

       Note: the function assumes standard Windows 8 byte structure alignment.

       *Supported data type string include: atom, byte, bool, boolean, char, colorref, dword, dwordlong, dword_ptr, double, 
       float, handle, hbitmap, hbrush, hmenu, hcursor, hdesk, hfile, hfont, hglobal, hicon, hiinstance, hkey, hmodule, hmonitor, 
       hpen, hrgn, hwnd, hresult, int, int_ptr, int64, long, lptr, long_ptr, lparam, long64, lpstr, lpwstr, short, uchar, 
       unsigned char, ushort, uint, ulong, unsigned long, unsigned int, word, wchar, wparam, wndproc.


    DllStructPeek(i:structure-handle, s:member-name)
       Retrieves the value of a member of a DLL structure represented by a structure table handle. Usually, call the function 
       after the structure handle has been passed as a parameter during a DLL entry point call to retrieve data suppled by the 
       DLL entry point. The structure-handle parameter must be a value returned by the DLLStructAlloc function and the 
       member-name parameter must be one of the structure member names supplied in the member descriptor string used to 
       create the handle.

       The function returns a string when the member data type is 'lpstr' or 'lpwstr' and an array when array syntax is 
       used on the member name in the descriptor string.  A string of decimal digits (a huge number) is returned for most 
       8 byte integer data types and a floating point number is returned for the 'double' and 'float' data types. Most other 
       data types are represented by an integer return value.

       "structure-handle" Dll Structure handle returned by the DllStructAlloc function.

       "member-Name" Structure member name from the structure descriptor string used to create the 'structure-handle' 
       parameter.

    DllStructPoke(i:structure-handle, s:member-name, s/i/a:member-value)
       Set the value of a member of a DLL structure represented by a structure table handle.
       The structure-handle parameter must be a handle supplied by the DllStructAlloc function and the member-name 
       parameter must be one of the structure member names from member descriptor string used to create the handle. 
       Call the function before passing a DLL structure to a DLL entry point when the entry point is using a structure 
       to obtain information from the caller.

       The function attempts to convert the member-value parameter to the data type of the member indicated in the 
       structure descriptor string.  However, the value must be an array for array structure members.

       The function returns 1 (@True) on success.

       "structure-handle" Dll struct table handle return by the DllStructAlloc function.

       "member-Name" Structure member name from the structure descriptor string used to create the 'structure-handle' 
       parameter.

       "member-value" New value of the structure member. Must be an array for member with an array data type qualifier.

    DllStructFree(i:structure-handle)
       Free all resources associated with a DLL structure handle. The handle is no longer valid after being passed 
       to this function.

       Returns 1 (@True) on success

       "structure-handle" Dll struct table handle return by the DllStructAlloc function

    New Operators

    The Windows Interface Language now supports eleven new compound assignment operators. Compound assignment operator, 
    like the simple assignment operator, store the value of the second operand in the variable specified by the first 
    operand. However, they also perform  an arithmetic, shift, concatenation, or bitwise operation prior to storing the 
    result.  The operation is performed on the existing value of the first operand and the results of the operation is 
    then stored as the new value of the first operand.

    Compound assignment operators with examples, simple assignment equivalents, and descriptions:
    <<=           x <<= y        x = x << y     Left Shift with Assignment
    >>=           x >>= y        x = x >> y     Right Shift with Assignment
    &=            x &= y         x = x & y      Bitwise And with Assignment
    |=            x |= y         x = x | y      Bitwise Or with Assignment
    ^=            x ^= y         x = x ^ y      Bitwise Exclusive Or with Assignment
    *=            x *= y         x = x * y      Multiplication with Assignment
    /=            x /= y         x = x / y      Division with Assignment
    +=            x += y         x = x + y      Addition with Assignment
    -=            x -= y         x = x - y      Subtraction with Assignment
    :=            x := y         x = x : y      String Concatenation with Assignment
    mod=          x mod= y       x = x mod y    Modulo with Assignment


   WinBatch Studio

   Corrected a problem in the 64-bit WinBatch Studio debugger that could cause the DllLoad, DllCallCdecl, and 
   DllCall functions to fail unexpectedly.

    Fixed several defects that sometimes cause quick help and auto-complete text to be clipped.

    WIL Dialog Editor

    Changed handling of left mouse button events so that a left button click on a control that is part of a 
    multiple control selection list will cause the control to be removed from the list.  Previously, left clicking 
    on a control caused the multiple selection to be cancelled. This change only applies when the control key is 
    not pressed along with the left mouse button.

    Added the 'Select All' menu item to the 'Edit' menu. Selecting this menu item will result in the adding of all 
    controls to the multiple selection list.