Wilson WindowWare Tech Support

WinBatch WinBatch+Compiler WebBatch
Home | Tech Database | Tech BBS | White Papers | Purchase


List of Fixes and Improvements

WinBatch versions 5.0H through 97D

Keywords:    fixes improvements new releases features

  **************************************************************************
  IMPORTANT NOTICE:  In the 32-bit version, the following functions, which
  in earlier versions returned space-delimited lists of items:

    DirItemize
    DiskScan
    FileItemize

  now return tab-delimited lists.  This can be changed using IntControl(29).
  See "DLL 2.2abh" section below for more information.

  --------------------------------------------------------------------------

  In the 32-bit version, the following functions work only with 32-bit apps:

    AppExist
    AppWaitClose
    WinExeName

  See "DLL 2.2abk" section below for more information.

  **************************************************************************

WinBatch/WIL DLL fixes.  Dates indicate disk drop into manufacturing.  Actual
ship is often a week or two later.

5.0H    Sept 1, 1994
        Initial public release

5.0J    Sept 10, 1994
        Network Extender fixes

5.0K    Sept 19, 1994
        Fixed "Use Older / Use Newer" swap in Confirm Replace dialog
        Fixed problem where \*.* was required on a target directory on
        FileCopy/FileMove functions (Oops See 5.0N)

5.0L    Sept 26, 1994
        Fixed MenuChange function
        Added DiskSize function
        Added \\machine\share capability to DiskFree and DiskSize functions

        WinBatch 32 for Intel PCs available

5.0M    Oct 3, 1994
        Fixed TimeDiffSecs function
        Fixed DDERequest memory leak problem
        Started adding this fixes.txt file

5.0N    Oct 10 1994
        Fixed memory leak on Dialog() function when CTL3DV2 was used.
        New n3Logout function in Novell3 extender
        Really fixed the \*.* problem.  Previous fix only copied
            the first file.
        Modified the DiskFree, DiskSize, and FileSize functions to
           return a floating point answer if the result is larger than
           about 2 Gigabytes
        Fixed Novell 3 Extenders (DLL10G)
              n3Map fixed to work with ODI drivers
              n3GetMapped
              n3MemberSet
              n3MemberDel

5.0P    Oct 19 1994
        Fixed FileSize for 32bit versions to return the proper answer
        Fixed a bug in StrIndex where a @backscan on a one character
           string would provide an incorrect answer.
        Fixed problem in CopyMove confirm dialog - Cancel works now.
        Fixed problem in CopyMove dialog - missing source file error caught before
           dialog.
        Fixed problem where Dialog function dialog boxes used BUTTON_FACE color
           instead of LTGRAY color.
        Fixed Novell 4 Extenders (DLL10H)
              n4Map (improved)
              n4GetMapped
              n4MemberSet
              n4MemberDel
        Novell DLL's updated from the Novell 11/93 release to the 2/94 release

        WinBatch 32 for Dec Alpha and MIPS now available.




Actually, its almost pointless to watch the Winbatch version number, as nearly all
the fixes appear in the Dll, which has its own version numbering scheme.
Henceforth, we will be tracking the DLL version number.  The WinBatch
VersionDll() function will return the DLL version.
This is already built into the SYSINFO.WBT file.

DLL 2.1ebc   Oct 26
        First showing up in WinBatch 5.0Q
        User pointed out problems in the sin and cos routines.  Problem traced to
        what appear to be singularity-type problems in the Microsoft runtime
        cos and sin routines.  The Dll now checks for the bad numbers, and if it is
        in the range where the runtime routines fail, it stuffs in an appropriate
        answer. Fix installed in the 16 bit version only, as the 32 bit versions
        do not seem to have this problem in the runtimes.

        Fixed a nit in the dialog editor where, when it was requested to
        display a script, would do so in a dialog box with a "(Unlicensed)"
        in the title.

        Fix a parser problem where an error occurred when the first part
        of a variable name matched a function name provided by the calling
        exe program.  This problem first showed up in using a "Dialog1"
        name for a dialog in the Dialog Editor.

        Fixed a SendKey to DOS bug where stuff like {UP} did not work when
        the NumLock was set.  Fixed by turning off NumLock when sending
        keystrokes to DOS.

DLL 2.1fbc
        Fixed look of Dialog boxes (back to white) when CTL3DV2.DLL is
        not installed on system.

        Fixed >very insignificant< problem where if a user did an
        AddExtender for the same DLL twice (or more) only one instance
        of the DLL was freed when the WBT file shut down.

        Fixed problem in 32 bit version for Windows'95 where default
        directory was not set properly in =C: environment variable.
        This problem caused wildcarded filenames to be improperly
        resolved into real filenames.

        Fixed problem in 16 bit version where DirRemove always
        returned a true, whether or not the directory was deleted.
        If the directory is not deleted, it now returns a suppressable,
        1030 error.


DLL 2.2abf  First showing up in WB 5.1A

        Because of a data structure change to support more binary
        buffers (5 was coded, 10 was documented) the main dll
        renamed to WBDBFxxx.dll

        Fixed TimeDiffSecs (again).  If the first date was smaller
        than the second date, the answer could be incorrect.

        Fixed a problem in FileAppend where the following code would not
        work properly.
        FileAppend("AAA.*","BBB.TXT")

        The DLL now does better  checking.
        SendKey slowed down a minor tad to help other applications out.

        32Bit versions will try harder to locate the WIL DLL on startup.

        The compiler time check of various DLLS has been removed because
        of assorted problems.  We'll just roll the DLL name instead when
        incompatibilities arise.  The DLL appears to be extremely stable,
        and the bug fixes implemented lately tend to be minor (see above)

        A buglet where an ItemInsert on a null string installed a leading
        delimiter before the inserted item - leading to a list with two
        items, the first being null, and the second being the desired item
        - was fixed.  When ItemInsert'ing into a null list, no leading
        delimiter is stuffed in.

        A problem with PlayWaveForm where it was not checking the [Sounds]
        section of the WIN.INI file for all possible cases has been fixed.

        Fixed a problem with FileCopy/FileMove, where the target was ".."
        and it was a root directory.

        DirExist now returns TRUE for hidden and system directories.  It
        also uses an improved method (hopefully) of checking for root
        directories and directories with relative paths (eg, "..\TEMP").

        Changed FileExist to return a value of '2' if the specified file
        exists but is currently open by another application in "read-deny"
        mode.  Most of the other file manipulation functions (except
        FileOpen) will cause a sharing violation if they try to access
        such a file.

        Fixed problems handling file and directory names containing high
        ANSI characters (>127).

        Fixed a problem that occurred if, inside a FOR loop, the user
        changed the increment variable to a string.

        Fixed an intermittent problem with performing comparisons of
        negative floating point numbers.

        FileFullName now correctly expands "dot" directories
        ("." and "..") in the path name.

        Fixed a problem processing lines such as "Gosub %param1%" inside
        conditional structures, when param1 was undefined.

        (32-bit version) Fixed some incompatabilities with Windows 95:
            FileAppend
            FileMove
            MsgTextGet
            WinActivate (where the specified parent window had a modal
               child window displayed -- focus was going to the parent
               window instead of to the child window)

        Fixed a problem with accessing the DLL if it was located in the
        parent directory and ".." was on the path.

        FileCopy, FileMove, and FileAppend now check for sufficient free
        disk space before performing the requested operation, and return
        an error if there is insufficient space, as follows:

          1404  FileCopy: Insufficient free space on target drive
          1405  FileMove: Insufficient free space on target drive
          1406  FileAppend: Insufficient free space on target drive


NetWare 3 extender 12012  First showing up in WB 5.1A

  New functions:

    n3ServerList(request)
      Returns name of connected server(s)

    n3FileAttrGet(filename)
      Returns NetWare file attributes

    n3FileAttrSet(filename, attribs, mode)
      Sets NetWare file attributes

NetWare 4 extender 14007  First showing up in WB 5.1A

  Changed functions:

     n4memberGet(group, user)
     n4memberSet(group, user)
     n4memberDel(group, user)

       these functions no longer take a 'server' parameter (they change the
       groups on all servers)

  New functions:

    n4ServerList(request)
      Returns name of connected servers(s)

    n4FileAttrGet(filename)
      Returns NetWare file attributes

    n4FileAttrSet(filename, attribs, mode)
      Sets NetWare file attributes

WB 5.1C  April 18, 1995

        Fixed problem with compiler and compiled WBT's causing a sharing
        violation if the DLL was on a network and not marked read-only.

        Fixed problem with compiler and compiled WBT's not finding the DLL
        if it was located in the Windows or Windows System directory.

        Fixed problem with large compiled WBT's being unable to extract the
        WIL DLL when run on a disk >= 4 gigabytes in size.

        In WILX.DLL extender -- fixed problem with xDriveReady sometimes
        causing a GP fault.


DLL 2.2abg  First showing up in WB 5.1C

        Added two new string constants: @CR and @LF

        Fixed bug in BinaryIndex where it wouldn't find the last character
        in the buffer.

WB 5.1D  July 18, 1995

  WinBatch compiler: for new projects, compiler will use settings (type,
  icon, and extenders) from the last project.


DLL 2.2abh  First showing up in WB 5.1D

  **************************************************************************
  IMPORTANT: File delimiters
  **************************************************************************

  In order to support long file names in Windows NT and Windows 95, which
  can contain embedded spaces, we have changed the default file delimiter,
  used to delimit lists of files and directories, to a TAB in the 32-bit
  version of WIL.  In the 16-bit version of WIL, the default delimiter has
  not changed, and remains a space.

  Note that this is the "default" file delimiter.  We have added the ability
  to change the file delimiter to a character of your own choosing, using
  the new IntControl 29.  If you are using the 32-bit version of WIL, and
  want to make the file delimiter a space for compatability with existing
  scripts, you can place the following line at the beginning of each of your
  scripts:

    IntControl(29, " ", 0, 0, 0)

  Conversely, if you want to standardize on a TAB delimiter, you can use:

    IntControl(29, @TAB, 0, 0, 0)

  Apostrophes (') and back quotes (`) are no longer treated as special
  characters to delimit file names containing spaces.  They are now treated
  as ordinary characters in a file name.

  ----------------------------
  Functions which are affected
  ----------------------------

  The most important functions affected by this change are:

    DirItemize
    DiskScan
    FileItemize

  which now return lists delimited by the current file delimiter character.

  The following functions, which take file or directory lists as input
  parameters, now expect the lists to be delimited by the current file
  delimiter character.  However, they now also accept lists delimited with a
  TAB or a vertical bar ("|", which may be easier to code in a WIL script):

    DirItemize
    DirRemove
    DiskFree
    FileAppend
    FileAttrSet
    FileCopy
    FileDelete
    FileItemize
    FileMove
    FileRename
    FileSize
    FileTimeSet
    FileTimeTouch

  Note that DiskFree will continue to accept space-delimited lists as input.

  **************************************************************************

  New IntControl:

    IntControl(29, delimiter, 0, 0, 0)
      Changes the default file delimiter.

    The first parameter is the new file delimiter you want to use, and must
    be a single character.  The return value of the function is the previous
    file delimiter character.  If you specify an empty string ("") as the
    first parameter, the function will return the current file delimiter
    character but the file delimiter will not be changed.

  Added option to WinMetrics: WinMetrics(-4) will return the Windows
  platform:

    0 = Other
    1 = Windows
    2 = Windows for Workgroups
    3 = Win32s
    4 = Windows NT
    5 = Windows 95

  In StrSub, you can now specify a length of -1, which will extract the rest
  of the string.

  In TimeWait, you can now specify "00:00:00" for the date, which will wait
  for the next occurrence of the specified time (ie, today or tomorrow).

  Added support for 3-D Dialog's in Windows NT, if CTL3D32.DLL is present in
  the SYSTEM32 directory.

  Fixed TimeAdd so that it doesn't trim out leading zeros in each field.

  The Wallpaper function now obeys the tile parameter in Windows 95.

  Improved handling of colors in Dialog function.

  Added 3D effect to radio buttons and checkboxes in Dialog function.

  Fixed problem where if an error occurred in a called WBT, control would go
  to the "Cancel" label in the calling program.

  In Dialog and DialogBox, you can now really use IntControl(4) to allow the
  dialog to be closed without selecting a file, even if there is an edit box
  associated with a file listbox.  If you press a pushbutton after changing
  the file mask in an edit box, the listbox will be updated with the new
  mask. But if you press a pushbutton without changing the file mask, the
  dialog will close (and will return a file name of "NOFILESELECTED").

  Fixed problem where string variables were not converted properly to
  integers at the beginning of a "For" loop.

  Fixed problem where lines that should have been ignored (eg, if they
  followed a Break statement) could cause errors if they contained invalid
  syntax.

  If the second parameter of an IntControl(12) statement is "" or "0", any
  previously-set exit message will now be cleared.  Also, you can now
  specify a message beginning with "0".

  Fixed problem processing "If" statements with a blank string to the left
  of the equals sign.

  Fixed a problem in the 32-bit version where the Dialog function would
  return an invalid file name (garbage characters) if no file was selected.

  Improved IsKeyDown processing (especially under Windows 95).

  Improved Ctrl-Break checking (especially under Windows 95).

  Made WinWaitClose steal less processor time in the 32-bit version.


WB 5.1E  Aug 3, 1995

  In the 32-bit version of WinBatch, it is now possible to run WinBatch
  files whose names contain spaces, by delimiting the file name with
  double quotes on the WinBatch command line.  For example:

    WBAT32I "Sample Program.WBT" param1 param2

  CallExt now handles file names containing spaces, in 32-bit version.

  32-bit version of WinBatch will now run WBT's with file names longer than
  64 characters.

  INI settings have been moved from WWW-PROD.INI to the registry, under key:

    HKEY_LOCAL_MACHINE\SOFTWARE\Wilson WindowWare\Settings\WWW-PROD


DLL 2.2abj  First showing up in WB 5.1E

  For functions which take a partial window name, you can now specify a
  tilde (~) as the first character of the window name, which will match any
  window containing the specified string anywhere in its title (ie, not
  necessarily at the beginning of the title).  For example, "~Notepad" will
  match a window title of "(Untitled) - Notepad" and a window title of "My
  Notepad Application", as well as a window title of "Notepad - (Untitled)".
  This should prove especially useful under Windows 95.  A '~' at the end of
  the specified window name indicates (as before) that the name must match
  the window title through to the end of the title.  So, "~Notepad~" will
  match a window title of "Notepad" and a window title of "(Untitled) -
  Notepad", but will not match a window title of "Notepad - (Untitled)".

  New function:

    WinIdGet(partial-winname).
      Returns a unique "Window ID" (pseudo-handle) for the specified window.

  New functions to manipulate Windows 95 shortcut link files (Windows 95 only):

    ShortcutEdit(linkname, pathname, params, workdir, showmode)
      Modifies the specified shortcut file.
        showmode = @NORMAL, @ZOOMED, or @ICON

    ShortcutExtra(linkname, description, hotkey, iconpath, iconindex)
      Sets additional information for the specified shortcut file.
        iconindex = 0=based index of desired icon in "iconpath"

    ShortcutInfo(linkname)
      Returns information on the specified shortcut file (TAB-delimited):
        path, params, workdir, showmode, desc, hotkey, iconpath, iconindex

    ShortcutMake(linkname, pathname, params, workdir, showmode)
      Creates a shortcut for the specified filename.
        showmode = @NORMAL, @ZOOMED, or @ICON

  In 32-bit version, Run... commands now support file and directory names
  containing spaces.

  In 32-bit version, Run... commands no longer support the undocumented
  method of running a program with a non-standard extension (eg,
  "SSSTARS.SCR") by replacing the period (.) in the file name with an
  asterisk (*).  However, this is no longer necessary, as the Run...
  commands in the 32-bit version can now run such programs directly.

  The 32-bit bit version is now able to run Windows 95 shortcut files under
  Windows 95, using any of the Run... functions.  The "Run" mode specified
  in the shortcut file (ie: "Normal window", "Minimized", or "Maximized")
  will always be obeyed, any command-line parameters specified in the
  shortcut's "Target" field will override any parameters passed by the
  Run... function, and a working directory specified in the shortcut's
  "Start in" field will override a working directory parameter in RunShell.

  New directory attribute functions:

    DirAttrGet(dirname)
      Gets directory attributes (like FileAttrGet)

    DirAttrSet(dir-list, settings)
      Sets directory attributes (like FileAttrSet)

  FileAttrGet and FileAttrSet now return an error if a directory name is
  specified.  Use the new DirAttrGet and DirAttrSet instead.

  New functions (32-bit version only -- the 16-bit version will just return
  the passed file name):

    FileNameLong(filename)
      Returns the long version of a filename.

    FileNameShort(filename)
      Returns the short (ie, 8.3) version of a filename.

  New IntControl (32-bit, Windows NT only):

    IntControl(30, "sourcefile", "destination", 0, 0)
      Performs a delayed file move.  The file is not actually moved until
      the operating system is restarted.

  New registry functions (32-bit version only):

    RegApp(progname, path)
      Creates registration entries for a program under "App Paths".

    RegDelValue(handle, subkey-string)
      Removes a named value for the specified subkey from the registry.

  In 32-bit version, PlayMidi function now support file and directory names
  containing spaces.

  New function (32-bit version only):

    InstallFile(filename, targname, default-targdir, delete-old, flags)
      Installs and uncompresses file.

  New function (menu-based implementations only):

    CurrFilePath()
      Returns the full path+filename of the currently-selected file.

      Like CurrentFile, but returns a full pathname.

  New IntControl (32-bit, Windows 95 only):

    IntControl(31, 0, 0, 0, 0)
      Returns a tab-delimited list of WinId's for all open Explorer windows.

  IntControl(67) and IntControl(68) now work in Windows 95.

  DosVersion now returns correct values in Windows 95.

  Added new request #'s to WinResources for 32-bit version.

    The existing request #'s (0-4) will still work, but are not useful on
    32-bit platforms.

    It is not possible to determine free system resources in the 32-bit
    version.

  Fixed problem with Dialog and DialogBox returning "NOFILESELECTED" even
  if a file was selected, if IntControl(4) was set.

  INI settings have been moved from WWW-PROD.INI to the registry, under key:

    HKEY_LOCAL_MACHINE\SOFTWARE\Wilson WindowWare\Settings\WWW-PROD


WB 95B  Sept 7, 1995

  New Box functions:

    BoxButtonDraw(BoxID, button ID, "text", "rect")
    BoxButtonKill(BoxID, button ID)
    BoxButtonStat(BoxID, button ID)
    BoxCaption(BoxID, caption)
    BoxColor(BoxID, "color", wash color)
    BoxDataClear(BoxID, "tag")
    BoxDataTag(BoxID, "tag")
    BoxDestroy(BoxID)
    BoxDrawCircle(BoxID, "rect", style)
    BoxDrawLine(BoxID, "rect")
    BoxDrawRect(BoxID, "rect", style)
    BoxDrawText(BoxID, "rect", "text", erase flag, alignment)
    BoxesUp("rect", show mode)
    BoxMapMode(BoxID, map mode)
    BoxNew(BoxID, "rect", style)
    BoxPen(BoxID, "color", width)
    BoxTextColor(BoxID, "color")
    BoxTextFont(BoxID, "name", size, style, family)
    BoxUpdates(BoxID, update flag)

  The 32-bit WinBatch compiler now allows you to specify an icon for the EXE
  being compiled.


DLL 2.2abk  First showing up in WB 95B

  In the 32-bit version, the Run... functions will look in the registry
  under "App Paths" for the location of the specified program, if you do not
  specify a path for it.

  In the 32-bit version, the Run... functions will look in the registry
  under "App Paths" for a "Path" setting for the specified program, and, if
  found, will prepend it to the "PATH" environment variable before running
  the program.

  In the 32-bit version, the following functions now work, but only with
  32-bit applications:

    AppExist
    AppWaitClose
    WinExeName

  In the 32-bit version, AppExist and AppWaitClose are not able to detect
  the existence of 16-bit DOS or Windows applications, and WinExeName will
  return the string "(16-bit application)".

  In the 32-bit version under Windows NT, these functions accept (and
  return) module names instead of full program names.  The module name is
  usually the same as the root name of the program, without the extension.
  For example, WinExeName("Program Manager") will return "progman".  With
  AppExist and AppWaitClose, any file extension or path information which is
  part of the 'program-name' parameter is ignored; so, for example,
  AppExist("c:\temp\progman.exe") will return TRUE if Program Manager is
  running, regardless of what directory PROGMAN.EXE is actually located in.
  One exception: WinExeName("") will return a full path to the program
  making the current call to the WIL Interpreter.

  BinaryPeekStr, BinaryPokeStr, and BinaryStrCnt now check for (and reject)
  negative parameters.

  RunWait now gives up some processor time while it's waiting.

  New function (32-bit version only):

    WinSysInfo()
      Returns a tab-delimited list of system configuration information.

    This function should be used instead of WinConfig in the 32-bit version.

  Additional request #'s for WinMetrics (32-bit version only).

  New mouse functions:

    MouseClick(click-type, modifiers)
      Clicks mouse button(s).

    MouseClickBtn(win-name, child-win, button-text)
      Clicks on the specified button control.

    MouseMove(x, y, win-name, child-win)
      Moves the mouse to the specified X-Y coordinates (based on a 1000 x
      1000 screen).

  Fixed problem where an invalid YmdHms string containing two consecutive
  colons could cause a GP Fault.

  In the 32-bit version, AppExist and AppWaitClose will now wait several
  seconds for the specified application to appear.

  Fixed problem in menu-based WIL applications where tabs in menu item
  descriptions would be displayed as non-printable "black-box" characters.

  Added new request #'s to MouseInfo.

  In the 32-bit version, IconReplace now supports 32-bit EXE files.  The
  replacement icon must be the exact same size as the original icon.

  New IntControl:

    IntControl(32, address, "data type", 0, 0)
      Returns the contents of the memory location specified by "address".

  Fixed WinMetrics(-1) with 32-bit graphics cards.  It was returning -1 for
  these; it now returns 2,147,483,647.


WB 95C  Oct 10, 1995

  New function:

    BoxButtonWait()
      Waits for any button in any box to be pressed.

  Fixed problem with WinBatch locking up when minimizing a WinBatch box that
  was displaying width-justified text.


DLL 2.2abl  First showing up in WB 95C

  Fixed problem with DirExist returning @FALSE for a UNC which was a root
  directory share on another machine (eg, "\\SERVER\C").

  DirMake will now create multi-level directories (eg, "C:\ABC\DEF\GHI").

  New functions:

    BinaryIndexNc(handle, offset, string, direction)
      Like BinaryIndex, but case-insensitive.

    WinItemNameId()
      Returns a list of top-level window names and their "Window ID's", in
      the form:
        "window1-name|window1-ID|window2-name|window2-ID|..."

    In the 32-bit version, Delay and TimeDelay functions now accept
    floating point numbers: eg, Delay(0.5).

  New function:

    ShellExecute(file-name, params, directory, display mode, operation)
      Performs a ShellExecute.

  New function (32-bit version only):

    RegQueryItem(handle, subkey)
      Returns a tab-delimited list of named data items for the specified
      subkey.

  New IntControl:

    IntControl(33, p1, 0, 0, 0)
      Controls whether a listbox control in a dialog box allows multiple
      items to be selected.

        P1  Meaning
        --  -------
        0   Single selection
        1   Multiple selection (default)

  Improved registry functions in 32-bit version:

    RegSetValue, RegQueryValue, and RegDelValue:

      1. SEE NOTE BELOW!! Can now specify a named value of [Default] to
         indicate the primary value for the key (shown in the Registry
         Editor as "(Default)"); eg:

           RegSetValue(mykey, "[Default]", "some data")

         (*** The above feature was subsequently removed in version 96C ***)

      2. Can now specify a subkey string containing a named value; eg:

           RegSetValue(mykey, "MySubKey[MyItem]", "some data"), or,
           RegSetValue(mykey, "MySubKey\[MyItem]", "some data")

  Fixed WaitForKey in the 32-bit version.

  In the 32-bit version, you can now use the Run... functions to "run" data
  files (eg, Run("win.ini", "")).

  FileItemize and DirItemize now handle names containing spaces.

  In 32-bit version, fixed problem with 3D dialogs not being used under
  Windows NT.


WB 95D  Nov 1, 1995

  Compiler now optimizes WBT's by removing comment lines and whitespace.

  OLE automation (ObjectOpen and ObjectClose functions) now supported in
  32-bit version.

  When a custom icon is specified, the 32-bit compiler now installs it as
  the icon that is displayed in the Win95 Explorer window, as well as the
  icon that is shown in the task bar.

  Fixed a problem with some of the Box functions, where a color or font that
  was specified in a definition-type command (such as BoxTextColor) would be
  used for an output-type command (such as BoxDrawText) that preceded it in
  the command stack, instead of the default color or font being used.


DLL 2.2abl  First showing up in WB 95D

  New registry functions (32-bit version only):

    RegQueryBin(handle, subkey)
      Retrieves a binary value from the registry.

    RegQueryDword(handle, subkey)
      Retrieves a DWORD value from the registry.

    RegSetBin(handle, subkey, value)
      Sets a binary value in the registry.

    RegSetDword(handle, subkey, value)
      Sets a DWORD value in the registry.

  New date/time functions:

    TimeJulToYmd(julian-date)
      Converts the specified Julian date value to a date in YmdHms format.
        Hms will always be "00:00:00".

    TimeSubtract(YmdHms1, YmdHms2)
      Subtracts YmdHms2 from YmdHms1.
        YmdHms2 can not be larger than YmdHms1.

  New IntControl's:

    IntControl(34, p1, 0, 0, 0)
      Returns the error message string which corresponds to the specified
      WIL error.
        p1 = error number.

    IntControl(35, p1, 0, 0, 0) (32-bit version only)
      Adjusts SendKey delay.
        p1 = amount of time to delay between each keypress, in milliseconds
        (1000 milliseconds = 1 second).
      Returns previous delay setting.

      The default delay (in the 32-bit version) is 25.  Specify a larger
      number to slow SendKey down, or a smaller number to speed it up
      (0 = no delay).

    IntControl(36, p1, p2, 0, 0) (32-bit version only)
      Waits until an application is waiting for user input.
        p1 = window name associated with application
        p2 = timeout, in milliseconds (-1 = no timeout)

  In dialog boxes, if you create an EDITBOX field with a variable name that
  begins with "PW_", it will be treated as a password field (ie, asterisks
  will be echoed instead of the actual characters that the user types).

  In dialog boxes, file listboxes now use long file names in the 32-bit
  version under Windows 95.

  In the DiskScan function, request numbers 8 (CD_ROM) and 16 (RamDisk) are
  now supported in the 16-bit version.

  In 32-bit version, added 3D effects to dialog listboxes and edit controls
  under Windows 95.

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

  In 32-bit version, fixed a problem using the Run[] commands to launch a
  Windows 95 shortcut file.

  InstallFile function now supported in 16-bit version.


NetWare 3 extender 12013  First showing up in WB 95D

  Fixed a problem with n3GetMapped, if the specified server name was also
  the partial name of another server (eg, if you specified "\\SERVER1" and
  you also had a server named "\\SERVER10").

  n3FileAttrGet and n3FileAttrSet can now be used to get and set directory
  attributes.


NetWare 4 extender 14010  First showing up in WB 95D

  Fixed n4Detach function; it now does a full detach, and it now returns
  @FALSE if it is unable to detach from the monitored connection (ie, from
  the primary or login server).

  Fixed a problem with n4GetMapped, if the specified server name was also
  the partial name of another server (eg, if you specified "\\SERVER1" and
  you also had a server named "\\SERVER10").

  n4FileAttrGet and n4FileAttrSet can now be used to get and set directory
  attributes.


WB 95E  Nov 2, 1995


DLL 2.2abm  First showing up in WB 95E

  In 16-bit version, fixed a problem with DirMake creating a directory name
  containing high ANSI characters (>127).


WB 96A  Jan 1, 1996

  WinBatch for PowerPC now available.

  New IntControl:

    IntControl(1000, p1, 0, 0, 0)
      Sets the exit code returned by WinBatch.
        Default exit code = 0.
        Returns previous value.

  Fixed the "Help" button in the WinBatch compiler.

  In the BoxColor function, the gradient effect (wash color) now works with
  video drivers > 256 colors.

DLL 2.3abm  First showing up in WB 96A

  New function:

    DiskInfo(drive-letter, request#)
      Returns information on the specified disk drive.

      Req#   Return value
      ----   ------------
       1     sectors per cluster
       2     bytes per sector
       3     number of free clusters
       4     total number of clusters


  New IntControl's:

    IntControl(37, p1, p2, p3, 0)
      Replaces the specified icon in an EXE file.

        p1 = EXE file
        p2 = icon file
        p3 = ordinal position of icon to replace

      This is similar to the IconReplace function, except it allows you to
      change an icon other than the first icon in the file.

      Note: This IntControl is subject to change in future versions.

    IntControl(39, p1, 0, 0, 0)
      Sets the file sharing mode for file reads.
        p1 = share mode for file reads (default = 1)

      Valid share modes are:
        -1 = don't change (just return current setting)
         0 = prevent the file from being shared
         1 = allow other open operations for read access
         2 = allow other open operations for write access
         3 = allow other open operations for read and write access

      This affects the FileOpen("READ") and BinaryRead functions.

      Returns previous setting.

    IntControl(40, p1, 0, 0, 0)
      Sets the file sharing mode for file writes.
        p2 = share mode for file writes (default = 0)

      This affects the FileOpen("WRITE"/"APPEND") and BinaryWrite functions.

      Returns previous setting.

      See IntControl(39) for a list of valid share modes.

  New return code for WinMetrics(-3):  4 = PowerPC32

  In 32-bit version, fixed a problem using DirName with directory names
  containing spaces or commas.

  Fixed problem with TimeJulToYmd with years >= 2000.

  FileWrite now returns an error if the write failed.

  In 16-bit version, fixed problem  with DiskScan causing a GP fault on
  systems with Stacker compression software installed.

  In 32-bit version, the following functions are now a little more
  well-behaved in giving up processor time: RunWait (and RunShell with the
  "@WAIT" parameter), AppWaitClose, and Delay/TimeDelay.

  Fixed a problem with the Dialog function, where if you defined an EDITBOX
  control after a FILELISTBOX control, the file listbox would revert to a
  filespec of "*.*".

  In 32-bit version, fixed a prooblem with the Dialog function, where if you
  had a filespec other than "*.*", it would not show subdirectories in the
  file list.

  In 32-bit version, added some code to the ClipGet and ClipPut functions to
  try to avoid "Clipboard owned by another app" error messages.

  Fixed problem with TimeWait, when specifying a date of "00:00:00" and a
  time that was earlier than the current time.

  In 32-bit version, added a 25-millisecond delay between keystrokes sent
  using the SendKey function.  This can be adjusted using IntControl(35).

  Fixed problem with PlayWaveForm in 32-bit version.


Windows 32 extender 10004

  netDirDialog no longer returns an error if user presses "Cancel".


Dialog Editor 96A
  Fixed the "Help" menu.


WB 96B  Feb 12, 1996

  In the 16-bit version, fixed a problem where doing a BoxDestroy
  immediately after resizing a box window caused a GPF.

  Fixed a resource leak problem with BoxColor when using gradient effects.


DLL 2.3bbm  First showing up in WB 96B

  New binary functions:

    BinaryHashRec(buffer, recsize, keyoffset, keysize, keyval)

      Returns a pointer to a record in a binary buffer, using a hashing
      algorithm.

    BinaryIncr(buffer, offset)
    BinaryIncr2(buffer, offset)
    BinaryIncr4(buffer, offset)
    BinaryIncrFlt(buffer, offset)

      These functions are equivalent to doing a BinaryPeek[...],
      incrementing the extracted value by 1, and then doing a
      BinaryPoke[...] to store the new value.

      They return the new value.

    BinaryPeek2(buffer, offset)
    BinaryPeek4(buffer, offset)
    BinaryPeekFlt(buffer, offset)

      These functions are like BinaryPeek, but they extract 2, 4, or 8 bytes
      (respectively) beginning at "offset"

    BinaryPoke2(buffer, offset, value)
    BinaryPoke4(buffer, offset, value)
    BinaryPokeFlt(buffer, offset, value)

      These functions are like BinaryPoke, but they store the specified
      "value" in 2, 4, or 8 bytes (respectively) beginning at "offset".

    BinarySort(buffer, recsize, keyoffset, keysize, flags)

      Sorts records in a binary buffer.  The buffer is sorted in place.

  Change to BinaryIndex and BinaryIndexNc:

    You can now specify a blank string ("") for the "string" parameter, in
    which case the function will return the offset of the first non-NULL
    character found, starting at "offset".

  Fixed BinaryIndexNC

  BinaryPoke now correctly returns the previous value, as documented.

  In the 32-bit version, KeyToggleSet no longer returns an error (however,
  it is still subject to the limitations described in the documentation).

  In the 16-bit version, fixed DirAttrSet.

  The following string functions:

    StrIndex
    StrScan
    StrSub

  no longer return an error for illegal bounds conditions.  Instead,
  StrIndex/StrScan now return a 0, and StrSub returns a blank string.


WB 96C  Mar 22, 1996

  FileMenu now works in Windows NT 4.0.

  PopMenu now works in Windows NT 4.0.

  Fixed problem where BoxButtonDraw didn't change the text of an existing
  button, or of a button which had previously existed but had been removed
  with BoxButtonKill.


DLL 2.3cbm  First showing up in WB 96C

  In 32-bit version, the following functions now work in Windows NT 4.0:

    ShortcutEdit
    ShortcutExtra
    ShortcutInfo
    ShortcutMake

  In 32-bit version, the Run... functions can now be used to launch shortcut
  files in Windows NT 4.0.

  In 32-bit version, added 3D effects to Windows NT 4.0.

  In 32-bit version, fixed problem with licensing dialog in Windows NT 4.0.

  In 32-bit version, the following registry functions:

    RegSetValue
    RegQueryValue
    RegDelValue

  no longer treat a named value of [Default] as indicating the primary value
  for a key (and, therefore, it is now possible to access a value which is
  actually named "Default").

  In 32-bit version, fixed problem with international language strings not
  being used.

  New registry functions (32-bit version only):

    RegQueryExpSz(handle, subkey)
      Retrieves a REG_EXPAND_SZ value from the registry.

    RegQueryMulSz(handle, subkey, delimiter)
      Retrieves a REG_MULTI_SZ value from the registry.

    RegSetExpSz(handle, subkey, value)
      Sets a REG_EXPAND_SZ value in the registry.

    RegSetMulSz(handle, subkey, value, delimiter)
      Sets a REG_MULTI_SZ value in the registry.

  In 32-bit version, fixed problem with RegQuery... functions when there
  was a backslash between the subkey string and a named value, eg:

    RegQueryValue(mykey, "MySubKey[MyItem]", "some data")  -- this worked
    RegQueryValue(mykey, "MySubKey\[MyItem]", "some data") -- this didn't

  RegQuery, RegQueryBin, and RegSetBin can now handle longer strings (up to
  available WIL string space).

  In 32-bit version, fixed problem with OLE string parameters.

  In 32-bit version, fixed problem with RegQueryBin with certain values.

  In 32-bit version, fixed problem with RegSetDword with large values.

  Fixed problem with TimeSubtract, where the result could have a day of "00"
  (eg, "96:04:00" instead of "96:03:31").

  In 16-bit version, fixed WinItemNameId.

  Fixed problem with BinaryHashRec crashing if there was only one record in
  the buffer.


NetWare 3 extender 12014  First showing up in WB 96C

  Fixed n3FileAttrGet and n3FileAttrSet.

  n3FileAttrGet and n3FileAttrSet no longer support directories (use new
  functions n3DirAttrGet and n3DirAttrSet instead).

  New functions:

    n3DirAttrGet(dirname)
      Same as n3FileAttrGet, but for directory attributes.

    n3DirAttrSet(dirname, attribs, mode)
      Same as n3FileAttrSet, but for directory attributes.

    n3MapDir(net-path, local-name)
      Like n3Map, but performs a regular (non-root) map.

    n3MapRoot(net-path, local-name)
      Identical to n3Map.

  With n3Map[..], it is no longer necessary to add a trailing backslash when
  mapping to the root of a volume.

  New functions:

    n3CapturePrt(s:server-name, s:queue-name, i:port-number, s:flags)
      Captures a local printer port to a Netware printer queue.

        "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc).

        "flags" is a tab-delimited list of keyword=value pairs, ie:

          "key1=value1%@TAB%key2=value2%@TAB%key3=value3..."

        Valid keywords are:

          JobDescription
          JobControlFlags
          TabSize
          NumCopies
          PrintFlags
          MaxLines
          MaxChars
          FormName
          FormType
          BannerText
          FlushCaptureTimeout
          FlushCaptureOnClose

        See the Netware 3 extender help file for an explanation of these
        flags.

    n3CaptureEnd(i:port-number)
      Ends a printer capture.

        "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc).

    n3GetUserId(s:server-name, s:user-name, i:format)
      Returns the object ID corresponding to the specified user name.

        "Format" specifies the format in which the ID is returned:

          0  Decimal number, in internal Netware format
          1  Hexadecimal string, such as used for mail directories

    n3ChgPassword(s:server-name, s:user-name, s:old-password, s:new-password)
      Changes a user's password.

        If you have supervisor or equivalent rights, you can specify a blank
        string ("") for "old-password".

        Passwords are NOT case-sensitive.

        You must be currently logged in to the specified server.

    n3GetNetAddr(s:server, i:flags)
      Returns the internetwork address of the current workstation.

        "server" can be a blank string (""), in which case the default
        server is used.

        "flags" is reserved for future use, and should be set to 0.

        The return value is a string of hex bytes in the format:

          x1x2x3x4:y1y2y3y4y5y6:z1z2

        where:

          x1x2x3x4     = 4-byte network address
          y1y2y3y4y5y6 = 6-byte net node address (physical address of workstation's LAN board)
          z1z2         = socket

    n3ServerInfo(s:server, i:request)
      Returns information on the specified Netware server.

        Request   Meaning
        -------   -------
           1      major NetWare version number
           2      minor NetWare version number
           3      revision number of the NetWare OS on NetWare server
           4      maximum number of connections the server will support
           5      highest number of connections simultaneously in use
           6      number of connections the server currently has in use
           7      maximum number of volumes the server will support
           8      SFT level the server supports
           9      TTS Level of NetWare server operating system

    n3UserGroups(s:server, s:username)
      Lists groups to which the specified user belongs.

        The return value is a tab-delimited list of groups.

  Added new request # to n3ServerList:

    4 = all known servers (TAB-delimited list)


NetWare 4 extender 14011  First showing up in WB 96C

  Fixed n4FileAttrGet and n4FileAttrSet.

  n4FileAttrGet and n4FileAttrSet no longer support directories (use new
  functions n4DirAttrGet and n4DirAttrSet instead).

  New functions:

    n4DirAttrGet(dirname)
      Same as n4FileAttrGet, but for directory attributes.

    n4DirAttrSet(dirname, attribs, mode)
      Same as n4FileAttrSet, but for directory attributes.

    n4MapDir(net-path, local-name)
      Like n4Map, but performs a regular (non-root) map.

    n4MapRoot(net-path, local-name)
      Identical to n4Map.

  With n4Map[..], it is no longer necessary to add a trailing backslash when
  mapping to the root of a volume.

  New functions:

    n4CapturePrt(s:server-name, s:queue-name, i:port-number, s:flags)
      Captures a local printer port to a Netware printer queue.

        "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc).

        "flags" is a tab-delimited list of keyword=value pairs, ie:

          "key1=value1%@TAB%key2=value2%@TAB%key3=value3..."

        Valid keywords are:

          JobDescription
          JobControlFlags
          TabSize
          NumCopies
          PrintFlags
          MaxLines
          MaxChars
          FormName
          FormType
          BannerText
          FlushCaptureTimeout
          FlushCaptureOnClose

        See the Netware 4 extender help file for an explanation of these
        flags.

    n4CaptureEnd(i:port-number)
      Ends a printer capture.

        "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc).

    n4GetUserId(s:server-name, s:user-name, i:format)
      Returns the object ID corresponding to the specified user name.

        "Format" specifies the format in which the ID is returned:

          0  Decimal number, in internal Netware format
          1  Hexadecimal string, such as used for mail directories

    n4ChgPassword(s:server-name, s:user-name, s:old-password, s:new-password)
      Changes a user's password.

        "old-password" must be specified for Directory Services connections.
        For bindery connections, if you have supervisor or equivalent rights,
        you can specify a blank string ("") for "old-password".

        Passwords ARE case-sensitive for Directory Services connections, but
        NOT for bindery connections.

        For bindery connections, you must be currently logged in to the
        specified server.

    n4GetNetAddr(s:server, i:flags)
      Returns the internetwork address of the current workstation.

        "server" can be a blank string (""), in which case the default
        server is used.

        "flags" is reserved for future use, and should be set to 0.

        The return value is a string of hex bytes in the format:

          x1x2x3x4:y1y2y3y4y5y6:z1z2

        where:

          x1x2x3x4     = 4-byte network address
          y1y2y3y4y5y6 = 6-byte net node address (physical address of workstation's LAN board)
          z1z2         = socket

    n4ServerInfo(s:server, i:request)
      Returns information on the specified Netware server.

        Request   Meaning
        -------   -------
           1      major NetWare version number
           2      minor NetWare version number
           3      revision number of the NetWare OS on NetWare server
           4      maximum number of connections the server will support
           5      highest number of connections simultaneously in use
           6      number of connections the server currently has in use
           7      maximum number of volumes the server will support
           8      SFT level the server supports
           9      TTS Level of NetWare server operating system

    n4UserGroups(s:server, s:username)
      Lists groups to which the specified user belongs.

        The return value is a tab-delimited list of groups.  If the
        specified server is a Directory Services connection, the group names
        will contain distinguishing path information (eg, "Server1.Users").

  Added new request # to n4ServerList:

    4 = all known servers (TAB-delimited list)

      If the current default server is a Directory Services connection, only
      servers that are part of Directory Services are returned.  If the
      current default server is a bindery connection, only servers listed in
      the bindery are returned.


Windows 32 extender 10005

  netGetCon now accepts printer ports higher than LPT3 (up to LPT9).


WB 96D  June 26, 1996

  Fixed problem with PopMenu, when generating a file name based on an
  application whose class name contained characters that were not valid file
  name characters.  PopMenu now strips off such characters when generating
  the file name (eg, class name of "Edit:App" becomes "EditApp.mnw").

  Fixed problem with PopMenu, where it would occasionally fail to launch the
  editor when editing/creating a menu file.

  In the 16-bit version, WinBatch now does not try to load CTL3DV2.DLL at
  startup unless the DLL is located in the Windows System directory.

  Compiler now searches path for extender DLL's, if they are not found in
  the compiler directory, when compiling a large EXE.

  Fixed problem with FileMenu locking up in some cases if the user rapidly
  clicked twice on a menu.

  Fixed problem with BoxDrawText with "alignment" = 32 (adjust font), where
  sometimes the displayed font was too large.

  Added two new alignment flags to BoxDrawText:

     64  Right-justify text by adding space between words
    128  Clip (truncate) text if it doesn't fit within specified rectangle

  In FileMenu, fixed a problem with the status bar descriptions under
  Windows NT 4.0.


DLL 2.3dbm  First showing up in WB 96D

  New functions:

    RegEntryType(i:handle, s:subkey)
      Returns the type of data for the specified subkey.

      In the 32-bit version, the return value will be one of the following:
         0  (REG_NONE)                        No value type
         1  (REG_SZ)                          Unicode nul terminated string
         2  (REG_EXPAND_SZ)                   Unicode nul terminated string (with environment variable references)
         3  (REG_BINARY)                      Free form binary
         4  (REG_DWORD)                       32-bit number
         5  (REG_DWORD_BIG_ENDIAN)            32-bit number
         6  (REG_LINK)                        Symbolic Link (unicode)
         7  (REG_MULTI_SZ)                    Multiple Unicode strings
         8  (REG_RESOURCE_LIST)               Resource list in the resource map
         9  (REG_FULL_RESOURCE_DESCRIPTOR)    Resource list in the hardware description
        10  (REG_RESOURCE_REQUIREMENTS_LIST)

      In the 16-bit version, the return value will always be 1.

    RegQueryEx(i:handle, s:subkey, s:delimiter, i:type)
      Retrieves a value from the registry.

        "Delimiter" is ignored unless "type" is 7.

        In the 32-bit version, "type" can be one of the following:
           1  (REG_SZ)                          Unicode nul terminated string
           2  (REG_EXPAND_SZ)                   Unicode nul terminated string (with environment variable references)
           3  (REG_BINARY)                      Free form binary
           4  (REG_DWORD)                       32-bit number
           7  (REG_MULTI_SZ)                    Multiple Unicode strings

        In the 16-bit version, "type" must be 1.

    RegSetEx(i:handle, s:subkey, s:value, s:delimiter, i:type)
      Sets a value in the registry.

        "Delimiter" is ignored unless "type" is 7.

        See "RegQueryEx" for a list of valid types.

    FileVerInfo(s:filename, s:language-key, s:resource-string)
      Returns a version resource string from a binary file.

        "filename" is the name of the EXE, DLL, or other binary file
        containing version resource information.

        "language-key" is a hexadecimal string identifying the desired
        language and character-set block within the file's resource table.
        U.S. English (w/ Windows Multilingual character set) is "040904E4".
        You can specify a blank string ("") to indicate U.S. English, which
        will almost always be appropriate.

        "resource-string" specifies the item to return.  The following are
        standard item names (although some of these are optional and will
        not necessarily be present in any particular file):

          "Comments"
          "CompanyName"
          "FileDescription"
          "FileVersion"
          "InternalName"
          "LegalCopyright"
          "LegalTrademarks"
          "OriginalFilename"
          "ProductName"
          "ProductVersion"

      Example:
        desc = FileVerInfo("notepad.exe", "", "FileDescription")
        ver = FileVerInfo("notepad.exe", "", "FileVersion")
        Message(desc, ver)

    WinWaitExist(s:partial-winname, i:timeout)
      Waits for a top-level window to exist.

        "timeout" is the number of seconds to wait (maximum = 86400).
        Specify 0 to have the function return immediately without waiting.
        Specify -1 for no timeout (ie, wait forever).

      Returns @TRUE if the window appeared; @FALSE if it didn't.

    WinWaitChild(s:partial-parent-winname, s:partial-child-winname, i:timeout)
      Waits for a child window to exist.

        "timeout" is the number of seconds to wait (maximum = 86400).
        Specify 0 to have the function return immediately without waiting.
        Specify -1 for no timeout (ie, wait forever).

      Returns @TRUE if the window appeared; @FALSE if it didn't.

  New IntControl's:

    IntControl(41, p1, 0, 0, 0)
      Controls YmdHms format returned by time functions.

        P1   Meaning
        --   -------
        -1   Don't change (just return current setting)
         0   2-digit year (YY:MM:DD:HH:MM:SS)   (default)
         1   4-digit year (YYYY:MM:DD:HH:MM:SS)

      This affects the following functions which return a YmdHms string:

        FileYmdHms
        TimeAdd
        TimeJulToYmd
        TimeSubtract
        TimeYmdHms

      Returns previous setting.

    IntControl(42, p1, 0, 0, 0)
      Get pointer to a binary buffer.

        This returns the address of a pointer to a binary buffer.  The
        address will be within the memory space of the WIL Interpreter.

        "P1" specifies the binary buffer (see BinaryAlloc).

  Fixed problem with RegQueryItem, where only one item was being returned.

  In the 16-bit version, fixed a problem with WinMetrics(-4) returning 0
  under Windows for Workgroups if a secondary network (such as Netware) was
  installed.

  FileSize no longer returns an error if a wildcard file mask is specified
  which does not match any files; it now returns 0.

  All functions which take a YmdHms string as a parameter will now accept a
  string in the format "YYYY:MM:DD:HH:MM:SS" (ie, containing a 4-digit year).

  Fixed problem with time functions which return a YmdHms string (such as
  TimeAdd) with years >= 2000.

  Fixed problem with Delay function where the current year was >= 2000.

  Changed TimeJulianDay so that it treats 2-digit years in the input string
  as falling within the range 1950-2049 (eg, "96:04:01" is April 1, 1996).
  This is consistent with the behavior of the other time functions.
  Previously, TimeJulianDay was not adjusting the year, so that "96:04:01"
  would be treated as April 1, 0096.  To retain the old behavior, you can
  specify a full 4-digit year (eg, "0096:04:01").

  TimeJulianDay now correctly calculates julian dates for leap years that
  are evenly divisible by 400 (such as 2000).

  AddExtender and DllCall/DllLoad now also look for the specified DLL in the
  directory where the WIL Interpreter application is located.

  In the 32-bit version, SendKey (and SendKeysTo and SendKeysChild) now
  attempt to wait until the active application is ready to accept input
  before sending each keystroke.  This can be disabled with IntControl 43
  (see "DLL 2.3ebm" section, below).

  Fixed problem with RegQueryBin truncating long values.

  In the 16-bit version, fixed problem with FileAppend where the target was
  a UNC.

  Fixed memory allocation problem with WinWaitClose.

  The 32-bit version can now process batch and menu files which were saved
  by Notepad as Unicode text files.  It may be able to handle Unicode text
  files created with other editors as well, as long as the first character
  in the file is a hexadecimal FFFE or FEFF.

  In the 32-bit version, the Dialog and DialogBox functions now properly set
  the current working directory when the user selects a file from a listbox.

  Fixed problem where an error that occurred in a CALL'ed script would not
  cancel the calling program.

  In the 32-bit version, fixed problem with FileCopy, FileMove, and
  FileAppend causing a crash if the specified source file did not exist and
  the specified target was a UNC.

  When AddExtender fails with an error 3437, it now displays a message box
  with some idea of what the problem may be, or with a Windows error code.


NetWare 3 extender 12015  First showing up in WB 96D

  Fixed problem with n3ChgPassword.

  NOTE: Added "old-password" parameter to n3ChgPassword (changed from 96C).


NetWare 4 extender 14012  First showing up in WB 96D

  Fixed problem with n4ChgPassword, when using bindery emulation.

  In the 32-bit version, fixed problem with Unicode initialization errors
  when using the Netware NT client.


Windows 32 extender 10007  First showing up in WB 96D

  New functions:

    netResources(s:net-resource, i:scope, i:type, i:usage)
      Itemizes network resources.

        This function returns a tab-delimited list of network resources
        which are located immediately below the specified 'net-resource'.

        'net-resource' can be a UNC (eg, "\\FredsPC"), a domain (eg,
        "SALES"), or "" for the root of the network.

        'scope' can be one of the following:
          1   All currently connected resources
          2   All resources on the network
          3   All remembered (persistent) connections

        'type' can be one of the following:
          0   All resources
          1   All disk resources
          2   All print resources
          3   All disk and print resources

        'usage' can be one of the following:
          0   All resources
          1   All connectable resources
          2   All container resources
          3   All connectable and container resources

        Note: 'usage' is ignored unless 'scope' is 2.


WB 96E  June 27, 1996

  New IntControl:

    IntControl(1001, p1, 0, 0, 0) (32-bit only)
      Set service process status.

        P1   Meaning
        --   -------
         0   Run as a normal application (default).
         1   Run as a service.

      If WinBatch is running as a service, it will not be closed when the
      user logs out.

      Under Windows 95, this function actually registers the currently
      executing WinBatch program as a service.  Under Windows NT, it just
      causes the WinBatch program to behave as a service (ie, don't close
      when the user logs out); in order to launch a WinBatch program as a
      service under Windows NT, you will need to use a utility such as the
      SRVANY.EXE program which is included with the Windows NT Resource Kit.

      Returns @TRUE on success, @FALSE on failure.

  For window class names beginning with "Afx", PopMenu now bases the menu
  name upon the application's module name instead of the class name.


DLL 2.3ebm  First showing up in WB 96E

  New IntControl:

    IntControl(43, p1, 0, 0, 0) (32-bit only)
      Enable/disable "WaitForInputIdle".

        P1   Meaning
        --   -------
        -1   Don't change (just return current setting)
         0   Don't wait for application to be ready.
         1   Wait for application to be ready (default).

      This controls whether SendKey (and SendKeysTo and SendKeysChild)
      attempt to wait until the active application is ready to accept input
      before sending each keystroke.

      Returns previous setting.


WB 96F  Oct 18, 1996

  In BoxTextFont, expanded the "pitch & family" parameter to now be
  "pitch & family & character-set":

    In addition to the existing flags for pitch and family, you can now
    specify one of the following flags specifying a character set (combined
    with the pitch and/or family flags using the binary "OR" ["|"] operator):

      ANSI_CHARSET             0 (default)
      DEFAULT_CHARSET        256
      SYMBOL_CHARSET         512
      SHIFTJIS_CHARSET     32768 (Kanji)
      HANGEUL_CHARSET      33024
      GB2312_CHARSET       34304
      CHINESEBIG5_CHARSET  34816
      OEM_CHARSET          65280

    The following flags are for Windows 95 and NT 4.0 only:

      JOHAB_CHARSET        33280
      HEBREW_CHARSET       45312
      ARABIC_CHARSET       45568
      GREEK_CHARSET        41216
      TURKISH_CHARSET      41472
      THAI_CHARSET         56832
      EASTEUROPE_CHARSET   60928
      RUSSIAN_CHARSET      52224
      MAC_CHARSET          19712
      BALTIC_CHARSET       47616

    The character set flags will not override the typeface specified by the
    font "name" parameter.  If you would rather specify a character set than
    a specific typeface, specify a blank string ("") for font "name".

    Note: If you wish to use a Kanji (Japanese) font, you must specify the
    SHIFTJIS_CHARSET flag (32768).

  New IntControls:

    IntControl(1002, p1, 0, 0, 0)
      Sets icon display state.

        This function sets the state of the WinBatch icon to being visible
        (default) or hidden.  It is equivalent to using WinShow() or
        WinHide() on the current WinBatch window, except that after using
        any of the Box[..] functions and then doing a BoxShut(), the icon
        will go back to its previous display state.

        P1   Meaning
        --   -------
        -1   Don't change (just return current setting)
         0   Hide WinBatch icon.
         1   Show WinBatch icon (default).

        Returns previous setting.

    IntControl(1003, p1, 0, 0, 0)
      Prevents WinBatch icon from being opened.

      This function sets the "open-able" flag for the WinBatch icon.  If
      this flag is on (default), then the WinBatch icon can be opened
      (restored) to a normal window by clicking on the icon.  If this flag
      is off, then it will not be possible to open the WinBatch icon by any
      method, including WinShow() or BoxOpen().

        P1   Meaning
        --   -------
        -1   Don't change (just return current setting)
         0   WinBatch icon cannot be opened.
         1   WinBatch icon can be opened (default).

        Returns previous setting.

    IntControl(1004, 0, 0, 0, 0)
      Returns the file name of the current WinBatch program.

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

      If the current WinBatch script is a child program that was called with
      the CallExt() function, this IntControl will return the name of the
      current (called) program.

  Fixed a problem with BoxButtonWait returning erroneously when the Enter or
  Escape key was pressed.

  Fixed a problem where FileMenu was getting added twice to the menus of
  shortcut files.  This occurred if a user removed the "IsShortcut" value
  from the "lnkfile" key in the registry.

  Fixed a problem with excessive repainting in the Box functions.

  The compiler can now be used to compile an encoded or encrypted WBT to an
  EXE file.

  If you try to compile a source WBT which is already encoded or encrypted
  to a target type which is an encoded or encrypted WBT, no processing will
  be done on the file and the target will be identical to the source.  In
  other words, you cannot use the compiler to re-encode or re-encrypt a WBT,
  or convert an encoded WBT to an encrypted WBT (or vice versa).

  It is now possible to specify an "AutoExec" WIL script that will be called
  before every WinBatch program that you run.  This would be a convenient
  place to set global variables, or perform standard startup commands, such
  as AddExtender or IntControl.  This will have the same effect as placing a
  "Call" command to the AutoExec script as the first line of every WinBatch
  program you run, so therefore:

    1. Any variables you set in the AutoExec script will be global, and any
       extenders you add will be available to the main WinBatch program.

    2. If an error occurs in the AutoExec script, it will terminate the
       main WinBatch program (unless you use the ErrorMode function).

    3. If an Exit command is encountered in the AutoExec script, the main
       WinBatch program will not be run.

    4. If the main WinBatch program is a compiled EXE, the AutoExec script
       must be an encoded WBT.

  The AutoExec script is specified as follows:

    In the 16-bit version, add either or both of the following entries to
    the [WB16I] section of WWW-PROD.INI:

      AutoExecWbc=filename
      AutoExecWbt=filename

        where "filename" is the name of your AutoExec script file.

    In the 32-bit version, under the registry key:

      HKEY_LOCAL_MACHINE\SOFTWARE\Wilson WindowWare\Settings\WWW-PROD\WB32I

        create either or both of the following string values:

          AutoExecWbc
          AutoExecWbt

        and enter the name of your AutoExec script file as the value data.

    The "AutoExecWbc" settings are used when the WinBatch program being run
    is a compiled WinBatch EXE.  The specified value must be an encoded WBT.

    The "AutoExecWbt" settings are used when the WinBatch program being run
    is an un-compiled WinBatch script.  The specified value may be either a
    normal WBT or an encoded WBT.

  The specified script file name does not need to have an extension of "WBC"
  or "WBT".  If it does not contain a full path, it will be searched for.
  If the file does not exist, it will be skipped without causing an error
  (of course, an error will occur if your main WinBatch program refers to a
  variable that was supposed to have been defined in the AutoExec script;
  the "IsDefined" function can be useful here).


DLL 2.3fbn  First showing up in WB 96F

  New functions:

    FindWindow(s:class-name)
      Returns the window title matching a specified class name.

        This function returns the window title of the first window whose
        class name matches the specified "class-name".  A blank string ("")
        is returned if no matching window is found.

        "Class-name" must be the full class name (ie, not a partial name).
        It is not case sensitive.

    RegConnect(s:computer-name, i:handle) (32-bit only)
      Connects to a predefined registry handle on another computer.

        "computer-name" is in the form "\\computername".

        "handle" can be either @REGMACHINE OR @REGUSERS.

        Returns a key handle to the specified handle on the remote computer.

        You should use RegCloseKey to close the key when you are finished
        using it.

    RegQueryKeys(i:handle)
      Returns a tab-delimited list of subkey names under a specified key.

    StrFixLeft(base-string, pad-string, length)
      Pads or truncates the left side of a string to a fixed length using bytes.

        This function "fixes" the length of a string, either by truncating
        it on the left, or by prepending enough copies of pad-string to
        achieve the desired length.

        See "StrFix" for parameters and other information.

    StrFixCharsL(base-string, pad-string, length)
      Pads or truncates the left side of a string to a fixed length using characters.

        This function "fixes" the length of a string, either by truncating
        it on the left, or by prepending enough copies of pad-string to
        achieve the desired length.

        See "StrFixChars" for parameters and other information.

    BinaryOleType(i:bin-handle, i:type, i:reserved-1, i:reserved-2, i:reserved-3)
      Specifies how a binary buffer will be used by OLE functions.

        This function defines the attributes of the binary buffer specified
        by "bin-handle", which determines what happens when you use the
        binary buffer handle as a parameter to an OLE object (ie, one
        created with the "ObjectOpen" function).

        This function does not modify any data in the binary buffer itself.

        When an OLE object is called, and one of the parameters is a binary
        buffer handle, the following actions are automatically taken:

          1. An internal OLE buffer is created which is (at least) as large
             as the binary buffer.

          2. If the binary buffer is defined as an input (or input/output)
             parameter (see "type" below), any data in the binary buffer (up
             to the binary EOD) is converted as necessary to the specified
             format and copied to the OLE buffer.

          3. The OLE buffer is passed to the OLE object.

          When the OLE object returns:

          4. If the binary buffer is defined as an output (or input/output)
             parameter (see "type" below), then any data in the OLE buffer
             is copied back to the binary buffer.  If it is possible to
             determine how much data was returned in the OLE buffer, then
             the binary EOD is set to the end of the data; otherwise, the
             binary EOD is set to the end of the binary buffer.

          5. The OLE buffer is freed.

        "type" specifies what type of parameter the buffer will represent,
        and whether it will be used as an input or output parameter (or
        both).  It consists of one entry from each of the following groups,
        added together:

          data type:
               0  undefined
               1  BSTR      (VT_BSTR)
               2  BSTR*     (VT_BSTR | VT_BYREF)

          direction:
             100  input parameter
             200  output parameter
             300  input/output parameter

          When a binary buffer is created with BinaryAlloc, it has a "type"
          of 0 (undefined).  You must use BinaryOleType to set the buffer's
          type before using it as a parameter to an OLE object.

        Parameters 3, 4, and 5 are reserved for future use, and should be
        specified as 0.

        Returns 1.

    DiskVolInfo(root-path, request#) (32-bit only)
      Returns information on a file system volume.

        "root-path" specifies the root directory of a file system volume
        (eg, "C:\" or "\\SERVER\PUBLIC\")

        Req#   Return value
        ----   ------------
          1    (s) volume name
          2    (s) file system name (eg, "FAT" or "NTFS")
          3    (s) volume serial number (hex string; eg, "1234-ABCD")
          4    (i) volume serial number (decimal)
          5    (i) max length of filename component (portion between backslashes)
          6    (b) volume preserves the case of filenames when storing files
          7    (b) volume supports case-sensitive filenames
          8    (b) volume supports Unicode in filenames
          9    (b) volume preserves and enforces ACL's
         10    (b) volume supports file-based compression
         11    (b) volume is a compressed volume (eg, a DoubleSpace volume)

         Request numbers which indicate a return type of "(b)" (Boolean)
         return a value of 1 (@TRUE) or 0 (@FALSE).

    Yields(i:count)
      Provides time for other windows to do processing.

        This function is the same as the "Yield" command, but allows you to
        specify the number of yields to perform; eg, "Yields(5)" is the same
        as 5 consecutive "Yield" commands.

        "count" is the number of yields to perform.

        See "Yield" for more information.

    RegLoadHive(i:handle, s:subkey, s:filename) (32-bit only)
      Loads a hive into a registry subkey.

        "handle" can be @REGUSERS or @REGMACHINE.

        "subkey" specifies the name of the key which will be created.

        "filename" specifies the name of a hive file.

        This function creates a subkey under HKEY_USERS or HKEY_LOCAL_MACHINE
        and stores registration information from the specified file into that
        subkey.  This registration information is in the form of a hive.  A
        hive is a discrete body of keys, subkeys, and values that is rooted
        at the top of the registry hierarchy.

        Returns 1.

    RegUnloadHive(i:handle, s:subkey) (32-bit only)
      Unloads a hive from the registry.

        "handle" can be @REGUSERS or @REGMACHINE.

        "subkey" must specify a key which is mapped to a hive file.

        Returns 1.

    StrIndexNc(s:string, s:sub-string, i:start, i:direction)
      Searches a string for a sub-string, ignoring case.

        This function is the same as StrIndex, but is not case sensitive.

  New IntControls:

    IntControl(44, p1, 0, 0, 0)
      Returns the class name for specified window handle.

        p1 = window handle

      The window handle can be obtained with the DllHwnd function.
      Returns a blank string ("") if the window doesn't exist.

    IntControl(45, p1, 0, 0, 0) (32-bit only)
      Enable/disable "SendKey speedup" in DOS programs in Windows NT.

        P1   Meaning
        --   -------
        -1   Don't change (just return current setting)
         0   Don't speed up SendKey in DOS programs in Windows NT.
         1   Speed up SendKey in DOS programs in Windows NT (default).

      Normally, SendKey (and SendKeysTo and SendKeysChild) yields a little
      processor time between keystrokes, to allow other Windows programs to
      multitask.  However, when sending keystrokes to a DOS program in
      Windows NT, this can result in excessive delays between keystrokes,
      and so in that case SendKey goes into "speedup" mode and grabs all the
      processor time it can get.  Another factor that affects SendKey speed
      is the delay that is normally inserted between keystrokes, which by
      default is 25 milliseconds but can be adjusted with IntControl(35).
      When "SendKey speedup" mode is in effect, no such delay is inserted.

      This function allows you to disable the "SendKey speedup" behavior if
      it causes problems or is not desired.

      Returns previous setting.

    IntControl(46, p1, 0, 0, 0) (32-bit only)
      Set window retry timeout.

      By default, in the 32-bit version, most WIL functions which take a
      window title as a parameter (except for WinExist) will wait up to 9
      seconds for the specified window to appear if it does not already
      exist.  This IntControl allows you to change the timeout setting.

        p1 = number of seconds to wait (default = 9), or 0 for no retries.
        You can specify -1 to return the current setting without changing it.

      Returns previous setting.

    IntControl(47, p1, 0, 0, 0)
      Closes another WinBatch program.

      This IntControl lets a WIL script close another WinBatch program (it's
      not possible to close a WinBatch program using "WinClose").

        P1 = window title (can be partial) of a WinBatch program window.

      If P1 is the current window, this function is the same as an Exit.

      Returns @TRUE on apparent success, or @FALSE on apparent failure.

    IntControl(48, p1, 0, 0, 0)
      Closes a DOS program.

      This IntControl lets you close the window of an MS-DOS program (it's
      not possible to close a DOS window using "WinClose").

      Note: You will not receive any warning from the operating system
      before the window is closed, even if the DOS application contains
      unsaved work.  Use this function carefully.

        P1 = window title (can be partial) of a DOS program window.

      If P1 is not a DOS window, this function has no effect.

      This function is not supported in Windows NT.

      Returns @TRUE on apparent success, or @FALSE on apparent failure.

    IntControl(49, p1, 0, 0, 0)
      Add system menus to popup windows.

        This IntControl lets you specify that certain types of WIL popup
        windows will have system menus (a little box or icon at the left
        side of the title bar) and minimize/maximize icon buttons.

        "P1" specifies what types of windows will have these icons:

          P1   Meaning
          --   -------
          -1   Don't change (just return current setting)
           0   No windows (default).
           1   Dialog boxes (created with "Dialog").
           2   Item listboxes (eg, created with "AskItemList").
           3   Dialog boxes and item listboxes.

      Returns previous setting.

    IntControl(50, p1, 0, 0, 0)
      Controls whether "Go to web page" button is added to error boxes.

        By default, when an error occurs in one of the WIL programs
        distributed by Wilson WindowWare, and the program displays an error
        message box, it checks the system to see if a Web browser has been
        configured; if so, it adds a pushbutton to the error message box
        which says "Go to Tech Support Web Page".  If pressed, the button
        launches the Web browser.  This IntControl lets you prevent that
        button from being added.

        P1   Meaning
        --   -------
        -1   Don't change (just return current setting)
         0   Don't add "Go to web page" button to error boxes.
         1   Add "Go to web page" button to error boxes (default).

      Returns previous setting.

    IntControl(51, p1, 0, 0, 0) (32-bit only)
      Specifies flags for CreateProcess.

        In the 32-bit version, all the Run[..] commands call the Windows API
        "CreateProcess" function to launch the application.  This IntControl
        lets you specify certain flags that control the priority class and
        the creation of the process, and affects all subsequent Run[..]
        commands.  Under normal circumstances, you should not need to use this
        IntControl at all.  It should be used only by knowledgeable users, and
        completely at your own risk.  Some of these flags can have unexpected
        or undesirable results.  We cannot provide any support for their use.

        P1 = one or more of the following flags, combined using the binary
             "OR" ("|") operator.  The default setting is 32:

             Value  Flag name                   Meaning
             -----  ---------                   -------
                 1  DEBUG_PROCESS               If this flag is set, the calling process is treated as a debugger, and
                                                the new process is a process being debugged.  The system notifies the
                                                debugger of all debug events that occur in the process being debugged.
                                                If you create a process with this flag set, only the calling thread (the
                                                thread that called CreateProcess) can call the WaitForDebugEvent function.
                 2  DEBUG_ONLY_THIS_PROCESS     If not set and the calling process is being debugged, the new process
                                                becomes another process being debugged by the calling process’s
                                                debugger.  If the calling process is not a process being debugged, no
                                                debugging-related actions occur.
                 4  CREATE_SUSPENDED            The primary thread of the new process is created in a suspended state,
                                                and does not run until the ResumeThread function is called.
                 8  DETACHED_PROCESS            For console processes, the new process does not have access to the
                                                console of the parent process.  The new process can call the
                                                AllocConsole function at a later time to create a new console.  This
                                                flag cannot be used with the CREATE_NEW_CONSOLE flag.
                16  CREATE_NEW_CONSOLE          The new process has a new console, instead of inheriting the parent’s
                                                console.  This flag cannot be used with the DETACHED_PROCESS flag.
               512  CREATE_NEW_PROCESS_GROUP    The new process is the root process of a new process group.  The process
                                                group includes all processes that are descendants of this root process.
                                                The process identifier of the new process group is the same as the
                                                process identifier, which is returned in the lpProcessInformation
                                                parameter.  Process groups are used by the GenerateConsoleCtrlEvent
                                                function to enable sending a CTRL+C or CTRL+BREAK signal to a group of
                                                console processes.
              1024  CREATE_UNICODE_ENVIRONMENT  If set, the environment block pointed to by lpEnvironment uses Unicode
                                                characters.  If clear, the environment block uses ANSI characters.
              2048  CREATE_SEPARATE_WOW_VDM     Windows NT only: This flag is valid only when starting a 16-bit
                                                Windows-based application.  If set, the new process is run in a private
                                                Virtual DOS Machine (VDM).  By default, all 16-bit Windows-based
                                                applications are run as threads in a single, shared VDM.  The advantage
                                                of running separately is that a crash only kills the single VDM; any
                                                other programs running in distinct VDMs continue to function normally.
                                                Also, 16-bit Windows-based applications that are run in separate VDMs
                                                have separate input queues.  That means that if one application hangs
                                                momentarily, applications in separate VDMs continue to receive input.
              4096  CREATE_SHARED_WOW_VDM       Windows NT only: The flag is valid only when starting a 16-bit
                                                Windows-based application.  If the DefaultSeparateVDM switch in the
                                                Windows section of WIN.INI is TRUE, this flag causes the CreateProcess
                                                function to override the switch and run the new process in the shared
                                                Virtual DOS Machine.
          67108864  CREATE_DEFAULT_ERROR_MODE   The new process does not inherit the error mode of the calling process.
                                                Instead, CreateProcess gives the new process the current default error
                                                mode.  An application sets the current default error mode by calling
                                                SetErrorMode.  This flag is particularly useful for multi-threaded shell
                                                applications that run with hard errors disabled.  The default behavior
                                                for CreateProcess is for the new process to inherit the error mode of
                                                the caller.  Setting this flag changes that default behavior.

          These flags control the new process’s priority class, which is used in determining the scheduling priorities
          of the process’s threads.  If none of the following priority class flags is specified, the priority class
          defaults to NORMAL_PRIORITY_CLASS unless the priority class of the creating process is IDLE_PRIORITY_CLASS.
          In this case the default priority class of the child process is IDLE_PRIORITY_CLASS.  One of the following
          flags can be specified:

             Value  Flag name                   Meaning
             -----  ---------                   -------
                32  NORMAL_PRIORITY_CLASS       Indicates a normal process with no special scheduling needs.
                64  IDLE_PRIORITY_CLASS         Indicates a process whose threads run only when the system is idle and
                                                are preempted by the threads of any process running in a higher priority
                                                class.  An example is a screen saver.  The idle priority class is
                                                inherited by child processes.
               128  HIGH_PRIORITY_CLASS         Indicates a process that performs time-critical tasks that must be
                                                executed immediately for it to run correctly.  The threads of a
                                                high-priority class process preempt the threads of normal-priority or
                                                idle-priority class processes.  An example is Windows Task List, which
                                                must respond quickly when called by the user, regardless of the load on
                                                the operating system.  Use extreme care when using the high-priority
                                                class, because a high-priority class CPU-bound application can use
                                                nearly all available cycles.
               256  REALTIME_PRIORITY_CLASS     Indicates a process that has the highest possible priority.  The threads
                                                of a real-time priority class process preempt the threads of all other
                                                processes, including operating system processes performing important
                                                tasks.  For example, a real-time process that executes for more than a
                                                very brief interval can cause disk caches not to flush or cause the
                                                mouse to be unresponsive.

      Returns previous setting.

  Fixed problem with RegDelValue under Windows NT.

  In the 32-bit version, fixed problem with Ctrl-Break not working during a
  RunWait.

  In the 32-bit version, FileCopy can now copy files to COM and LPT ports
  (the 16-bit version has always been able to do this).

  Increased the maximum number of extender entries from 100 to 200.

  In the 32-bit version of FileVerInfo, if you specify a blank string for
  "language-key", it will first try to look up the item under the language
  key "040904E4" (U.S. English w/ Windows Multilingual character set).  If
  that fails, it will then try the key "040904B0" (U.S. English w/ Unicode
  character set).

  FileVerInfo now returns a blank string ("") if the specified item was not
  found, instead of returning an error.

  Fixed problem passing the number -2147483648 as a string parameter to
  functions.

  In the 32-bit version, fixed FileExist so that it actually returns a value
  of 2 (as documented) if the file is open by another application.  It was
  returning a 1.

  Fixed problem with the Random() function crashing if a negative number was
  specified.

  Added new request #'s for WinMetrics:

    -6   pixels per horizontal dialog unit (rounded to an integer)
    -5   pixels per vertical dialog unit (rounded to an integer)

  Fixed problem with Debug displaying a return value of 0 for the last
  command in a script, if there was more than one blank line at the end of
  the script file.

  Fixed "Opening parenthesis missing" error when using a variable name such
  as 'max_users', where the portion of the variable name which preceded the
  underscore (ie, 'max') was the same as the name of a WIL function.

  In 32-bit version, fixed problem with Wallpaper() function in Windows NT 4.0.

  In 32-bit version, fixed problem with Display() function not timing out in
  some unusual cases.

  If you do an Exit from a called script, it will now really exit the program
  instead of returning to the calling script.

  In 32-bit version, you can now specify a blank section name for
  IniItemizePvt, but the specified INI file name must be a real file, not
  a "virtual" file that has been mapped to the registry.

  In 16-bit version, fixed a problem with WinMetrics(-4) returning 0 under
  Windows 3.1 if a network (such as Netware) was installed.

  In 32-bit version, changed NetInfo:

    NetInfo(0) will always return the string "WINNT", regardless of the
    operating system.  This is consistent with previous behavior.

    NetInfo(1) will now depend on the operating system:

      Under Windows 95, NetInfo(1) will return a list of installed network
      client ID's, delimited with the standard file delimiter (by default, a
      tab).  Some possible client ID's, with their corresponding
      descriptions, are:

        Client ID   Description
        ---------   -----------
        3OPEN       3Com 3+Open (all versions)
        3SHARE      3Com 3+Share (all versions)
        DLR         IBM OS/2 LAN Server (versions below 1.2)
        DLR12       IBM OS/2 LAN Server (version 1.2)
        DLR13       IBM OS/2 LAN Server (versions 1.2, 1.3, and 1.2 without /API)
        DLR13CSD    IBM OS/2 LAN Server (version 1.3 CSD 5015/5050)
        DLR20       IBM OS/2 LAN Server (version 2.0)
        FTPNFS      FTP Software NFS Client (InterDrive 95)
        LANMAN      Microsoft Real Mode LAN Manager
        LANT5       Artisoft LANtastic (version 5.X and above)
        MSNET       Real mode MS-Net Compatible
        NETWARE3    Novell NetWare (Workstation Shell 3.X [NETX])
        NETWARE4    Novell NetWare (Workstation Shell 4.0 and above [VLM])
        NOVELL32    Novell NetWare Client 32
        NWREDIR     Client for NetWare Networks
        PATHWKS     DEC PATHWORKS (versions below 4.0)
        PATHWKS40   DEC PATHWORKS (version 4.x)
        PCLP        IBM PC LAN Program (all versions)
        PCNFS50     SunSoft PC-NFS (version 5.0)
        VINES552    Banyan DOS/Windows 3.1 client
        VREDIR      Client for Microsoft Networks

      Under Windows NT, NetInfo(1) will return a list of installed network
      provider ID's, delimited with the standard file delimiter (by default,
      a tab).  Some possible providers, with their corresponding
      descriptions, are:

        Provider ID          Description
        -----------          -----------
        LanmanWorkstation    Microsoft Windows Network
        NetWareWorkstation   NetWare Services
        NWCWorkstation       NetWare or Compatible Network

  Fixed problem with Display() function causing a "DlgPointLookup Failure"
  if you put the Display() in a loop and held down the spacebar.

  In 32-bit version, improved the problem of SendKey (and SendKeysTo and
  SendKeysChild) sending keystrokes very slowly to DOS programs in Windows
  NT.  The speedup seems more noticeable in NT 4.0, although there should
  be some improvement in NT 3.51 as well.  If this new "SendKey speedup"
  mode causes problems, it can be disabled with the new IntControl(45).

  Fixed problem with using WaitForKey twice in a row to wait for the same
  key, where the second WaitForKey returned immediately and didn't wait.

  In 32-bit version, fixed problem with PlayWaveForm not working if a
  keyword was specified (eg, "SystemStart") instead of a filename.

  In 32-bit version, fixed problem with StrCmp, StrCmpi, and BinarySort,
  when comparing or sorting two strings which were the same except for a
  hyphen or apostrophe (eg, "coop" and "co-op").  StrCmp and StrCmpi would,
  in some cases, return 1 instead of -1 (and vice versa), and BinarySort
  would sort the two strings improperly.

  In Dialog function, fixed problem with radio buttons having text
  descriptions longer than 60 characters always being selected by default.

  In 32-bit version, changed the way the Run[..] functions launch data files:

    When launching data files, the Run[..] functions now retrieve the
    command-line parameters from the registry, as well as the application
    name.  For example, if the command line associated with .WBT files is:

      "C:\Program Files\WinBatch\System\WinBatch.Exe" "%1" %2

    (note the quote marks), and you use the WIL function:

      Run("Test Script.Wbt", "Alpha Beta")

    then the actual command that will be executed is:

      "C:\Program Files\WinBatch\System\WinBatch.Exe" "Test Script.Wbt" Alpha

    The quote marks from the command line (as specified in the registry) are
    preserved.  %1 gets replaced with the name of the data file.  %2 gets
    replaced with the first parameter from the Run function ('Alpha'), if any.
    If there were a %3 specified in the command line, it would have been
    replaced with the second parameter from the Run function ('Beta'), if any,
    but since there was no %3 specified the 'Beta' parameter was stripped off.

    If the command line specified in the registry does not contain a %1, the
    Run[..] functions assume that the (only) parameter to be passed to the
    application is the name of the data file, with quote marks around it.

  KeyToggleGet and KeyToggleSet now work properly in the 32-bit version.

  Sounds now defaults to @OFF in the 32-bit version.

  Fixed a problem sending Alt-key combinations and other extended keystrokes
  to a small number of unusual DOS programs, particularly the DOS EDIT.COM.


NetWare 3 extender 12016  First showing up in WB 96F

  (Note: the internal version number is mistakenly set as 12015)

  New function:

    n3CaptureGet(i:port-number)
      Returns the name of the print queue associated with a printer capture.

        "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc).

  Fixed problem with n3ServerList(request #'s 1 and 2) returning a blank
  string or garbage characters in the WWN3Z32I.DLL version.

  In the 32-bit version, fixed problem with n3CaptureEnd returning 0 and not
  ending the capture.


NetWare 4 extender 14014  First showing up in WB 96F

  New functions:

    n4CaptureGet(i:port-number)
      Returns the name of the print queue associated with a printer capture.

        "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc).

    n4ObjectList(s:context, s:parent, s:class, s:mask)
      Lists objects in a Directory Services tree.

        "context" is a NetWare context, or "" for the current context.

        "parent" is the object whose immediate subordinates are to be
        listed, or "" for the top of the tree.

        "class" identifies the type of objects to be listed.  It can be ""
        for all objects, or it can be one of the following NetWare classes:

          "AFP Server"
          "Alias"
          "Bindery Object"
          "Bindery Queue"
          "Computer"
          "Country"
          "Device"
          "Directory Map"
          "External Entity"
          "Group"
          "List"
          "Locality"
          "Message Routing Group"
          "Messaging Routing Group"
          "Messaging Server"
          "NCP Server"
          "Organization"
          "Organizational Person"
          "Organizational Role"
          "Organizational Unit"
          "Partition"
          "Person"
          "Print Server"
          "Printer"
          "Profile"
          "Queue"
          "Resource"
          "Server"
          "Top"
          "Unknown"
          "User"
          "Volume"

          Note: Standard NetWare servers have a class of "NCP Server".

        "mask" identifies the objects to be listed.  It can be "" for all
        names, or it can be a wildcard mask such as "Serv*".

      Returns a tab-delimited list of object names.

      Example:
        objects = n4ObjectList("", "", "Queue", "")
        ItemSelect("Queues in current context", objects, @TAB)

    n4ObjectInfo(s:context, s:object, i:request)
      Returns information on the specified object.

        "context" is a NetWare context, or "" for the current context.

        "object" is the name of a NetWare object.

        "request" is one of the following:
          0   Server (UNC) where the object is stored (eg, "\\SERVER").
              This is not necessarily the server on which the object is
              physically located.
          1   Object class (see "n4ObjectList" for  a list of classes).

      Example:
        server = n4ObjectInfo("Admin", "Print01", 0)
        Message("Print01 is located on", server)

    n4ObjectProps(s:context, s:object, s:attribute)
      Returns properties of the specified object.

        "context" is a NetWare context, or "" for the current context.

        "object" is the name of a NetWare object.

        "attribute":

          If "attribute" is a blank string (""), this function will return
          a tab-delimited list of all attributes for "object".

          If "attribute" specifies an valid attribute of "object", this
          function will return a tab-delimited list of values for that
          attribute.

            Note: Only string values will be returned correctly.

      Examples:
        host = n4ObjectProps("", "Print01", "Host Device")
        Message("Host Device", host)

        ; list all attributes and values for an object
        attribs = n4ObjectProps("", "Print01", "")
        count = ItemCount(attribs, @TAB)
        For i = 1 To count
          attrib = ItemExtract(i, attribs, @TAB)
          values = n4ObjectProps("", "Print01", attrib)
          ItemSelect(attrib, values, @TAB)
        Next

    n4NameConvert(s:context, s:object, i:format)
      Converts an object name to a different format.

        "context" is a NetWare context, or "" for the current context.

        "object" is the name of a NetWare object.

          If "object" contains a period ("."), it is assumed to be in
          canonical format; otherwise, it is assumed to be in abbreviated
          format.  If "object" begins with two slashes "\\", it is assumed
          to be a UNC.

          If "object" is in an invalid format, it will be returned as-is,
          without being converted.

        "format" specifies what format "object" will be converted to, and
        is one of the following:

          1   canonical,   typed    (eg, "CN=Server.O=Office")
          2   abbreviated, typed    (eg, "CN=Server")
          3   canonical,   typeless (eg, "Server.Office")
          4   abbreviated, typeless (eg, "Server")
          5   UNC                   (eg, "\\Server")

      Example:
        objname = n4NameConvert("", "\\Server", 3)
        Message("Object name", objname)

  In the 32-bit version, fixed problem with n4CaptureEnd returning 0 and not
  ending the capture.

  Fixed problem with n4MemberGet erroneously returning @FALSE in some cases.

  Fixed problem with n4ServerList(4) only returning the names of servers
  that were located in the current context.


Windows 32 extender 11000  First showing up in WB 96F

  Split the Windows 32 extender (WWNET32I.DLL) into separate extenders for
  Windows 95 (WWW9532I.DLL) and Windows NT (WWWNT32I.DLL).  The existing
  net[..] functions have been renamed to w95[..] and wnt[..], respectively:

    Old Windows 32     New Windows 95     New Windows NT
    --------------     --------------     --------------
    netAddDrive        w95AddDrive        wntAddDrive
    netAddPrinter      w95AddPrinter      wntAddPrinter
    netCancelCon       w95CancelCon       wntCancelCon
    netDirDialog       w95DirDialog       wntDirDialog
    netGetCon          w95GetCon          wntGetCon
    netGetUser         w95GetUser         wntGetUser
    netResources       w95Resources       wntResources
    netVersion         w95Version         wntVersion

  For backwards compatability, we are continuing to distribute an extender
  DLL named WWNET32I.DLL which supports the existing net[..] functions.
  However, this DLL is a "wrapper" or "shell" which calls the appropriate
  platform-specific extender DLL (ie, WWW9532I.DLL or WWWNT32I.DLL).
  Therefore, one of these two DLL's (depending on the operating system being
  used) will need to be available (either in the current directory, in the
  same directory as WWNET32I.DLL, or in a directory on the path).


Windows 95 extender 11000  First showing up in WB 96F

  New functions:

    w95ShareAdd(s:server-name, s:resource, s:share-name, i:share-type, i:flags)
      Shares a resource.

        "server-name" can be the name of the server on which the function
        will execute, or a blank string ("") to indicate the current machine.

        "resource" identifies the object to be shared.  It can be a directory
        name (eg, "C:\UTIL"), a printer object (eg, "HP LaserJet III"), or
        the name of a shareable device.

        "share-name" is the name by which other users will access the resource.

        "share-type" identifies what type of object "resource" is, and can
        be one of the following:

          0  directory
          1  printer
          2  device

        "flags" specifies the access type being granted to other users:

          If share-level access control is being used, then "flags" can be
          one of the following:

            100001  read-only
            100002  full
            100003  depends on password

              Note: If "resource" specifies a printer, then "flags" should
              be set to 100002.

          If user-level access control is being used, then "flags" should be
          set to 100002.

        Returns 1.

    w95ShareSet(s:server-name, s:share-name, s:comment, s:full-password, s:read-password)
      Sets additional share information for a resource.

        "comment" is a text string that can be used to describe the share,
        or a blank string ("") if no comment is desired.

        "full-password" and "read-password":

          If share-level access control is being used, and "share-name"
          specifies a directory, then "full-password" specifies the password
          that is required for full access, and "read-password" specifies
          the password that is required for read-only access.

          If share-level access control is being used, and "share-name"
          specifies a printer, then "full-password" specifies the password
          that is required for access, and "read-password" should be set to
          a blank string ("").

          If user-level access control is being used, then "full-password"
          and "read-password" should be set to blank strings ("").

        See "w95ShareAdd" for additional parameter information.

        Returns 1.

    w95ShareDel(s:server-name, s:share-name)
      Un-shares a resource.

        See "w95ShareAdd" for parameter information.

        Returns @TRUE if the share was deleted, or @FALSE if there was no
        share with the specified name.

    w95AccessAdd(s:server-name, s:resource, s:user/group name, i:access-rights, i:flags)
      Adds or updates an access (permission) record for a resource.

        If "resource" is a printer, it should be specified in the form:

          "\PRINT\sharename"

        "user/group name" is the name of the user or group to whom access is
        being granted.  If necessary, it can be fully qualified as
        "server\user".

        "access-rights" specifies the type of access that is being granted:

          It can be one of the following standard permission types:

            @ACC_READ_95   Read-only access
            @ACC_FULL_95   Full access

          Or, you can can specify a combination of the following custom
          permission bits, combined using the binary "OR" ("|") operator:

            @ACC_READ      Read
            @ACC_WRITE     Write
            @ACC_CREATE    Create
            @ACC_DELETE    Delete
            @ACC_ATTRIB    Change attributes
            @ACC_LIST      List files
            @ACC_CONTROL   Change access control

          If "resource" specifies a printer, "access-rights" should be:

            @ACC_FULL_95   Full access

        "flags" is reserved for future use, and should be set to 0.

        See "w95ShareAdd" for additional parameter information.

        If an access record already exists for "resource" for the specified
        "user/group name", it will be updated to have the specified
        "access-rights".

        Note: This function can only be used if user-level access control
        is being used (this is configured under "Network" settings).

        Returns 1.

    w95AccessDel(s:server-name, s:resource, s:user/group name)
      Removes an access (permission) record from a resource.

        If "resource" is a printer, it should be specified in the form:

          "\PRINT\sharename"

        See "w95ShareAdd" and "w95AccessAdd" for parameter information.

        Note: This function can only be used if user-level access control
        is being used (this is configured under "Network" settings).

        Returns @TRUE if any records were deleted, or @FALSE if no
        appropriate records were found.

    w95ListGroups(s:server)
      Lists all global user groups in an NT domain.

        "server" is the UNC name of an NT primary or backup domain
        controller, to which you are logged in (eg, "\\MYSERVER").

      Note: In order to use this function, you must have RADMIN32.DLL and
      RLOCAL32.DLL present.  These DLL's can be found in the Microsoft
      Windows 95 Service Pack 1.

      Returns tab-delimited list of groups.

    w95MemberGet(s:server, s:group, s:user)
      Determines if user is a member of a global group in an NT domain.

        "server" is the UNC name of an NT primary or backup domain
        controller, to which you are logged in (eg, "\\MYSERVER").

      Note: In order to use this function, you must have RADMIN32.DLL and
      RLOCAL32.DLL present.  These DLL's can be found in the Microsoft
      Windows 95 Service Pack 1.

      Returns @TRUE or @FALSE.

    w95MemberSet(s:server, s:group, s:user)
      Adds user to a global group in an NT domain.

        "server" is the UNC name of an NT primary or backup domain
        controller, to which you are logged in (eg, "\\MYSERVER").

      Note: In order to use this function, you must have RADMIN32.DLL and
      RLOCAL32.DLL present.  These DLL's can be found in the Microsoft
      Windows 95 Service Pack 1.

      Returns @TRUE on success; @FALSE if user already member of group.

    w95MemberDel(s:server, s:group, s:user)
      Removes user from a global group in an NT domain.

        "server" is the UNC name of an NT primary or backup domain
        controller, to which you are logged in (eg, "\\MYSERVER").

      Note: In order to use this function, you must have RADMIN32.DLL and
      RLOCAL32.DLL present.  These DLL's can be found in the Microsoft
      Windows 95 Service Pack 1.

      Returns @TRUE on success; @FALSE if user not member of group.

    w95MemberGrps(s:server, s:user)
      Lists all global groups in an NT domain to which a user belongs.

        "server" is the UNC name of an NT primary or backup domain
        controller, to which you are logged in (eg, "\\MYSERVER").

      Note: In order to use this function, you must have RADMIN32.DLL and
      RLOCAL32.DLL present.  These DLL's can be found in the Microsoft
      Windows 95 Service Pack 1.

      Returns tab-delimited list of groups.

    w95MemberList(s:server, s:group)
      Lists all members of a global group in an NT domain.

        "server" is the UNC name of an NT primary or backup domain
        controller, to which you are logged in (eg, "\\MYSERVER").

      Note: In order to use this function, you must have RADMIN32.DLL and
      RLOCAL32.DLL present.  These DLL's can be found in the Microsoft
      Windows 95 Service Pack 1.

      Returns tab-delimited list of users.

Windows NT extender 11000  First showing up in WB 96F

  New functions:

    wntShareAdd(s:server-name, s:resource, s:share-name, i:share-type, i:max-users)
      Shares a resource.

        "server-name" can be the name of the server on which the function
        will execute, or a blank string ("") to indicate the current machine.
        If "share-type" = 1 (printer), then "server-name" is ignored and
        should be set to a blank string ("").

        "resource" identifies the object to be shared.  It can be a directory
        name (eg, "C:\UTIL"), a printer object (eg, "HP LaserJet III"), or
        the name of a shareable device.

        "share-name" is the name by which other users will access the resource.

        "share-type" identifies what type of object "resource" is, and can
        be one of the following:

          0  directory
          1  printer
          2  device

        "max-users" indicates the maximum number of users allowed, or -1 for
        the highest possible number.  If "share-type" = 1 (printer), this
        parameter is ignored and should be set to -1.

        Returns 1.

    wntShareSet(s:server-name, s:resource/share-name, i:share-type, s:comment, s:location)
      Sets additional share information for a resource.

        "resource/share-name" identifies the object to be modified:

          If "share-type" = 1 (printer), then "resource/share-name" should
          specify the object's resource name (eg, "HP LaserJet III").
          Otherwise, it should specify the object's share name.

        "comment" is a text string that can be used to describe the share,
        or a blank string ("") if no comment is desired.

        "location":

          If "share-type" = 1 (printer), then this is a text string that can
          be used to describe the location of the printer, or a blank string
          ("") if no location description is desired.

          For other share types, this parameter is ignored and should be set
          to a blank string ("").

        See "wntShareAdd" for additional parameter information.

        Returns 1.

    wntShareDel(s:server-name, s:resource/share-name, i:share-type)
      Un-shares a resource.

        "resource/share-name" identifies the object to be modified:

          If "share-type" = 1 (printer), then "resource/share-name" should
          specify the object's resource name (eg, "HP LaserJet III").
          Otherwise, it should specify the object's share name.

        See "wntShareAdd" for additional parameter information.

        Returns @TRUE if the share was deleted, or @FALSE if there was no
        share with the specified name.

    wntAccessAdd(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.

        "server-name" can be the name of the server on which the function
        will execute, or a blank string ("") to indicate the current machine.
        This is used for looking up share names (if "resource/share-name"
        specifies a share) and user/group names.

        "resource/share-name" identifies the object to be modified:

          If "object-type" = 100 (share), then "resource/share-name" should
          specify the name of the share.

          If "object-type" = 400 (registry key), then "resource/share-name"
          should be the handle of an open registry key (opened with the
          "RegOpenKey" function), or a predefined registry handle (listed
          in the WIL Reference under "Registration Database Operations").

          Otherwise, "resource/share-name" should specify the name of the
          resource (eg, "HP LaserJet III" or "C:\UTIL\MYFILE.TXT").

        "user/group name" is the name of the user or group to whom access is
        being granted.  If necessary, it can be fully qualified as
        "server\user".

        "object-type" indicates the type of object identified by
        "resource/share-name", and can be one of the following:

          100  share (eg, a directory accessed through a share)
          200  printer (accessed through a share)
          300  file or directory in an NTFS partition
          400  registry key

        "access-string" specifies the type of access that is being granted.
        It can be either (A) a predefined access type, or (B) a delimited list
        of one or more specific "access-records".  Both are described below:

          (A) Predefined access types:

            These get translated into specific access records, as shown.  It
            is possible that the appropriate values may vary depending on your
            system configuration, or among different versions of Windows NT:

              Access-string       Meaning            Specific equivalent
              --------------      ----------------   --------------------------
              "DirNT:List"        List               "0:2:1179817"
              "DirNT:Read"        Read               "0:9:-1610612736|0:2:1179817"
              "DirNT:Add"         Add                "0:2:1180086"
              "DirNT:AddRead"     Add & Read         "0:9:-1610612736|0:2:1180095"
              "DirNT:Change"      Change             "0:9:-536805376|0:2:1245631"
              "DirNT:Full"        Full Control       "0:9:268435456|0:2:2032127"
              "DirNT:None"        No Access          "1:9:268435456|1:2:2032127"

              "DirShare:Read"     Read               "0:0:1179817"
              "DirShare:Change"   Change             "0:0:1245631"
              "DirShare:Full"     Full Control       "0:0:2032127"
              "DirShare:None"     No Access          "1:0:2032127"

              "File:Read"         Read               "0:0:1179817"
              "File:Change"       Change             "0:0:1245631"
              "File:Full"         Full Control       "0:0:2032127"
              "File:None"         No Access          "1:0:2032127"

              "Print:Print"       Print              "0:0:131080"
              "Print:Manage"      Manage Documents   "0:0:131072|0:0:268435456"
              "Print:Full"        Full Control       "0:0:983052|0:0:268435456"
              "Print:None"        No Access          "1:0:983052|1:0:268435456"

              "Reg:Read"          Read               "0:2:131097"
              "Reg:Full"          Full Control       "0:2:983103"

                Note: "DirShare" is a directory accessed through a share
                ("object-type" = 100).  "DirNT" is a directory in an NTFS
                partition, accessed through NT security ("object-type" = 300).

          (B) Specific "access-records":

            This can be a single record, or a list of records (maximum of 10)
            delimited with vertical bars (|).  Each record is in the format:

              record-type:access-flags:access-rights

            where "record-type", "access-flags", and "access-rights" are each
            a decimal number, separated with colons (:).

            It is not expected that most users will want to manually create
            or edit "access-records" strings.  Instead, you can use the
            "wntAccessGet" function to return an "access-records" string in
            the proper format to be used with this function.  This can be
            useful for transferring access rights from one user to another.

            A brief description of the fields in the "access-records" string
            follows (note that any detailed explanation is beyond the scope of
            this document, but might be obtained from the WIN32 SDK programmers'
            documentation available from Microsoft and other publishers):

              "record-type" (one of the following):

                0  ACCESS_ALLOWED_ACE_TYPE
                1  ACCESS_DENIED_ACE_TYPE

              "access-flags" (0, or, one or more of the following):

                1  OBJECT_INHERIT_ACE
                2  CONTAINER_INHERIT_ACE
                4  NO_PROPAGATE_INHERIT_ACE
                8  INHERIT_ONLY_ACE

              "access-rights" (one or more of the following, usually several,
              depending on the object type; this is not a complete list):

                          1  FILE_LIST_DIRECTORY (Dir)
                          1  FILE_READ_DATA (File)
                          2  FILE_ADD_FILE (Dir)
                          2  FILE_WRITE_DATA (File)
                          4  FILE_ADD_SUBDIRECTORY (Dir)
                          4  FILE_APPEND_DATA (File)
                          8  FILE_READ_EA
                         16  FILE_WRITE_EA
                         32  FILE_TRAVERSE (Dir)
                         32  FILE_EXECUTE (File)
                         64  FILE_DELETE_CHILD
                        128  FILE_READ_ATTRIBUTES
                        256  FILE_WRITE_ATTRIBUTES
                      65536  DELETE
                     131072  READ_CONTROL
                     262144  WRITE_DAC
                     524288  WRITE_OWNER
                    1048576  SYNCHRONIZE
                  268435456  GENERIC_ALL
                  536870912  GENERIC_EXECUTE
                 1073741824  GENERIC_WRITE
                -2147483648  GENERIC_READ

        If any access records already exist for "resource/share-name" for
        the specified "user/group name", they will be removed before adding
        the records specified by "access-string".

        Note: If you have not previously added any permissions to a share,
        it may implicitly have some default permissions (eg, when you create
        a share for a directory, it defaults to giving "Full Control" access
        to "Everyone").  When you use "wntAccessAdd" to create an access
        record for such a share, it will supercede those default permissions
        (ie, the default permissions will be removed).  If you wish to keep
        the default permissions, use "wntAccessAdd" to set them explicitly.

        Returns 1.

    wntAccessDel(s:server-name, s:resource/share-name, s:user/group name, i:object-type)
      Removes access (permission) records from a resource.

        This function removes all access records from "resource/share-name"
        that are associated with "user/group name".

        See "wntAccessAdd" for parameter information.

        Returns @TRUE if any records were deleted, or @FALSE if no
        appropriate records were found.

    wntAccessGet(s:server-name, s:resource/share-name, s:user/group name, i:object-type)
      Returns access (permission) records for a resource.

        Returns a list of access records for "resource/share-name" for the
        specified "user/group name", delimited with vertical bars (|).  See
        "wntAccessAdd" for information on the format of the access records.

        If there are no appropriate records, it returns a blank string ("").

        Note: If you have not previously added any permissions to a share,
        it may implicitly have some default permissions (eg, when you create
        a share for a directory, it defaults to giving "Full Control" access
        to "Everyone"), although there may not actually be any access records
        for the share.  Therefore, "wntAccessGet" may return a blank string
        ("").  However, if you go into File Manager (or Explorer), bring up
        the "Permissions" dialog for the share, and then simply select "OK",
        it will cause the implicit permissions to become actual permissions,
        which you can then retrieve using "wntAccessGet".

        See "wntAccessAdd" for parameter information.

        Returns a delimited list of access records.

    wntListGroups(s:server, i:group-type)
      Lists all user groups on a server or domain.

        "server" is the UNC name of the server on which the function will
        execute (eg, "\\MYSERVER"), or "" for the local computer.

        "group-type" can be @LOCALGROUP or @GLOBALGROUP.

      Returns tab-delimited list of groups.

    wntMemberGet(s:server, s:group, s:user, i:group-type)
      Determines if user is a member of a group.

        "server" is the UNC name of the server on which the function will
        execute (eg, "\\MYSERVER"), or "" for the local computer.

        "group-type" can be @LOCALGROUP or @GLOBALGROUP.

      Returns @TRUE or @FALSE.

    wntMemberSet(s:server, s:group, s:user, i:group-type)
      Adds user to a group.

        "server" is the UNC name of the server on which the function will
        execute (eg, "\\MYSERVER"), or "" for the local computer.

        "group-type" can be @LOCALGROUP or @GLOBALGROUP.

      Returns @TRUE on success; @FALSE if user already member of group.

    wntMemberDel(s:server, s:group, s:user, i:group-type)
      Removes user from a group.

        "server" is the UNC name of the server on which the function will
        execute (eg, "\\MYSERVER"), or "" for the local computer.

        "group-type" can be @LOCALGROUP or @GLOBALGROUP.

      Returns @TRUE on success; @FALSE if user not member of group.

    wntMemberGrps(s:server, s:user, i:group-type, i:flags)
      Lists all groups to which a user belongs.

        "server" is the UNC name of the server on which the function will
        execute (eg, "\\MYSERVER"), or "" for the local computer.

        "group-type" can be @LOCALGROUP or @GLOBALGROUP.

        "flags" -- if "group-type" = @LOCALGROUP, you can set "flags" to 1
        to include groups that the user is a member of indirectly.
        Otherwise, set to 0.

      Returns tab-delimited list of groups.

    wntMemberList(s:server, s:group, i:group-type)
      Lists all members of a user group.

        "server" is the UNC name of the server on which the function will
        execute (eg, "\\MYSERVER"), or "" for the local computer.

        "group-type" can be @LOCALGROUP or @GLOBALGROUP.

      Returns tab-delimited list of users.

    wntResources2(s:net-resource, i:scope, i:type, i:usage, s:provider)
      Itemizes network resources.

      Note: This function supercedes the "wntResources" function.

        This function returns a tab-delimited list of network resources
        which are located immediately below the specified 'net-resource'.

        'net-resource' can be a server UNC (eg, "\\FredsPC"), a domain (eg,
        "SALES"), or the name of a container object within a domain (eg,
        "Directory Services").  It cannot be a network provider.  You can
        specify "" for the root of the network or the root of the network
        provider (depending on the 'provider' parameter, below).

        'scope' can be one of the following:
          1   All currently connected resources
          2   All resources on the network
          3   All remembered (persistent) connections

        'type' can be one of the following:
          0   All resources
          1   All disk resources
          2   All print resources
          3   All disk and print resources

        'usage' can be one of the following:
          0   All resources
          1   All connectable resources
          2   All container resources
          3   All connectable and container resources

          Note: A "connectable" object is an object that can be connected
          to, such as a directory or a printer.  A "container" object is an
          object that contains other objects, such as a domain or a server.

        'provider' is the name of the network provider under which
        'net-resource' is located, most commonly "Microsoft Windows Network"
        (for Windows NT) or "Netware Services" (for Netware).  If you don't
        have any secondary networks on your system, you can usually specify
        a blank string ("") for 'provider'.

        If you specify blank strings ("") for both 'net-resource' and
        'provider', this function will return a list of network providers.

        If you specify a blank string ("") for 'net-resource' and a non-blank
        'provider', this function will return a list of network resources
        located beneath 'provider'.

        Note: 'net-resource', 'usage', and 'provider' are ignored unless
        'scope' is 2.  That is, you can itemize all current or persistent
        connections network-wide, eg:

          wntResources2("", 1, 0, 1, "")

        Or you can itemize all available resources under a specific
        'net-resource', eg:

          wntResources2("\\JELLO", 2, 0, 1, "Microsoft Windows Network")

        But you can't do both at the same time, ie, you can't itemize
        current connections under a specific 'net-resource'.

    wntServiceAt(s:server, s:domain, i:server-type, s:service-name, i:flags)
      Lists all servers in a domain which contain a specified service.

        "server" is the UNC name of the server on which the function will
        execute (eg, "\\MYSERVER"), or "" for the local computer.

        "domain" is the name of the domain which will be used (eg, "SALES"),
        or "" for the primary domain.

        "server-type" identifies the type of servers which will be examined.
        You can specify -1 for all servers.  Or, you can specify one or more
        of the following flags, combined using the binary OR ("|") operator;
        servers meeting

                    1  All LAN Manager workstation
                    2  All LAN Manager server
                    4  Any server running with Microsoft SQL Server
                    8  Primary domain controller
                   16  Backup domain controller
                   32  Server running the timesource service
                   64  Apple File Protocol servers
                  128  Novell servers
                  256  LAN Manager 2.x Domain Member
                  512  Server sharing print queue
                 1024  Server running dialin service
                 2048  Xenix server
                 4096  Windows NT (either workstation or server)
                 8192  Server running Windows for Workgroups
                16384  Microsoft File and Print for Netware
                32768  Windows NT Non-DC server
                65536  Server that can run the browser service
               131072  Server running a browser service as backup
               262144  Server running the master browser service
               524288  Server running the domain master browser
              4194304  Windows 95 or newer
          -2147483648  Domain announcement

        "service-name" is the name of the service to be looked for.

        "flags" specifies information on the service being looked for.  It
        consists of one entry from each of the following three groups, added
        together:

          service type:

               1  services
               2  drivers
               3  both (services and drivers)

          service state:

             100  active services
             200  inactive services
             300  both (active and inactive)

          name type (indicates what the "service-name" parameter represents):

               0  display name (the name shown in Control Panel)
            1000  service name (the actual registry key name)

        Returns a tab-delimited list of server UNC names (eg, "\\MYSERVER").

        Note: An NT workstation can be considered to be a "server".

        Note: This function can take a while to run, depending on how many
        servers are in the domain.  Also, it will only return the names of
        servers which it is able to access, which requires that the user
        have browse access to their service control managers.

    wntChgPswd(s:server/domain, s:user, s:old-pass, s:new-pass)
      Changes a user's password.

        "server/domain" can be either a server name (eg, "\\MYSERVER") or
        domain name (eg, "SALES") on which the password will be changed, or
        a blank string ("") for the current user's login domain.

        "user" is the name of the user whose password will be changed, or a
        blank string ("") for the current user's login name.

        "old-pass" is the user's existing password on "server/domain".  It
        can be a blank string ("") if the user has no existing password.

        "new-pass" is the new password to be set.  It can be a blank string
        to indicate ("") that no password is desired.

        Returns 1.


Windows 3.1 (Basic) extender 15003  First showing up in WB 96F

  w3AddCon and w3GetCon now accept printer ports higher than LPT3 (up to LPT9).


Windows for Workgroups (MultiNet) extender 16002  First showing up in WB 96F

  wnAddCon and wnGetCon now accept printer ports higher than LPT3 (up to LPT9).

  All functions which change the active sub-network now restore it afterwards.
  This fixes a problem with using NetInfo after one of the extender functions.


WILX extender 11105  First showing up in WB 96F

  In the 32-bit version, changed xMemCompact:

    In Windows 95, this function is not supported and will return 0.

    In Windows NT, this function has been fixed to use the appropriate Win32
    system calls.  Since there's no distinction between local and global
    memory in NT, it doesn't make any difference whether you specify a
    'type' of 0 or 1.


WB 96G  Oct 21, 1996

  Changed "AutoExec" processing (see "WB 96F" section, above), as follows:

    The file names specified by "AutoExecWbc" and "AutoExecWbt" cannot
    contain any path information (ie, no '\' or ':' characters).  If they
    do, they will be ignored.  These files must be located in the same
    directory as the WinBatch program (ie, for "AutoExecWbc", the directory
    where your compiled WinBatch script is located; and for "AutoExecWbt",
    the directory where WINBATCH.EXE or WBAT16I.EXE is located).


DLL 2.3gbn  First showing up in WB 96G

  Fixed string memory leak when comparing "floating point string" variables, eg:
    x = "1.25"
    If x != 0 Then y = 1

  FileVerInfo now returns the string "NONE" if no version information is
  available for the specified file (previously, it returned an error).


Windows NT extender 11001  First showing up in WB 96G

  Fixed problem with wntAccessAdd, when accessing registry keys.


Windows 3.1 (Basic) extender 15004  First showing up in WB 96G

  Fixed problem with the extender not loading due to a "wrong platform" error.


WB 96H  Nov 4, 1996

  In compiler, fixed a problem creating an EXE if the 'TEMP' environment
  variable pointed to an invalid directory.


DLL 2.3hbn  First showing up in WB 96H

  You can now specify partial child window names beginning with a tilde (~)
  (see "DLL 2.2abj" section, above).

  In Debug mode, a couple of status strings were not being displayed when
  appropriate: "*** Debug Initialized ***" and "IF DO==>FALSE".


WB 96J  Nov 5, 1996

  Fixed problem with BoxDestroy not removing buttons.


DLL 2.3jbn  First showing up in WB 96J

  In 32-bit version, fixed problem with network licensing.

  Fixed problem parsing constant names which contain underscores (eg,
  "@ATTR_RO") (this bug first appeared in 2.3fbn).

  Improved MouseClick function.  Double-clicks should now work better (there
  was a problem with some applications).  In the 32-bit version, improved
  the method of emulating other types of clicks, especially when using
  modifiers such as @SHIFT and @CTRL.

  Fixed problem with SendMenusTo with double-byte character sets.

  In the Dialog function, fixed problem where the dialog would be centered
  on the screen if you specified a small number (less than 20 or so) for the
  Y (vertical) coordinate.

  In 32-bit version, improved the reliability of the DiskFree and DiskSize
  functions with drives larger than 2 gigabytes, under Windows 95 OEM
  Service Release 2 or higher.  Under earlier versions of Windows 95, these
  functions may not return accurate results.  Under NT, there is no problem.


Windows NT extender 11002  First showing up in WB 96J

  New functions:

    wntOwnerGet(s:server-name, i:reg-key, s:resource-name, i:object-type, i:flag)
      Returns the owner of an object.

        "server-name" can be the name of the server on which the function
        will execute, or a blank string ("") to indicate the current machine.
        This is used for looking up user/group names.

        "reg-key" is used only if the object is a registry key:

          If "object-type" = 400 (registry key), then "reg-key" should be
          the handle of an open registry key (opened with the "RegOpenKey"
          function), or a predefined registry handle (listed in the WIL
          Reference under "Registration Database Operations").

          Otherwise, "reg-key" is ignored, and should be specified as 0.

        "resource-name" identifies the object to be accessed:

          If "object-type" = 400 (registry key), then "resource-name" can be
          a subkey string relative to "reg-key", or a blank string ("") if
          "reg-key" represents the actual object to be accessed.

          Otherwise, "resource-name" should specify the name of the object
          (eg, "C:\UTIL\MYFILE.TXT").

        "object-type" indicates the type of object identified by
        "resource-name", and can be one of the following:

          300  file or directory in an NTFS partition
          400  registry key

        "flag" specifies the format of the returned string, and can be one
        of the following:

          0  account         (eg, "johndoe")
          1  domain\account  (eg, "OFFICE\johndoe")

          Note: For built-in accounts which are predefined by the system
          (eg, "Administrators"), only the account name is returned,
          regardless of the "flag" setting.

      Returns the name of the account that owns the object, or a blank
      string ("") if the object has no owner.

    wntOwnerSet(s:server-name, i:reg-key, s:resource-name, i:object-type, s:user/group name)
      Takes ownership of an object.

        "user/group name" is the name of the user or group who is taking
        ownership of the object.  If necessary, it can be fully qualified as
        "server\user".  It can be either the current user, or "Administrators".
        You can specify a blank string ("") to indicate "Administrators".

        "object-type" indicates the type of object identified by
        "resource-name", and can be one of the following:

          300  file or directory in an NTFS partition
          400  registry key

        In addition to taking ownership of an object, you may also wish to
        reset the object's access (permission) records to the system default
        (which grants full control to everyone).  To do this, add 50 to the
        values for "object-type" listed above, ie:

          350  file or directory in an NTFS partition -- reset access records
          450  registry key                           -- reset access records

        After resetting the object's access records, you can use the
        wntAccessAdd function to change the object's permissions.

        See wntOwnerGet for additional parameter information.

        Returns 1.


NetWare 3 extender 12017  First showing up in WB 96J

  n3MsgSend now returns @FALSE if the specified user is not logged in, and
  returns an error if an invalid user name is specified.


NetWare 4 extender 14015  First showing up in WB 96J

  Fixed problem with n4CaptureGet returning an incorrect name in some cases.

  Changed n4CaptureGet to return an abbreviated name relative to the current
  context (eg, "Printer1.Print") instead of a canonical name
  (eg, "Printer1.Print.Sales").

  n4MsgSend now returns @FALSE if the specified user is not logged in, and
  returns an error if an invalid user name is specified.


WB 96K  Dec 9, 1996

  Fixed problem (introduced in 96J) with large EXE's failing to extract the
  embedded DLL's if launched from a UNC (with a "Disk space lookup" error).


DLL 2.3kbn  First showing up in WB 96K

  Fixed problem (introduced in 96J) with FileCopy, FileMove, and FileAppend
  failing if the target was a UNC (with an "Insufficient free space" error).

  Fixed problem with DirExist returning @FALSE for a top-level UNC (eg,
  "\\FredsPC\C").


WB 96M  Dec 12, 1996


DLL 2.3mbn  First showing up in WB 96M

  In 32-bit version, fixed problem with SendKey causing a system crash under
  NT 4.0 when sending keystrokess to two different windows and switching
  back and forth rapidly between them.


NetWare 3 extender 12018  First showing up in WB 96M

  Fixed problem with n3GetMapped truncating the server name parameter after
  14 characters (instead of 16).


NetWare 4 extender 14016  First showing up in WB 96M

  Fixed problem with n4GetMapped truncating the server name parameter after
  14 characters (instead of 16).


WB 97A  Jun 12, 1997

  New IntControl's:

    IntControl(1005, p1, 0, 0, 0)
      Gets or starts shutdown script mode.

      This IntControl allows you to specify a script that will run when Windows
      is shut down or (in Windows 95 and Windows NT) when the user logs off.

        P1  Meaning
        --  -------
        0   Get shutdown state (@TRUE if in shutdown mode, @FALSE if normal script)
        1   Enter shutdown mode

      If "p1" == 0, the function will return a TRUE/FALSE flag indicating whether
      the current WinBatch script is running in shutdown mode.  If "p1" == 1,
      the current script will stop processing and will enter shutdown mode.

      When WinBatch enters shutdown mode, it stops processing the current script,
      closes the normal WinBatch window, and stays running in the background
      waiting for Windows to shut down (or the user to log off).  When this
      shutdown event occurs, WinBatch re-loads the script (the same script that
      was running when shutdown mode was entered) and runs it again from the
      beginning.  If the script that was previously running was launched via a
      "Call" command, WinBatch will re-load and run the parent (calling) script.

      The actual shutdown procedure varies a bit among different versions of
      Windows.  Here is what happens, step-by-step, when WinBatch is in
      shutdown mode, and the user initiates a Windows shutdown (or logoff):

        Windows 3.1 / Windows for Workgroups:

          Windows queries all running applications, asking whether they agree
          to close.  WinBatch agrees to close.  If all the other apps agree to
          close as well, then Windows informs all the apps that the session is
          ending.  At that time, WinBatch runs the script.  When the script is
          finished, Windows shuts down.

        Windows 95:

          Windows queries all running applications, asking whether they agree
          to close.  WinBatch agrees to close.  If all the other apps agree to
          close as well, then Windows informs all the apps that the session is
          ending.  At that time, WinBatch runs the script.  When the script is
          finished, the Windows session ends.  If the script takes more than
          about 20 seconds to run, Windows unconditionally terminates the
          script and the Windows session ends.

        Windows NT:

          Windows queries each running application in turn, asking whether it
          agrees to close.  When it queries WinBatch, WinBatch displays a
          message box, asking the user to first close all other open windows.
          When the user presses the "OK" button in the message box, WinBatch
          agrees to close, then Windows informs WinBatch that the session is
          ending, and then WinBatch runs the script.  (If, however, the user
          presses the "Cancel" button in the message box, WinBatch refuses to
          close, and the shutdown process is cancelled.)  If the script takes
          more than about 20 seconds to run, Windows displays a message box,
          giving the user an opportunity to terminate WinBatch, but the script
          continues processing until the user responds to the message.  When
          the script is finished, if there are any other apps still running,
          Windows continues querying each app in turn, asking whether it agrees
          to close.  Ater all the apps agree to close, the Windows session ends.
          If any app refuses to close, the shutdown process is cancelled.

      Example:
        rc = IntControl(1005, 0, 0, 0, 0)  ; get shutdown state

        If rc == @FALSE                    ; if we're running as a normal script
          IntControl(1005, 1, 0, 0, 0)     ; enter shutdown mode
          Exit                             ; this 'Exit' is not really necessary
        Endif

        ; if we got here, we're running in shutdown mode
        Display(1, "Windows Shutdown", "WinBatch shutdown processing begins now")
        ErrorMode(@OFF)
        FileDelete("c:\temp\*.tmp")
        ErrorMode(@CANCEL)

    IntControl(1006, 0, 0, 0, 0)
      Returns the un-parsed WinBatch command line.

        This returns the actual command line string that WinBatch was launched with.

  IntControl 1004 now returns a full path for compiled WinBatch EXE's.

  In 32-bit version, fixed problem with compiler where large (standalone)
  compiled EXE's run from a floppy drive were extracting the DLL to the
  floppy drive instead of to the Windows directory.

  Improved the internal version information in the executables and DLL's.

  Increased the amount of memory available for strings from 32000 bytes to
  65500 bytes.


DLL 2.4abp  First showing up in WB 97A

  New functions:

    RegExistKey(handle, subkey-string)
      Checks whether a registry key exists.

        This function returns @TRUE if the specified registry key exists and
        is accessible (ie, can be opened with RegOpenKey).  Otherwise, it
        returns @FALSE.

        See RegOpenKey for parameter information.

    RegExistValue(handle, subkey-string) (32-bit only)
      Checks whether a value for a registry key exists.

        This function returns @TRUE if the specified registry value (data
        item) exists and is accessible (ie, can be read with RegQuery[..]).
        Otherwise, it returns @FALSE.

        See RegQueryValue for parameter information.

    StrIndexWild(string, pattern, start)
      Finds wildcarded text within a larger string.

        Parameters:
          (s) string:  The string to search in.
          (s) pattern: The wildcarded text to search for.
          (i) start:   The position (in characters) within the string to begin searching.

        Returns:
          (i) The position (in characters) within the string where the text
              matching the wildcard pattern was found, or 0 if not found.

        In the wildcard pattern, "*" matches zero or more characters, and
        "?" matches any one character.

        Examples:
          StrIndexWild("abcd1234wxyz", "ab*wx", 1)   ; would return 1
          StrIndexWild("abcd1234wxyz", "1*9", 1)     ; would return 0 (no match)
          StrIndexWild("abcd1234wxyz", "1*4", 1)     ; would return 5
          StrIndexWild("abcd1234wxyz", "1?34*z", 1)  ; would return 5

    StrLenWild(string, pattern, start)
      Returns the length of wildcarded text within a larger string.

        Parameters:
          (s) string:  The string to look in.
          (s) pattern: The wildcarded text to match.
          (i) start:   The position (in characters) within the string to begin matching.

        Returns:
          (i) The length (in characters) of the portion of the string that matches
              the wildcard pattern, or 0 if no match at the specified position.

        In the wildcard pattern, "*" matches zero or more characters, and
        "?" matches any one character.

        Examples:
          StrLenWild("abcd1234wxyz", "ab*wx", 1)   ; would return 10
          StrLenWild("abcd1234wxyz", "1*9", 1)     ; would return 0
          StrLenWild("abcd1234wxyz", "1*4", 5)     ; would return 4
          StrLenWild("abcd1234wxyz", "1?34*z", 5)  ; would return 8

    StrSubWild(string, pattern, start)
      Extracts a substring matching wildcarded text from within a larger string.

        Parameters:
          (s) string:  The string to look in.
          (s) pattern: The wildcarded text to match.
          (i) start:   The position (in characters) within the string to begin matching.

        Returns:
          (s) The portion of the string matched by the wildcard pattern.

        In the wildcard pattern, "*" matches zero or more characters, and
        "?" matches any one character.

        Examples:
          StrSubWild("abcd1234wxyz", "ab*wx", 1)   ; would return "abcd1234wx"
          StrSubWild("abcd1234wxyz", "1*9", 1)     ; would return ""
          StrSubWild("abcd1234wxyz", "1*4", 5)     ; would return "1234"
          StrSubWild("abcd1234wxyz", "1?34*z", 5)  ; would return "1234wxyz"

    ClipGetEx(format)
      Returns the contents of the Windows clipboard in a specified format.

        This function is similar to ClipGet, but it allows to you specify
        the format in which the text is returned.  Valid formats are:

          Format  Meaning
          ------  -------
             1    (CF_TEXT)         Standard ANSI text (same as ClipGet).
             7    (CF_OEMTEXT)      Text containing characters in the OEM character set.
            13    (CF_UNICODETEXT)  Unicode text format (32-bit version under Windows NT only)

    WinItemizeEx(s:partial-winname, i:multiple, i:hidden)
      Returns the full name of window(s) matching a partial window name.

        'partial-winname' specifies a partial window name to look for.  It
        can be a blank string (""), in which case it will match any window.

          Note: this function does not accept a Window ID as the
          'partial-winname' parameter.

        If 'multiple' is @TRUE, then this function returns a tab-delimited
        list of all open windows that match 'partial-winname'.  If 'multiple'
        is @FALSE, then it returns the name of the first open window found
        that matches 'partial-winname'.  If no appropriate matching windows
        are found, it returns a blank string ("").

        If 'hidden' is @TRUE, then hidden windows are included in the list
        of returned windows.  If 'hidden' is @FALSE, then hidden windows are
        not included.  If 'hidden' is @FALSE and 'multiple' is @FALSE, then
        this function returns the name of the first visible (non-hidden)
        open window found that matches 'partial-winname'.

  Fixed problem with SendKey[..] in unusual cases displaying the error:
  "WinIsDos: Window not found or bad window".

  In 32-bit version, SendMenusTo now attempts to wait until the specified
  application window is ready to accept input (like SendKey[..] does).  This
  can be disabled with IntControl(43).

  Changed DateTime/TimeDate and FileTimeGet to return a Day/Night code (eg,
  AM or PM) of from 0 to 4 characters (depending on what is set in the user's
  current International/Regional settings), instead of a fixed 2-character
  string, in order to support double-byte character sets.  Therefore, the
  length of the string returned by DateTime/TimeDate will now vary from 22
  to 26 characters long, and the length of the string returned by FileTimeGet
  will now vary from 15 to 19 characters long, instead of being a fixed length.

  In the ItemExtract function, you can now specify -1 for "index" to return
  the last item in the list.

  In the Environment() function, the maximum value length has been increased
  from 256 bytes to 1280 bytes.  It will return a blank string ("") for
  environment variables whose values are longer than 1280 bytes.

  FileSize no longer returns 0 if one of the specified files does not exist.

  FileDelete and DirRemove no longer return an error if one of the specified
  files or directories does not exist.

  In 32-bit version under international (non-US) versions of Windows NT, fixed
  problem with licensee names containing certain extended characters (eg, Kanji).

  In 32-bit version, the Run[..] commands now display a more informative
  error message on failure.

  In 32-bit version under Windows 95 and Windows NT 4.0, dialog boxes
  created with the Dialog command now use the default GUI font instead of
  the system font.

  In 32-bit version, fixed problem with functions that test for file
  existence when the full path and filename was longer than 128 characters.

  Fixed problem with BinaryIndex (and BinaryIndexNc) returning the offset
  past the end of the buffer (instead of 0) if the search string was blank
  and no non-NULL characters were found.

  Fixed problem with BinarySort causing random crashes if the key type was
  set to @WORD1 or @WORD2.

  Added a parameter to IntControl(50).  P2 can now specify the URL of the
  web page to be launched when the user clicks on the "Go to Tech Support
  Web Page" button.        If p2 is "" or 0, no change is made to URL that is
  currently set.  The default is:

    IntControl(50, 1, "http://techsupt.windowware.com/", 0, 0)

  Fixed a problem with OLE calls crashing if the called function returned a
  NULL pointer; they now return a blank string in this case.

  In 32-bit version, added a tiny delay to WinPlaceGet and WinPlaceSet,
  to give newly-repositioned windows a chance to "settle down" before
  retrieving their coordinates, making the returned values more reliable.

  Fixed problem with IsNumber and IsFloat returning TRUE for some high ASCII
  characters.


Windows 95 extender 11001  First showing up in WB 97A

  New function:

    w95FileClose(s:server-name, s:file-pathname)
      Close all network connections to a file.

        "server-name" is the name of a remote server on which the function
        will execute, or a blank string ("") to indicate the local computer.

        "file-pathname" is a fully-qualified file name (eg, "C:\DOC\MYFILE.TXT").
        NOTE: The file name MUST be fully-qualified.

        Returns @TRUE on success, or @FALSE if the specified file was not open.

      Example:
        w95FileClose("", "C:\DOC\MYFILE.TXT")

    w95ServiceAt(s:server, s:domain, i:server-type, s:service-name, i:flags)
      Lists all servers in a domain which contain a specified service.

        "server" is the UNC name of the server on which the function will
        execute (eg, "\\MYSERVER"), or "" for the local computer.

        "domain" is the name of the domain which will be used (eg, "SALES"),
        or "" for the primary domain.

        "server-type" identifies the type of servers which will be examined.
        You can specify -1 for all servers.  Or, you can specify one or more
        of the following flags, combined using the binary OR ("|") operator;
        servers meeting

                    1  All LAN Manager workstation
                    2  All LAN Manager server
                    4  Any server running with Microsoft SQL Server
                    8  Primary domain controller
                   16  Backup domain controller
                   32  Server running the timesource service
                   64  Apple File Protocol servers
                  128  Novell servers
                  256  LAN Manager 2.x Domain Member
                  512  Server sharing print queue
                 1024  Server running dialin service
                 2048  Xenix server
                 4096  Windows NT (either workstation or server)
                 8192  Server running Windows for Workgroups
                16384  Microsoft File and Print for Netware
                32768  Windows NT Non-DC server
                65536  Server that can run the browser service
               131072  Server running a browser service as backup
               262144  Server running the master browser service
               524288  Server running the domain master browser
              4194304  Windows 95 or newer
          -2147483648  Domain announcement

        "service-name" is the name of the service to be looked for.

        "flags" specifies information on the service being looked for.  It
        consists of one entry from each of the following three groups, added
        together:

          service type:

               1  services
               2  drivers
               3  both (services and drivers)

          service state:

             100  active services
             200  inactive services
             300  both (active and inactive)

          name type (indicates what the "service-name" parameter represents):

               0  display name (the name shown in Control Panel)
            1000  service name (the actual registry key name)

        Returns a tab-delimited list of server UNC names (eg, "\\MYSERVER").

        Note: An NT workstation can be considered to be a "server".

        Note: This function can take a while to run, depending on how many
        servers are in the domain.  Also, it will only return the names of
        servers which it is able to access, which requires that the user
        have browse access to their service control managers.

        Note: In order to use this function, you must have an NT domain
        server, and you must have RADMIN32.DLL and RLOCAL32.DLL present.
        These DLL's can be found in the Microsoft Windows 95 Service Pack 1.

    w95ShareInfo(s:server-name, s:share-name, i:request)
      Returns information about a shared resource.

        "request" specifies the information to be returned, and can be one
        of the following:

          0   (s) share name
          1   (s) resource
          2   (s) comment
          4   (s) full password
          5   (s) read password
          6   (i) share type
          7   (i) flags

        See w95ShareAdd and w95ShareSet for information on these
        parameters and values.

        Returns a string or integer, depending on "request".

    w95UserInfo(i:request)
      Returns information about the currently logged-on user.

        "request" specifies the information to be returned, and can be one
        of the following:

          Value  Name           Meaning
          -----  ----           -------
            0    user name      name of the user currently logged on to the workstation
            1    logon domain   domain name of the user account of the user currently logged on to the workstation
            2    other domains  space-delimited list of other LAN Manager domains browsed by the workstation
            3    logon server   name of the computer that authenticated the server

        Returns a string.

        Note: In order to use this function, you must have RADMIN32.DLL and
        RLOCAL32.DLL present.  These DLL's can be found in the Microsoft
        Windows 95 Service Pack 1.


Windows NT extender 11003  First showing up in WB 97A

  New functions:

    wntFileClose(s:server-name, s:file-pathname)
      Close all network connections to a file.

        "server-name" is the name of a remote server on which the function
        will execute, or a blank string ("") to indicate the local computer.

        "file-pathname" is a fully-qualified file name (eg, "C:\DOC\MYFILE.TXT").
        NOTE: The file name MUST be fully-qualified.

        Returns @TRUE on success, or @FALSE if the specified file was not open.

      Example:
        wntFileClose("", "C:\DOC\MYFILE.TXT")

    wntAccessList(s:server-name, s:resource/share-name, i:object-type, i:flags)
      Returns list of users who have access (permission) records for a resource.

        Returns a tab-delimited list of users and groups who have access
        records for "resource/share-name"; ie, users and groups for whom
        permissions have explicitly been set.  Returns a blank string ("")
        if there are no appropriate records.

        "flag" specifies the format of the returned names, and can be one
        of the following:

          0   account         (eg, "johndoe")
          1   domain\account  (eg, "OFFICE\johndoe")

          Note: For built-in accounts which are predefined by the system
          (eg, "Administrators"), only the account name is returned,
          regardless of the "flag" setting.

        See "wntAccessAdd" for additional parameter information.

      Example:
        users = wntAccessList("", "Public", 100, 0)

    wntShareInfo(s:server-name, s:resource/share-name, i:share-type, i:request)
      Returns information about a shared resource.

        "request" specifies the information to be returned, and can be one
        of the following:

          0   (s) share name
          1   (s) resource
          2   (s) comment
          3   (s) location
          6   (i) share type
          8   (i) max users
          9   (i) current users

        See wntShareAdd and wntShareSet for information on these
        parameters and values.

        Returns a string or integer, depending on "request".

    wntGroupInfo(s:server-name, s:group, s:group-type, i:request)
      Returns information about a group.

        "server" is the UNC name of the server on which the function will
        execute (eg, "\\MYSERVER"), or "" for the local computer.

        "group-type" can be @LOCALGROUP or @GLOBALGROUP.

        "request" specifies the information to be returned, and can be one
        of the following:

          0   group name
          1   group comment

        Returns a string.

    wntUserInfo(i:request)
      Returns information about the currently logged-on user.

        "request" specifies the information to be returned, and can be one
        of the following:

          Value  Name           Meaning
          -----  ----           -------
            0    user name      name of the user currently logged on to the workstation
            1    logon domain   domain name of the user account of the user currently logged on to the workstation
            2    other domains  space-delimited list of other LAN Manager domains browsed by the workstation
            3    logon server   name of the computer that authenticated the server

        Returns a string.

    wntSvcStart(s:server, s:service-name, i:flags, s:params, s:delimiter)
      Starts a service.

        "server" is the UNC name of the server on which the function will
        execute (eg, "\\MYSERVER"), or "" for the local computer.

        "service-name" is the name of a service.

        "flags" specifies the type of name that "service-name" represents:

             0  display name (the name shown in Control Panel)
          1000  service name (the actual registry key name)

        "params" specifies a delimited list of parameters to be passed to
        the service, or a blank string ("") for no parameters.  You can
        select any character you wish to be the delimiter, and must set the
        "delimiter" parameter accordingly.

          Note: driver services do not receive parameters.

        "delimiter" specifies a single character, indicating the delimiter
        used for "params".  For example, if "params" specifies a
        space-delimited list, then "delimiter" should be set to " ".  If
        "params" is a blank string, then "delimiters" is ignored and can be
        set to a blank string.

        Returns 1.

    wntSvcControl(s:server, s:service-name, i:flags, i:control-code)
      Stops or controls a service.

        "control-code" specifies the operation to be performed.  It can be
        one of the following standard control codes:

          Value  Name                         Meaning
          -----  ----                         -------
            1    SERVICE_CONTROL_STOP         Requests the service to stop.
            2    SERVICE_CONTROL_PAUSE        Requests the service to pause.
            3    SERVICE_CONTROL_CONTINUE     Requests the paused service to resume.
            4    SERVICE_CONTROL_INTERROGATE  Requests the service to update immediately its current
                                              status information to the service control manager.

        Or it can be a user-defined control code in the range of 128 to 255,
        inclusive.

        See "wntSvcStart" for additional parameter information.

        Returns 1.

    wntSvcStatus(s:server, s:service-name, i:flags, i:request)
      Returns status information for a service.

        "request" specifies the information to be returned, and can be one
        of the following:

          1   ServiceType
          2   CurrentState
          3   ControlsAccepted
          4   Win32ExitCode
          5   ServiceSpecificExitCode
          6   CheckPoint
          7   WaitHint

        Further information on these values follows:

          ServiceType:

            The value returned includes one of the following service type flags to indicate the type
            of service.  In addition, for a SERVICE_WIN32 service, the SERVICE_INTERACTIVE_PROCESS
            flag might be set, indicating that the service process can interact with the desktop.

            Value  Name                         Meaning
            -----  ----                         -------
               1   SERVICE_KERNEL_DRIVER        A service type flag that indicates a Windows NT
                                                device driver.
               2   SERVICE_FILE_SYSTEM_DRIVER   A service type flag that indicates a Windows NT file
                                                system driver.
              16   SERVICE_WIN32_OWN_PROCESS    A service type flag that indicates a Win32 service
                                                that runs in its own process.
              32   SERVICE_WIN32_SHARE_PROCESS  A service type flag that indicates a Win32 service
                                                that shares a process with other services.
             256   SERVICE_INTERACTIVE_PROCESS  A flag that indicates a Win32 service process that
                                                can interact with the desktop.

          CurrentState:

            Indicates the current state of the service.  One of the following values is specified:

            Value  Name                      Meaning
            -----  ----                      -------
              1    SERVICE_STOPPED           The service is not running.
              2    SERVICE_START_PENDING     The service is starting.
              3    SERVICE_STOP_PENDING      The service is stopping.
              4    SERVICE_RUNNING           The service is running.
              5    SERVICE_CONTINUE_PENDING  The service continue is pending.
              6    SERVICE_PAUSE_PENDING     The service pause is pending.
              7    SERVICE_PAUSED            The service is paused.

          ControlsAccepted:

            Specifies the control codes that the service will accept and process.  A user interface
            process can control a service by specifying a control command in the ControlService
            function.  By default, all services accept the SERVICE_CONTROL_INTERROGATE value.  Any
            or all of the following flags can be specified to enable the other control codes.

            Value  Name                           Meaning
            -----  ----                           -------

              1    SERVICE_ACCEPT_STOP            The service can be stopped.  This enables the
                                                  SERVICE_CONTROL_STOP value.
              2    SERVICE_ACCEPT_PAUSE_CONTINUE  The service can be paused and continued. This
                                                  enables the SERVICE_CONTROL_PAUSE and
                                                  SERVICE_CONTROL_CONTINUE values.
              4    SERVICE_ACCEPT_SHUTDOWN        The service is notified when system shutdown
                                                  occurs.  This enables the system to send a
                                                  SERVICE_CONTROL_SHUTDOWN value to the service.
                                                  The ControlService function cannot send this
                                                  control code.

          Win32ExitCode

            Specifies a Win32 error code that the service uses to report an error that occurs when
            it is starting or stopping.  To return an error code specific to the service, the
            service must set this value to ERROR_SERVICE_SPECIFIC_ERROR to indicate that the
            dwServiceSpecificExitCode member contains the error code.  The service should set this
            value to NO_ERROR when it is running and on normal termination.

          ServiceSpecificExitCode

            Specifies a service specific error code that the service returns when an error occurs
            while the service is starting or stopping.  This value is ignored unless the
            dwWin32ExitCode member is set to ERROR_SERVICE_SPECIFIC_ERROR.

          CheckPoint

            Specifies a value that the service increments periodically to report its progress during
            a lengthy start, stop, or continue operation.  For example, the service should increment
            this value as it completes each step of its initialization when it is starting up.  The
            user interface program that invoked the operation on the service uses this value to
            track the progress of the service during a lengthy operation.  This value is not valid
            and should be zero when the service does not have a start, stop, or continue operation
            pending.

          WaitHint

            Specifies an estimate of the amount of time, in milliseconds, that the service expects a
            pending start, stop, or continue operation to take before the service makes its next
            call to the SetServiceStatus function with either an incremented dwCheckPoint value or a
            change in dwCurrentState.  If the amount of time specified by dwWaitHint passes, and
            dwCheckPoint has not been incremented, or dwCurrentState has not changed, the service
            control manager or service control program can assume that an error has occurred.

        See "wntSvcStart" for additional parameter information.

        Returns an integer.

  Changed wntResources2 to ignore 'net-resource' and 'provider' unless
  'scope' is 2.  This avoids an "invalid parameter" error from Windows.


NetWare 3 extender 12019  First showing up in WB 97A

  n3CapturePrt was truncating the queue name at 47 characters; it now accepts
  queue names up to 65 characters long (the maximum length in Netware).


NetWare 4 extender 14017  First showing up in WB 97A

  New functions:

    n4LogoutTree(s:context, s:tree)
      Logs out of Directory Services.

        "context" is a Directory Services context, or "" for the default context.

        "tree" is a Directory Services tree, or "" for the default tree.

          Note: the "tree" parameter is supported in the 32-bit version only.

        This function terminates a client's connection to the network.  Unlike
        the n4Logout function, it does not detach from any servers.

        Returns @TRUE on success, or @FALSE if the user was not authenticated
        through Directory Services.

    n4UserGroupEx(s:server-name, s:user-name, s:context)
      Returns a list of groups to which the specified user belongs, in the specified context.

        "context" is a Directory Services context, or "" for the default context.

        This function is the same as n4UserGroups, but lets you specify a
        context for the operation.

        See "n4UserGroups" for additional parameter information.

    n4GetContext(i:request)
      Returns the current user's default context or tree.

        "request" specifies the information to be returned, and can be one
        of the following:

          Request   Meaning
          -------   -------
             0      Context
             1      Tree    (32-bit version only)

  Fixed problem with n4MemberGet returning values other than @TRUE or @FALSE.

  n4ObjectProps now returns a blank string ("") instead of an error if the
  specified "attribute" is not a valid attribute of "object".

  n4CapturePrt was truncating the queue name at 47 characters; it now accepts
  queue names up to 65 characters long (the maximum length in Netware).


WILX extender 11106  First showing up in WB 97A

  New function:

    xEjectMedia(s:drive) (32-bit version only)
      Ejects removable media from a device.

        "drive" is the drive letter of the device (eg, "G", or "G:")

      This can be used to eject media such as a CD-ROM, tape, or cartridge.

      Returns TRUE on success, FALSE on failure

    Fixed problem with xDriveReady always returning @TRUE in Windows NT.


WB 97B  Jun 23, 1997


DLL 2.4bbp  First showing up in WB 97B

  In the Run... commands in the 32-bit version, fixed a problem with not
  looking up the application path in the registry if the "program-name"
  parameter contained any path information.


WB 97C  Jun 26, 1997


DLL 2.4cbp  First showing up in WB 97C

  New function:

    ShortcutDir(s:name) (32-bit only)

      Returns the name of the directory where shortcuts of type "name" are
      stored.  This information is retrieved from the registry, under the key:

        HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

      Standard values for "name" include:

        Desktop
        Programs
        Fonts
        Recent
        SendTo
        Personal
        Startup
        Start Menu
        NetHood
        Favorites
        Templates

      Returns a directory name on success, or a blank string ("") if no
      corresponding value was found.

  New IntControl:

    IntControl(52, p1, 0, 0, 0) (32-bit only)
      Set dialog font.

        P1   Meaning
        --   -------
        -1   Don't change (just return current setting)
         0   Use standard system font.
         1   Use GUI font (default).

      This IntControl lets you specify whether the standard system font or
      GUI font is used by dialog boxes created with the Dialog command.  By
      default, the GUI font is used.

        Note: The GUI font is available only in Windows 95 and Windows NT 4.0.

      Returns previous setting.

  Fixed problem with OLE calls crashing if they returned a NULL sub-object.
  They now return 0.  Eg:

    App = ObjectOpen("Excel.Application")
    Sheet = App.ActiveSheet  ; ** returns 0, because there is no worksheet

  Fixed problem with dialog boxes created with the Dialog function, where
  if you typed a file mask into a editbox associated with a filelistbox,
  there would be garbage characters at the end of the file mask.

  Fixed problem with BinaryIndex and BinaryIndex searching for characters
  with ASCII values >= 128.

  IntControl(5) now works in the 32-bit version.  Before, it had no effect,
  and hidden and system files were always included.  The default is now to
  exclude hidden and system files, as documented.


Windows 95 extender 11002  First showing up in WB 97C

  New function:

    w95IsNTServer(s:server-name)
      Determines whether a computer is an NT server (or workstation).

        "server-name" is the UNC name of a computer (eg, "\\SERVER1"), or a
        blank string ("") to indicate the local machine.

          Note: An NT workstation is considered to be a "server".

        Returns @TRUE if the specified machine is an NT server (or
        workstation); @FALSE if it is not.

  Fixed problem with w95UserInfo crashing if RADMIN32.DLL was not available.

 
WB 97D  Aug 21, 1997

  In 32-bit version, fixed (hopefully) intermittent problem with FileMenu
  crashing, notably when the files in the Explorer directory window changed.

  In 16-bit version, fixed problem with the WinBatch box window stealing the
  input focus from an application window on top of WinBatch.

  Fixed probblem with the compiler not finding the OLE DLL if the DLL was
  located in the compiler directory but was not on the path.


DLL 2.4dbp  First showing up in WB 97D

  Fixed problem with the FileCopy and FileMove commands, if the overwrite
  warning option was specified and the file already existed.  In the
  "Confirm File Replace" dialog that was displayed, the "Use Newer All" and
  "Use Older All" buttons did not work properly.


Dialog Editor 97D  First showing up in WB 97D

  In 32-bit version under Windows 95 and Windows NT 4.0, can now select GUI
  or system font (via "Edit" menu items).  Defaults to GUI font, like the
  WIL Dialog() command does.


Windows NT extender 11004  First showing up in WB 97D

  Increased the maximum length of the server, resource, and username
  parameters in the wntAccess[..] and wntOwner[..] functions.


NetWare 3 extender 12020  First showing up in WB 97D

  In the n3MsgSend and n3MsgSendAll functions, increased the maximum length
  of the message string from 57 characters to 254 characters, when using
  NetWare client version 3.11 or later.


NetWare 4 extender 14018  First showing up in WB 97D

  In the n3MsgSend and n3MsgSendAll functions, increased the maximum length
  of the message string from 57 characters to 254 characters.

Article ID:   W12711
Filename:   WB Fixes and Improvements Through 97D.txt