Falcon Side

WinBatch® Archived Versions

WinBatch® versions 2004B or newer

WinBatch version 2004A

WB 2004A  Jan 9, 2004
DLL 4.4add  First showing up in WB 2004A

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

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

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

Changes to the Dialog function and related functions:

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

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

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

WinBatch version 2003K

WB 2003K  Nov 19, 2003
DLL 4.3kdc  First showing up in WB 2003K
In IntControl(1007), if "p1" == 3 (suspend script), then "p2" now
specifies a timeout value in milliseconds after which the script will
automatically continue.  If "p2" == 0, there is no timeout.

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

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

New functions:

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

"handle" specifies a binary buffer handle.

"request" specifies the type of information to return, and can be
one of the following values:

Request   Returns
-------   -------
-1      @TRUE if "handle" is a binary buffer, @FALSE otherwise.
0      buffer size
1      buffer memory address (same as IntControl(42))
2      binary EOD (same as BinaryEodGet)

Returns an integer value.

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

"filename" specifies a full file name, which may include a path.

"add-dot" specifies whether a dot should be appended to the returned
string for file names which do not have an extension.  @TRUE means
append a dot, @FALSE means don't.  If omitted, the default is @FALSE.

This function returns the [root + extension] part of a filename.

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

"key-codes" is a tab-delimited list of keys to wait for.  See
WaitForKey for a list of keycodes.  If "key-codes" is a blank string
(""), the key codes from the most recent use of this function will
be used again, which will save the overhead of re-parsing the string.

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

This function is like WaitForKey, but lets you specify up to 100 keys
to wait for, and allows for a timeout.

If one of the specified keys is pressed before the timeout occurs, the
function will return a value corresponding to the position in "key-codes"
of the key that was pressed, where the first key in the list is 1.

If none of the specified keys are pressed before the timeout occurs,
the function will return 0.

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

This specifies what should happen if the Execute command causes an error.

P1  Meaning
--  -------
-1  Don't change (just return current setting)
0  Display a dialog with an option to continue or cancel (default)
1  Display a notification dialog and then continue automatically
2  Continue automatically without displaying any dialog

Returns previous setting.

Fixed problem with the "flags" parameter in ArrayFilePutCsv.

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

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

Added new request to ArrInfo:

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

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

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

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

Added an optional parameter to Debug:

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

If "init-string" is specified, it is the string placed in the edit
field of the Debug dialog when the dialog is initialized.

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

WaitForKey now yields a bit more processor time.

Added an optional parameter to WinWaitClose:

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

"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).  The default is -1.

If the window doesn't exist, the function will return immediately in
any case, and return @FALSE.

If the window exists, the function will wait for it to close or until
the timeout period has elapsed, whichever comes first, and return @TRUE.

FileGet now supports Unicode files.

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

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

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

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

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

Changes to the Dialog function and related functions:

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

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

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

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

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

WinInfo 2.1b  First showing up in WB 2003K
Fixed language string localization problem.

WILX extender 39001  First showing up in WB 2003K
Fixed problem with xBaseConvert and xHex converting values equal to -2.

WinBatch version 2003J

WB 2003J  Jun 30, 2003
Fixed IntControl(1009).
DLL 4.2jdb  First showing up in WB 2003J
ParseData no longer has a limit of 256 characters for each parameter.

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

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

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

ArrayFileGetCsv
ArrayFilePutCsv
ItemCountCsv
ItemExtractCsv

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

ArrayFilePutCsv now doubles any existing quote marks.

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

Added an optional parameter to ArrayFilePutCsv:

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

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

Value   Meaning
-----   -------
2     don't put quotes around the values being written, or double existing quotes

Changes to the Dialog function and related functions:

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

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


Dialog Editor 2003J  First showing up in WB 2003J

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

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

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

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

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

WinInfo 2.1a  First showing up in WB 2003J
Changed the way top-level windows are identified.

WinBatch version 2003H

WB 2003H  May 8, 2003
Added compiler setting to enable large EXE's to extract files on removable
drives.
DLL 4.0hda  First showing up in WB 2003H
Fixed a problem with flag 4 in AskDirectory.

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

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

Changes to the Dialog function and related functions:

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

Dialog Editor 2003H  First showing up in WB 2003H

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

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

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

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

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

WinBatch version 2003G


WB 2003G  Apr 23, 2003

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

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


DLL 4.0gda  First showing up in WB 2003G

New functions:

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

"null-char" specifies the character which NULL bytes in the file
will be replaced with in the array.  If omitted or a blank string
(""), then NULL bytes will be removed.

"extra-alloc" specifies the number of additional elements to add
to the end of the array.  If omitted, it will be 0.

This function creates a one-dimension array and stores each line of
the specified file as string elements in the array.  Line 1 of the
file is stored as array[0], and so on.  The array may have up to
65,535 elements (lines in file + "extra-alloc").

By default, the maximum supported file line length is 4096.  This can
be increased using IntControl(65).

Returns an array.

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

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

Value   Meaning
-----   -------
1     treat leading and trailing whitespace as significant

"delimiter" specifies the character used to separate values on each
line of the file.  It can be any single character except a space,
tab, null, or quotation mark (double quote).  If omitted, a comma
will be used as the delimiter.

"extra-rows" specifies the number of additional elements to add to
the end of dimension 1 of the array.  If omitted, it will be 0.

"extra-cols" specifies the number of additional elements to add to
the end of dimension 2 of the array.  If omitted, it will be 0.

This function creates a two-dimension array and stores each line of
the specified CSV file as rows and columns in the array.  The first
item on line 1 of the file is stored as array[0, 0], the second item
on line 1 of the file is stored as array[0, 1], the first item on line
2 of the file is stored as array[1, 0], and so on.

By default, the maximum supported file line length is 4096.  This can
be increased using IntControl(65).

The file may not contain any NULL characters.

Returns an array.

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

If "write-undef" is @TRUE, then uninitialized elements in the array
will be written as blank lines in the file.  If "write-undef" is
@FALSE, then uninitialized elements will not be written.

This function writes a one-dimension array to a file, one element per
line.  If "filename" exists, it will be overwritten.

By default, each line in the file will be terminated with a CR/LF.
This can be changed using IntControl(53).

Returns the number of bytes written to the file.

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

"delimiter" specifies the character used to separate values on each
line of the file.  It can be any single character except a space,
tab, null, or quotation mark (double quote).  If omitted, a comma
will be used as the delimiter.

If "write-undef" is @TRUE, then uninitialized rows in the array (ie,
rows with no initialized items) will be written as blank lines in
the file.  If "write-undef" is @FALSE, then uninitialized rows will
not be written.

By default, each line in the file will be terminated with a CR/LF.
This can be changed using IntControl(53).

Returns the number of bytes written to the file.

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

"null-char" may specify a 1-byte character which NULL bytes in the
file will be replaced with in the string.  If omitted or a blank
string (""), then NULL bytes will be removed.

Returns a string containing the file contents.

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

If "filename" exists, it will be overwritten.

Returns the number of bytes written to the file.

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

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

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

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

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

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

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

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

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

Added new "flags" values to AskDirectory:

Flag   Meaning
----   -------
4    Use the new user interface.  Setting this flag provides the user
with a larger dialog box that can be resized.  The dialog box has
several new capabilities including: drag and drop capability
within the dialog box, reordering, shortcut menus, new folders,
delete, and other shortcut menu commands.

NOTE: This is supported only in Windows ME, Windows 2000, and
Windows XP.  In other versions of Windows, this flag is ignored.

8    Do not include the "New Folder" button in the browse dialog box.

NOTE: This is supported only in Windows XP.  In other versions
of Windows, this flag is ignored.

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

Changes to the Dialog function and related functions:

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

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

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

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

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


Dialog Editor 2003G  First showing up in WB 2003G

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

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

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


Windows NT extender 39002  First showing up in WB 2003G

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

WinBatch version 2003F

WB 2003F  Mar 4, 2003
DLL 4.0fda  First showing up in WB 2003F
New Functions:

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

"count" specifies the number of bytes to read from the buffer.

The return value is a hex string, containing 2 hex characters for each
byte read from the buffer.

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

"hex-string" is a hex string, containing 2 hex characters for each
byte that will be written to the buffer.

Returns the number of bytes written to the buffer.

Fixed problem assigning an array to itself.

WinBatch version 2003E

WB 2003E  Feb 24, 2003
Fixed problem with compiler not properly initializing the project
configuration (.CMP) file.
DLL 4.0eda  First showing up in WB 2003E
Fixed bug in DialogControlState function that caused a control to
sometimes not become invisible when the control style was set to 1
(invisible) with request code 3 (add style).  The problem usually appeared
when controls overlapped.

WinBatch version 2003D

WB 2003D  Feb 21, 2003
Redesigned compiler interface.
DLL 4.0dda  First showing up in WB 2003D
New functions:

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

"item" specifies the item to be searched for.  It may be either a
hex string indicating the bytes to search for (two hex characters
per byte), or the handle of a binary buffer containing the bytes
to search for.

If "item" is a blank string or an empty binary buffer, "offset" will
be returned.

This function is like BinaryIndexEx, but can search for strings
containing NULL bytes.

See BinaryIndexEx for additional information.

Returns the offset where the item was found, or -1 if not found.

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

"partial-parent-winname" specifies the parent of the window to place.

"partial-child-winname" specifies the child window to be placed.

This function is like WinPlace, but places a child window.  The
coordinates are specified as virtual coordinates within the client
area of the parent window, where the parent window is 1000 x 1000.

See WinPlace for additional information (but you can't use @ABOVEICONS).

Returns 1 on success.

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

"partial-parent-winname" specifies the parent of the window.

"partial-child-winname" specifies the child window.

This function is like WinPosition, but returns coordinates for a child
window.  The coordinates are specified as virtual coordinates within the
client area of the parent window, where the parent window is 1000 x 1000.

See WinPosition for additional information.

Returns (s) window coordinates, delimited by commas.

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

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

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

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

If AddExtender fails, the extender will now be unloaded.

Changes to the Dialog function and related functions:

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

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

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

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

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

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

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

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

Dialog Editor 2003D  First showing up in WB 2003D

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

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

Windows NT extender 39001  First showing up in WB 2003D

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

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

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

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

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

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

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

WinBatch version 2003C

WB 2003C  Jan 10, 2003
DLL 4.0cda  First showing up in WB 2003C
IntControl's 39 and 40 were not properly handling p1 == 0.

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

Dialog Editor 2003C  First showing up in WB 2003C

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

WinBatch version 2003B

WB 2003B  Jan 8, 2003
Test Version

WinBatch version 2003A

WB 2003A  Dec 23, 2002
DLL 4.0ada  First showing up in WB 2003A

New IntControl:

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

If "p1" is a blank string (""), this returns a tab-delimited list of
desktops, or a blank string ("") if the function fails.

If "p1" specifies a desktop name, this returns a tab-delimited list of
"Window ID's" of all top-level windows on that desktop, or a blank
string ("") if the function fails.

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

Added an optional parameter to ItemCountCsv and ItemExtractCsv:

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

"delimiter" specifies a character used to separate values, instead of
a comma.  It can be any single character except a space, tab, null, or
quotation mark (double quote).

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

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

Changes to the Dialog function and related functions:

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

Changed error message associated with memory allocation errors.

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

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

Dialog Editor 2003A  First showing up in WB 2003A

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

WinBatch version 2002K

WB 2002K  Dec 6, 2002
DLL 3.9kci  First showing up in WB 2002K
Fixed problem with TimeWait not working correctly.

WinBatch version 2002J

WB 2002J  Dec 2, 2002

New IntControl:

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

If the current script is running as a service, this function returns
the name of the service.  Otherwise it returns a blank string ("").

"P1" specifies which name to return:

P1   Meaning
--   -------
0   Returns the service name (the actual registry key name)
1   Returns the display name (the name shown in Control Panel)

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


DLL 3.9jci  First showing up in WB 2002J

New functions:

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

This function is like ItemCount, but instead of a list it counts
items in a CSV line.  See ItemExtractCsv for more information.

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

"index" specifies the ordinal position of the item to be returned.

"line" specifies a CSV line (see below).

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

Value   Meaning
-----   -------
1     treat leading and trailing whitespace as significant

This function is like ItemExtract, but instead of a list it extracts
items from a CSV line.  A CSV ("comma separated values") line
consists of comma-delimited items.  Items may optionally be enclosed
in quotation marks (aka, "double quotes").  There are two cases
where an item *must* be enclosed in quotation marks:

(1) If the item contains a comma
(2) If the item contains a quotation mark

Here are some examples:

1,2,3,4,5
"January","February","March"
"Doe, John",20

In order to embed a quotation mark in an item, you must replace it
with two quotation marks (ie, add an extra quotation mark).  For
example, you would specify the item "My Fair Lady" (with quotes) as:

"""My Fair Lady"""

Each quotation mark is doubled, and the entire item is enclosed in
a set of quotation marks.

Normally, whitespace outside of quoted strings is ignored.  The
following two lines would be considered identical:

A,B,C
A, B, C

But if you specify a "flags" value of 1, then the whitespace will
be considered part of the items.  Whitespace *inside* a quoted
string is always preserved, regardless of the "flags" value:

"   This line has spaces around it   "

Similarly, whitespace outside of a quoted string is always ignored.
Ie, the following two lines are considered identical, regardless of
the "flags" value

"String 1","String 2","String 3"
"String 1", "String 2", "String 3"

The function returns the selected item, with any enclosing quotes
removed, and any doubled quotation marks converted to normal quotation
marks.  Leading and trailing whitespace may be stripped out, as
described above.

New IntControl:

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

This specifies how to handle OLE methods and properties that return an
array of bytes (VT_I1 or VT_UI1).

P1  Meaning
--  -------
0  Return as WIL array (default)
1  Store in binary buffer
2  Return as string

Returns previous setting.

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

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

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

Added an optional parameter to AppExist and AppWaitClose:

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

If "current-session-only" is @TRUE, and the script is running in a
Terminal Services environment, then the specified application will
only match if it is running in the same session as the script.

If "current-session-only" is @FALSE or omitted, then the specified
application will match regardless of what session it is running in.

Added a new parameter to IntControl 56:

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

p3 = "current-session-only" flag (applies only if p2 == 1).

See AppExist for more information.

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

Arrayize
AskItemList
ItemCount
ItemExtract
ItemInsert
ItemLocate
ItemRemove
ItemReplace
ItemSort

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

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

Fixed problem with TimeDelay at Daylight Savings Time changeover.

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

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

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

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

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

Changes to the Dialog function and related functions:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Dialog Editor 2002J  First showing up in WB 2002J

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

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

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

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

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

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

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

WinBatch version 2002H

WB 2002H  Aug 22, 2002

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


DLL 3.8hch  First showing up in WB 2002H

New functions:

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

"variant-type" can be one of the following:

Variant-type   Value to specify
------------   ----------------
"I1"         A 1-byte character value
"I2"         A 2-byte integer value
"I4"         A 4-byte integer value
"UI1"        An unsigned 1-byte character
"UI2"        An unsigned 2-byte integer value
"UI4"        An unsigned 4-byte integer value
"BOOL"       A Boolean (True/False) value

"CY"         A currency value, specified as a string in the form "#CURRENCY:value"
"DATE"       A date/time value, specified as a string in Ymd or YmdHms format
"DECIMAL"    A decimal value, specified as a string in the form "#DECIMAL:value"
"NULL"       A blank string ("")

Note that "variant-type" may optionally be preceded by the prefix
"VT_", so for example you could specify either "BOOL" or "VT_BOOL".

When an OLE method or property returns a value that is one of these
supported variant types, WinBatch now retains the variant type for the
returned variable, without having to use the ObjectType function.
However, if you subsequently assign a new value to that variable using
a regular WIL assignment operator, the variant type information will
be lost.  For example:

visible = ExcelApp.Visible
ExcelApp.Visible = visible

The variable "visible" is returned as a VT_BOOL, and is still a
VT_BOOL when it is passed back to the OLE object.  But here:

visible = ExcelApp.Visible
visible = 0
ExcelApp.Visible = visible

The assignment "visible = 0" causes "visible" to become an ordinary
WIL integer, without a variant type.  In that case, if you wanted it
to be a VT_BOOL you would need to use ObjectType:

visible = ObjectType("BOOL", 0)
ExcelApp.Visible = visible

Or simply:

ExcelApp.Visible = ObjectType("BOOL", 0)

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

This function returns the "variant-type" string for the specified
variable name, or "" if it does not have a variant type.  See
ObjectType for a list of possible "variant-type" strings.

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

"handle" specifies a binary buffer handle.

"request" specifies the type of digest or CRC to generate, and can
be one of the following values:

Request   Meaning      Return string format (x = hex character)
-------   -------      ----------------------------------------
0      MD5 digest   "xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx"
1      16-bit CRC   "xxxx"
2      32-bit CRC   "xxxxxxxx"

Returns a hex-value string.

New IntControl:

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

This is identical to IntControl 82.

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

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

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

If MyObject

Fixed problem with BinaryStrCnt and high-ASCII characters.

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

NULL:""

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

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

Added new request to IntControl 77:

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

Changes to the Dialog function and related functions:

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

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

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

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

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

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

Improved rendering of bitmaps on palette based display devices


Dialog Editor 2002H  First showing up in WB 2002H

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

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

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

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

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

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

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

Windows NT extender 38001  First showing up in WB 2002H

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

NetWare 4 extender 38000  First showing up in WB 2002H

Fixed problem with n4MemberDel and n4MemberSet with Novell eDirectory.

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

WinBatch version 2002G

WB 2002G  Jul 15, 2002
DLL 3.7gcg  First showing up in WB 2002G

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

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

Changes to the Dialog function and related functions:

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

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

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

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

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

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

WinBatch version 2002F

WB 2002F  Jul 10, 2002
DLL 3.7fcg  First showing up in WB 2002F
Added new request to IntControl(77):

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

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

WinBatch version 2002E

WB 2002E  Jul 5, 2002

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


DLL 3.6ecg  First showing up in WB 2002E

New functions:

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

This function is like WinParmGet and WinParmSet, but has support for
many more parameter types.  See WIL help file for documentation.

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

"object-handle" specifies the handle of an OLE object that
represents a collection of variants, and which supports
enumeration via the IEnumVARIANT interface.

This function returns an enumeration handle, which can be used by the
ObjectCollectionNext function to return items in the collection, one
at a time.  When you have finished enumeration, use the
ObjectCollectionClose function to release the enumeration handle.

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

"enumeration-handle" specifies an enumeration handle returned by
ObjectCollectionOpen.

Each time this function is called, it returns an OLE object handle
representing the next item in the collection.  When enumeration is
complete, it returns 0 (ie, a NULL object handle).

Example:
objFSO = ObjectOpen("Scripting.FilesystemObject")
objDrives = objFSO.Drives
hEnum = ObjectCollectionOpen(objDrives)
While 1
objDrive = ObjectCollectionNext(hEnum)
If objDrive == 0 Then Break
Message("", objDrive.Path)
ObjectClose(objDrive)
EndWhile
ObjectCollectionClose(hEnum)
ObjectClose(objDrives)
ObjectClose(objFSO)

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

"enumeration-handle" specifies an enumeration handle returned by
ObjectCollectionOpen.

Returns 0.

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

"default-color" specifies an RGB color value in the form "#RRGGBB",
where "RR" is the red component in hex (00-FF), "GG" is the green
component in hex (00-FF), and "BB" is the blue component in hex
(00-FF).  This will be the color initially selected in the dialog.
You may specify "" for a default of gray.

"reg-key" specifies the name of a user-defined registry key under
"HKEY_CURRENT_USER\Software\Wilson WindowWare" where persistent
state information will be stored.  It will be created if it does not
already exist.  If "" is specified, persistent state information
will not be stored.

"format" specifies the format in which the selected color will be
returned:

Format   Meaning
------   -------
0     RGB color value in the form "#RRGGBB" (see above).

1     RGB color value in the form "R|G|B", where "R", "G", and
"B" are the respective red, green, and blue components,
in decimal.

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

"type" specifies the type of fonts to be listed, and can be one of
the following values:

Value   Meaning
-----   -------
0     Screen fonts
1     Printer fonts
2     Both screen and printer fonts

If "type" is 1 or 2, a default printer must be installed,
otherwise an error will occur.

"flags" restricts the fonts that are listed, and can be 0 or more of
the following values combined with the bitwise OR ('|') operator:

Value   Meaning
-----   -------
1     List only script fonts (exclude OEM and Symbol character sets)
2     List only non-vector fonts
4     List only fixed-pitch fonts
8     List only fonts available on both the printer and the display
16     List only scalable fonts
32     List only TrueType fonts
64     List only horizontally oriented fonts

If flag 8 is specified, "type" will automatically be set to 2.

"reg-key" specifies the name of a user-defined registry key under
"HKEY_CURRENT_USER\Software\Wilson WindowWare" where persistent
state information will be stored.  It will be created if it does not
already exist.  If "" is specified, persistent state information
will not be stored.

"format" specifies the format in which information about the
selected font will be returned:

Format   Meaning
------   -------
0     Tab-delimited string in the format:

LogFont [@TAB] PointSize [@TAB] Color [@TAB] FontType

"LogFont" is a vertical-bar delimited string containing font
attributes.  See the "SysParamInfo" function for a description of
the LOGFONT format string.

"PointSize" is the font size in 1/10 of a point.

"Color" is the font color, as an RGB color value in the form
"#RRGGBB".  See the "AskColor" function for a description.

"FontType" is a bitmask specifying the font type, consisting of
one or more of the following values which can be extracted with
the bitwise AND ('&') operator:

Value   Meaning
-----   -------
256   The font weight is bold
512   The italic font attribute is set
1024   The font weight is normal
8192   The font is a screen font
16384   The font is a printer font
32768   The font is simulated by the graphics device interface (GDI)



New IntControl:

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

This IntControl sets the seed value used in subsequent calls to Random().

"P1" specifies a non-negative seed value.  If "p1" == 1, it will
re-initialize the random number generator.  Otherwise, it will set
the generator to a random starting point.

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

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

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

Added a new request # to SnapShot:

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

On versions of Windows that do not support virtual screens, this will
be treated the same as request 0.

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

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

In Windows 2000 and XP, the default method for IntControl(61) is now 5,
and the default method for IntControl(62) is now 4.

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

Fixed an obscure problem with OLE calls erroneously failing.

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

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

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

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

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

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

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

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

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

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

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

Fixed problem with trailing comments on an #EndFunction line.

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

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

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

Fixed problem with WinActivate in Windows 2000 and XP.

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

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

Can now assign an OLE object handle to a property.

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

You may now re-assign an array variable.

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

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

New data types for BinaryOleType:

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

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

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

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

AskYesNo
IntControl(1)
Message
Pause
Terminate

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


Windows NT extender 37000  First showing up in WB 2002E

New function:

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

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

Note: to list accounts in a domain, specify a domain controller
for that domain as "server-name".

"request" specifies the types of accounts to return in a delimited
list.  You can specify 0 to include all account types, or specify
one or more of the following flags, combined using the bitwise OR
('|') operator:

Request #   Meaning
---------   -------
1       Return user accounts.  The results are similar to
using wntUserList() with an account type of "2".

2       Return machine accounts.  The results are similar to
using wntUserList() with an account type of  "48"
[16 | 32].  Please note that inter-domain trust
accounts cannot be returned with wntAcctList(),
although they can be returned with wntUserList().

3       Return group accounts.  The results are similar to
using wntListGroups() with a @GLOBALGROUP group type.
Please note that local groups cannot be returned with
wntAcctList(), although they can be returned with
wntListGroups().

"output-format-flag" [optional parameter] controls the format of the
account names that are returned.

Flag   Meaning
----   -------
0   (default) Return actual account name.

1   Account names will have domain names prefixed on to them,
except in cases where the domain name is "BUILTIN" or
"NT AUTHORITY".

2   Account names will have domain names prefixed on to them in all cases.

4   SID values will be returned in place of account names.

32   Display a progress dialog when obtaining a large list of
accounts.  This allows the script to show its continuing
progress even though the extender function has not yet
returned control to the script.

64   Force a 1 second delay between updates to the progress dialog box.

256   Allows extended information to be returned along with an
account name.  The additional information will appear as
pipe "|" delimited fields in a record, with each record in
the list delimited by a TAB character.

In the case of a user account, the record format would be:

"user|comment|full_name|flags|RID"

In the case of a machine account, the record format would be:

"machine|comment|flags|RID"

In the case of a [global] group account, the record format would be:

"group|comment|RID"

The flags are the account flags.  Refer to wntUserGetDat() for
information regarding the various flag bits and their meanings.

The RID is the Relative Identifier for the account, and it
uniquely identifies the account within the domain in which the
account is located.  The RID appears as the very last component in
the account's SID vaue.

Returns a tab-delimited list of account names.

This function performs tasks similar to wntUserList() and
wntListGroups(), but it uses a different Win32 API function to perform
these tasks and the type of accounts and the format of the data
returned by this function differs in some subtle ways as compared to
the return values of wntUserList() and wntListGroups().  The reason
that this function exists is that the Win32 API function used by this
extender function to list accounts on NT/2K/XP systems is highly
optimized to enumerate [user, machine, group] accounts very quickly
even when there are 10's of thousands of accounts in a domain.

Fixed problem with wntSvcCfgGet crashing.

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

wntAccessAdd
wntAccessDel
wntAccessGet
wntAccessList
wntAuditAdd
wntAuditDel
wntAuditGet
wntAuditList

Object type 600 is for service display names and object type 601 is for
service key names.  It is now possible to manipulate the security
settings on NT services.

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

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

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

Fixed problem with wntSvcList running in an infinite loop.

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

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

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

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

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

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

WinBatch version 2002B

WB 2002B  Jan 22, 2002

New function:

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

(s) "filename" specifies the name of a BMP file.

(i) stretch-mode specifies the mode to use when resizing the bitmap,
and can be one of the following:

Value  Name          Meaning
-----  ----          -------
1    BLACKONWHITE  Performs a Boolean AND operation using the color values for the
eliminated and existing pixels.  If the bitmap is a monochrome bitmap,
this mode preserves black pixels at the expense of white pixels.

2    WHITEONBLACK  Performs a Boolean OR operation using the color values for the
eliminated and existing pixels.  If the bitmap is a monochrome bitmap,
this mode preserves white pixels at the expense of black pixels.

3    COLORONCOLOR  Deletes the pixels.  This mode deletes all eliminated lines of pixels
without trying to preserve their information.

4    HALFTONE      Maps pixels from the source rectangle into blocks of pixels in the
destination rectangle.  The average color over the destination block
of pixels approximates the color of the source pixels.  Supported on
Windows NT/2000/XP only.

The stretching mode defines how the system combines rows or
columns of a bitmap with existing pixels.  The BLACKONWHITE and
WHITEONBLACK modes are typically used to preserve foreground
pixels in monochrome bitmaps.  The COLORONCOLOR mode is typically
used to preserve color in color bitmaps.  The HALFTONE mode is
slower and requires more processing of the source image than the
other three modes, but produces higher quality images.


DLL 3.5bcd  First showing up in WB 2002B

New IntControl:

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

Returns 1.

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

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

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

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

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

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

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

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

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

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

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

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

This controls the format in which the size is returned if it is too large
to be returned as an integer.  The default format, 0, is floating point.
If you specify "format" of 1, the size will be returned as a huge number.

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


Windows NT extender 35001  First showing up in WB 2002B

New functions:

wntPrivUsers(server-name, privilege[, output-format-flag])

This function accepts a privilege name as input and returns a list of
account names [or SID strings] that have been granted that privilege.

wntSvcList(server-name, service/group-name, flags)

This function allows services to be listed.  On Win2K [and newer]
systems, it is possible to selectively list services based on the
groups to which they belong, based on the service type, and based on
the service status.  On WinNT [and newer] systems it is possible to
list services based on service types and service status.  On WinNT
[and newer] systems it is possible to list all services [by type and
status] that are dependent on a specified service.

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

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

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

wntAccessAdd
wntAccessDel
wntAccessGet
wntAccessList
wntAuditAdd
wntAuditDel
wntAuditGet
wntAuditList

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

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

WinBatch version 2001P

WB 2001P  Nov 30, 2001
DLL 3.4pcd  First showing up in WB 2001P
IsDefined and VarType now return -1 (instead of an error) if the specified
name is a function name or other reserved word.

New data types for BinaryOleType:

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

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

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

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

BinaryClipGet
BinaryClipPut
ClipAppend
ClipGet
ClipGetEx
ClipHasFormat
ClipPut
SnapShot

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

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

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

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

AskFileText
AskItemList
AskTextBox
ItemSelect
TextBox
TextBoxSort
TextSelect

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

Added two optional parameters to ShortcutDir:

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

"source" specifies the location from which the information will be
retrieved:

source  location
------  --------
0    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders (default)
1    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

"add-slash": if @TRUE, a backslash will be appended to the returned
string if it doesn't already have a trailing backslash.  The default
is @FALSE.

Added a new request # to DirWindows:

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

On other versions of Windows, this will return the same value as request 0.

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

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


Windows NT extender 34005  First showing up in WB 2001P

New function:

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

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

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

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

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

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

Added a new optional flags parameter to wntAcctInfo.

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

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

Changed the flags that are valid for wntOwnerGet.

Added a new optional flags parameter to wntOwnerSet.

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

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

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

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

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

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

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

Fixed problem with DLL not loading on NT 3.51.

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

WinBatch version 2001N

WB 2001N  Aug 31, 2001
Fixed a resource (handle) leak in SvcWaitForCmd.
DLL 3.3ncc  First showing up in WB 2001N

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

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

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

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

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

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

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

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

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

This controls the format in which the size is returned if it is too large
to be returned as an integer.  The default format, 0, is floating point.
If you specify "format" of 1, the size will be returned as a huge number.

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

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

WinBatch version 2001M

WB 2001M  Aug 8, 2001
BoxesUp was returning positive values on success, other than @TRUE.
DLL 3.3mcc  First showing up in WB 2001M
New function:
DllLastError()
Returns the most recent error returned by a DllCall to a Win32 API.

Decimals() was not returning the previous setting.

IntControl 56 could not be used to kill a service.

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

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

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

Fixed problem with Arrayize with large lists.

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

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

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

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


Windows NT extender 33005  First showing up in WB 2001M
New function:
wntSecurityGet(server-name, resource, object-type, request, flags)

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

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

wntAccessAdd2 and wntAuditAdd2 have been removed.

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

WinBatch version 2001K

WB 2001K  Jun 1, 2001
Changed SvcWaitForCmd to use less CPU time.

WinBatch version 2001J

WB 2001J  May 25, 2001

New functions, only when running as a service:

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

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

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


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

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


DLL 3.3jcc  First showing up in WB 2001J

New IntControl:

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


Fixed a problem with Arrayize crashing with large lists.

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

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

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

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

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

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

ShortcutDir now supports registry strings of type REG_EXPAND_SZ.

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


Windows NT extender 33003  First showing up in WB 2001J

New functions:

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


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

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

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

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

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


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

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

WinBatch version 2001H

WB 2001H  Apr 2, 2001

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


Windows NT extender 33002  First showing up in WB 2001H

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

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

WinBatch version 2001G

WB 2001G  Mar 27, 2001

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

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

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

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


DLL 3.3gcc  First showing up in WB 2001G

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

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

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

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

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

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

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


Windows NT extender 33001  First showing up in WB 2001G

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


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

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

WinBatch version 2001F

WB 2001F  Mar 15, 2001
DLL 3.3fcc  First showing up in WB 2001F

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

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

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

WinBatch version 2001E

WB 2001E  Mar 8, 2001
DLL 3.2ecb  First showing up in WB 2001E

IniItemizePvt now supports itemizing the sections of Unicode INI files.

Windows NT extender 32003  First showing up in WB 2001E

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

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

WinBatch version 2001D

WB 2001D  Mar 6, 2001

Windows NT extender 32002  First showing up in WB 2001D

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

WinBatch version 2001C

WB 2001C  Mar 5, 2001
DLL 3.2ccb  First showing up in WB 2001C

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

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

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

Windows NT extender 32001  First showing up in WB 2001C

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

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

WinBatch version 2001B

WB 2001B  Feb 27, 2001

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

Added additional option for IntControl(1007):

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

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

Fixed some problems with overlapping boxes

Fixed some problems with button focus in boxes.


DLL 3.2bcb  First showing up in WB 2001B

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

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

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

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

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

AskFileText
AskItemList
ItemSelect
RegQueryItem
TextBox
TextBoxSort
TextSelect

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

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

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

New -- user-defined functions!

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

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

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

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

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

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

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

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

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

Example:

; Define three UDF's

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

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

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

; Now use them

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

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

Done()

New -- arrays!

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

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

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

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

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

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

On the other hand, the following are all legal:

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

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

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

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

newstring = StrUpper(oldstring)

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

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

New functions:

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

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

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

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


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


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


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

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

FileCreateTemp(s:prefix)
Creates a temporary file.

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

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

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

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


New IntControls:

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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

Examples:

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

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

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

ClipPut no longer has a 64K limit.

Drop and DropWild can accept array names as parameters.

IsDefined can accept an array name as a parameter.

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

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

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

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

Fixed problem with WallPaper function using tile and stretch options.

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

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

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

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

Added new "select mode" to AskItemList and AskFileText:

@extended

to allow selection of multiple items by extending the selection with the
mouse or shift key.

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

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

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

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

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

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

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

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

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

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

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

Added new request # to IntControl(71):

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

Added new request # to MouseInfo:

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

Added new flag to AskFileName:

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

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

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

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

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

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

FileTimeCode
FileTimeGet
FileTimeGetEx
FileYmdHms

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

FileTimeGet
FileTimeGetEx
FileYmdHms

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

FileCompare
FileCopy
FileMove
InstallFile

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

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

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

Old   New   Error
---   ---   -----
3210  1393  Cmd Extender: Out of memory to save result
3393  1394  AddExtender: Too many extenders added
3394  1395  AddExtender: Extender DLL not found
3395  1396  AddExtender: Not a valid extender
3396  1399  AddExtender: Extender table full
3437  1437  AddExtender: Extender DLL load failed

Added an optional parameter to AddExtender:

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

"required-version" is the minimum acceptable version.  If the version
of the extender being loaded is less than "required-version", the
AddExtender command will fail.  The default value is 0 (ie, no
required version).

IntControl(73) now works with errors from extenders.

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

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

Fixed problem using ObjectOpen after AskFileName.

Optimized StrFill.

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

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


Windows NT extender 32000  First showing up in WB 2001B

New functions:

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

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

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

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

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

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

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

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

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

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

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

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

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

wntAccessList now returns a sorted list with no duplicate items.

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

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

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

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

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

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

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

Added an additional flag to wntRunAsUser:

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

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

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


Windows 95 extender 32000  First showing up in WB 2001B

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

w95FileClose
w95FileUsers
w95ShareList
w95ShareUsers

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

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


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

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


WILX extender 32000  First showing up in WB 2001B

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

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

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

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

WinBatch version 2001A

WB 2001A  Nov 20, 2000  BETA RELEASE

WinBatch version 2000C


WB 2000C  May 3, 2000

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

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


DLL 3.0cbv  First showing up in WB 2000C

New IntControl:

IntControl(74, p1, 0, 0, 0) (32-bit only)
Set idle wait after Run commands.


Added new "function" to WinHelp (32-bit only):

"HTML"   Launches HH.EXE to view a topic in an HTML help (.CHM) file.
"Keyword" specifies the topic to display, or "" to view the
starting topic in the file.

Example:
WinHelp("iexplore.chm", "HTML", "web_collect_favorites.htm")

Which is identical to:
Run("HH.EXE", "iexplore.chm::/web_collect_favorites.htm")

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

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

Added new request to IntControl(54):

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

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

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

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

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


Windows NT extender 11017  First showing up in WB 2000C

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

NetWare 4 extender 14027  First showing up in WB 2000C

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

WinBatch version 2000B

WB 2000B  Mar 20, 2000

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

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


DLL 3.0bbv  First showing up in WB 2000B
New IntControls:

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


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

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

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

Windows NT extender 11016  First showing up in WB 2000B
New functions:

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


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


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

WinBatch version 2000A

WB 2000A  Feb 24, 2000

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

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

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


DLL 3.0abv  First showing up in WB 2000A

New functions:

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

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

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

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

New IntControl:

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


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

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

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

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

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

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

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

WaitForKey now supports punctuation keys.

Improved speed of BinaryReplace.

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

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

Windows NT extender 11015  First showing up in WB 2000A

New functions:

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

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


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


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

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

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

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

Fixed a problem with wntFilesOpen possibly crashing.

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

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

Windows 95 extender 11007  First showing up in WB 2000A
New functions:

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

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

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


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

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

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

WinBatch version 99P

WB 99P  Nov 9, 1999
DLL 2.9pbu  First showing up in WB 99P

Fixed problem with a period ('.'), not preceded or followed by a number,
being treated as a floating point 0.

WinBatch version 99N

WB 99N  Nov 2, 1999
DLL 2.9mbu  First showing up in WB 99N
Fixed problem with AskFileName under NT 3.51.  Note that under NT 3.51, if
you specify a multiple-selection style dialog, any file or directory names
containing spaces will be displayed in the dialog as short names, but all
file names in the list returned by AskFileName will have long-form names.

Changed the syntax for IntControl(71) to:

IntControl(71, p1, p2, 0, 0)

P1   Meaning
--   -------
1   Dump WIL and extender function tables to the debug log file.
2   Set flag to dump internal debug data for every keyword lookup
(p2 = @ON or @OFF, to turn the flag on or off).

WinBatch version 99M

WB 99M  Oct 26, 1999

If you use BoxButtonWait and press Enter without first selecting a button,
it now sets the pressed button to be whichever button was highlighted,
instead of setting it to button #1 as before.

Fixed problem with "Terminate" menu command not working while waiting for
a button to be pressed with BoxButtonWait.

If PopMenu is unable to load one of its configured menu files (eg, because
of a syntax error), it will now display its popup menu anyway.

The compiler no longer automatically writes out a project configuration
(.CMP) file for the most-recent project on startup.

You can now specify a directory name as the first parameter to the
compiler, in which case it will let you select from a list of project
configuration (.CMP) files in that directory to be compiled in batch mode.
Note that these .CMP files must contain a "Src=" setting in the [Main]
section to identify the source file to be compiled, and this setting was
not written by earlier versions of the compiler, but can be added manually.
The source file must be located in the same directory as the .CMP file.

Fixed problem launching a 0-byte compiled script.

DLL 2.9mbu  First showing up in WB 99M

New function:

BinaryReplace(i:bin-handle, s:search-string, s:replacement-string, i:match-case)
Replaces strings in a binary buffer.

\
FileExist now returns @FALSE if the file name contains any '/' characters.

In 32-bit version, in BinaryWriteEx, you can now specify -1 for "count",
in which case the file size will be truncated at "file-offset" (ie,
"file-offset" will become the new file size, and any data beyond that
point in the file will be lost), and nothing will be written to the file.

Improved support for "#include" pre-processor directives in scripts
processed by programs other than WinBatch (such as PopMenu).

The "#include" pre-processor directive is no longer case-sensitive.

BinaryRead and BinaryWrite (and BinaryReadEx and BinaryWriteEx) now return
an error if they are unable to read or write the file.

MouseInfo(8) now checks the state of the buttons at the time the function
was called, as well as the asynchronous state.

Changed the algorithm used by the Random() function.

DllHwnd and DllHinst now retry the operation if the specified window isn't
found, like the other window functions do.

Fixed problem with KeyToggleGet returning an incorrect result if used in
the same script following a KeyToggleSet.

FileRead now strips out any NULL's from the file being read.

IntControl(52) now also affects the font used by the Display function.

Fixed problem with the text in a Display() window sometimes getting truncated.

Floating point numbers less than 1 are no longer required to have a leading 0.

Gosub and Goto lines containing unsubstituted %% signs no longer cause beeps.

WinBatch version 99K

WB 99K  Sept 30, 1999

New function:

MousePlay(s:X-Y-coordinates, s:parent-window, s:child-window, i:buttons, f:delay)
Performs full range of mouse associated activities.

MousePlay allows you to perform the full range of mouse associated activities
with a single function.

New IntControl:

IntControl(1008, p1, 0, 0, 0)
Enables/disables Close command.


Fixed a problem with BoxButtonWait, where you could use the arrow keys to
move the focus past the last button, where the focus would get lost.  A
side effect is that the arrow keys can no longer be used to move between
buttons; use the Tab key instead.

Added support for OLE functions which return a NULL type (VT_NULL).  They
get returned as a blank string ("").

Dialogs displayed by AskFileName are now centered on the screen.

Fixed problem with ClipGet truncating text greater than 64K.


DLL 2.9kbu  First showing up in WB 99K

New IntControl:

IntControl(71, 0, 0, 0, 0)
Dump WIL and extender function tables to the debug log file.

Added new request # to MouseInfo:

Req#  Return value
----  ------------
8   returns asynchronous status of mouse buttons, as a bitmask.  This
is like request #4, except #8 returns the asynchronous (current)
state of the buttons, whereas #4 returns the state at the time
the function was called.

Added new flag to AskFileName:

2 = Open Style, allowing multiple files to be selected.  The selected
files will be returned as a delimited list.  The combined file names
selected cannot exceed 2048 characters, otherwise an error will occur.

In the Dialog function, fixed problems related to having multiple checkboxes
with the same variable name.  The values were not being initialized or
returned properly.

If debug tracing is on (via "DebugTrace"), and a 3052 error occurs
("uninitialized variable or undefined function"), the WIL and extender
function tables are automatically dumped to the debug log file.

In 32-bit version, fixed a problem trying to convert out-of-bounds
floating point numbers to strings.

In 32-bit version, fixed a problem with WinWaitExist waiting 25% longer
than the specified "timeout" value.

Fixed an OLE problem accessing properties with parameters.


Windows NT extender 11014  First showing up in WB 99K

Added new request to wntGroupInfo:

Req  Returns
---  -------
-1  @TRUE if group exists, @FALSE if it doesn't.

Added new request to wntShareInfo:

Req  Returns
---  -------
-1  @TRUE if share exists, @FALSE if it doesn't.

Fixed a problem with wntSvcStatus() returning various positive values,
instead of @TRUE.

Fixed a problem using the wntAudit[..] functions with registry keys.

NetWare 4 extender 14026  First showing up in WB 99K

New function:

n4SetContextG(s:context, s:tree)
Changes the current user's global default context and/or tree.

The documentation for n4SetContext was a bit confusing.  That function
affects only the current script, and the changes to the context and/or
tree remain in effect only for the duration of the current script.

WinBatch version 99J

WB 99J  Aug 18, 1999
DLL 2.8jbt  First showing up in WB 99J
ItemCount no longer ignores leading or trailing delimiters.

WinBatch version 99I

Shortlived release.  Immediately moved onto 99J.

WinBatch version 99H

WB 99H  Aug 17, 1999

Added new "style" to BoxDrawCircle and BoxDrawRect:

3  =  transparent circle/rectangle with border.

Fixed a problem with FileMenu sometimes adding duplicate copies of the
menu items to the Explorer "File" menu.

Compiler now supports Unicode WBT files.


DLL 2.8hbt  First showing up in WB 99H

In 32-bit version, fixed WinParmGet(19).

In FileVerInfo, if you specify blank strings for both "language-key" and
"resource-string", it will now return a tab-delimited list of language
keys for which version information is available in the specified file.

There was a documentation error with IntControl's 66, 67, and 68.  The
"force" flag is "P2", not "P1".  And with IntControl 68, the "power off"
flag is "P3", not "P2".  "P1" is not currently used in any of these three
IntControl's, and should be set to 0.

IntControl(32) now allows both reading from and writing to a memory
location.  The syntax has been expanded.


Fixed a problem (introduced in WinBatch 99A) with OLE function calls
erroneously returning an error 1257 "Type mismatch".

In 32-bit version, fixed a problem with OLE functions adding an extra
NULL to the end of passed string parameters.

In 32-bit version, fixed a problem with KeyToggleSet sometimes not changing
the CapsLock or ScrollLock indicator lights until the next keystroke.

Fixed a problem with lines beginning with the word "to" causing a crash.

IsKeyDown and MouseInfo(4) now properly handle swapped mouse buttons.

Changed MouseInfo(4) to only look at the state of the buttons at the time
the function was called, not at the asynchronous state.

ItemCount now ignores a leading delimiter.

WaitForKey now supports the following special keycodes:

Keycode     Meaning
-------     -------
{INS}       Insert
{NUMPAD0}   0 on numeric keypad
{NUMPAD1}   1 on numeric keypad
{NUMPAD2}   2 on numeric keypad
{NUMPAD3}   3 on numeric keypad
{NUMPAD4}   4 on numeric keypad
{NUMPAD5}   5 on numeric keypad
{NUMPAD6}   6 on numeric keypad
{NUMPAD7}   7 on numeric keypad
{NUMPAD8}   8 on numeric keypad
{NUMPAD9}   9 on numeric keypad
{NUMPAD*}   * on numeric keypad
{NUMPAD+}   + on numeric keypad
{NUMPAD-}   - on numeric keypad
{NUMPAD.}   . on numeric keypad
{NUMPAD/}   / on numeric keypad

Note that NumLock must be on for the codes {NUMPAD0} through {NUMPAD9}
to be generated.  Also, it cannot distinguish between the two "Enter"
keys on the keyboard (both will generate an {Enter} code).

Fixed a problem with BinaryIndex searching for high-ASCII characters.

Fixed a problem with FileVerInfo sometimes returning extraneous characters
at the end of the version string, and possibly causing a "Tag Overwrite" error.

Fixed problem running Unicode batch files and menus.


Windows NT extender 11013  First showing up in WB 99H

New functions:

wntAcctPolGet(s:server-name, i:request)
Gets account policy information for a server.

wntPrivAdd(s:server-name, s:user/group name, s:privilege)
Grants a privilege to a user or group.


wntPrivDel(s:server-name, s:user/group name, s:privilege)
Removes a privilege from a user or group.

wntPrivGet(s:server-name, s:user/group name, s:privilege)
Determines whether a user or group holds a privilege.

wntPrivList(s:server-name, s:user/group name)
Returns a list of priviliges granted to a user or group.


Added new "elements" to wntUserGetDat:

"password_age" (i):
"priv" (s):
"auth_flags" (i):
"parms" (i):
"units_per_week" (i):
"usri3_bad_pw_count" (i):
"num_logons" (i):
"logon_server" (s):


Added new request # to wntSvcStatus:

0 = Return @TRUE if the service exists, or @FALSE if it doesn't (other
request #'s will return an error if the service doesn't exist).

Changed wntAccessGet and wntAccessSet to open registry keys with only the
necessary access permissions, instead of all requiring all access.


Windows 9x extender 10003  First showing up in WB 99H

New function:

w9xFileUsers(s:server-name, s:file-pathname)
Lists network users who have a file open.

NetWare 4 extender 14025  First showing up in WB 99H

New functions:

n4ObjDelete(s:context, s:object)
Deletes an NDS object.

n4ObjRename(s:context, s:object, s:new-name, i:retain)
Renames an NDS object.

n4ObjMove(s:context, s:object, s:new-name, i:retain)
Moves an NDS object.

n4ObjSearch(s:context, s:object, s:class, s:parent, i:flags)
Searches a region of the directory for an NDS object.


n4ObjGetVal now supports stream values.

Fixed a problem with n4GetContext returning a non-blank string if the user
had logged into and then logged out of Directory Services befor the
function was called.  It now returns a blank string in that situation.

Fixed a problem with n4UserGroups causing subsequent functions using the
context to fail.

WinBatch version 99G

WB 99G  May 7, 1999


DLL 2.8gbt  First showing up in WB 99G

In 32-bit version, under Windows 95/98, fixed a problem using BinaryConvert
to convert a non-Unicode buffer to a Unicode buffer, while setting the flag
to specify that it also be converted to uppercase or lowercase.  The
Unicode conversion was being performed properly, but the case conversion
was not.  Note that under Windows 95/98, it is still not possible to
perform a case conversion of a Unicode buffer (ie, where "source-type" and
"target-type" are both Unicode).  This is not a problem under Windows NT.

Improved DebugTrace, and fixed a problem with the last line in the script
not being output to the log file.

Fixed a problem with FileRead returning extra characters at the end of the
last line in the file, if the last line did not end with a line feed.

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


Windows NT extender 11012  First showing up in WB 99G

New functions:

wntWtsUserGet(s:server-name, s:user-name, i:request)
Gets user information from an NT Terminal Server.

wntWtsUserSet(s:server-name, s:user-name, i:request, s/i:value)
Modifies user information on an NT Terminal Server.


In wntMemberGet, if "group-type" is @LOCALGROUP, then "user" can now be
specified as either "user" or as "domain\user".


Windows 95 extender 11005  First showing up in WB 99G

w95GetUser will now attempt to repeatedly retry the operation for up to 30
seconds, or until a non-blank string can be returned, whichever comes first.
This is to avoid the problem where a blank string is returned when used in
a login script, and the user hasn't yet been fully logged in.


Windows 9x extender 10002  First showing up in WB 99G

New functions:

w9xGroupAdd(s:server-name, s:group-name, i:group-type, s:comment)
w9xGroupDel(s:server-name, s:group-name, i:group-type)
w9xGroupInfo(s:server-name, s:group, i:group-type, i:request)
w9xUserAdd(s:server-name)
w9xUserAddDat(s:element, s/i:value)
w9xUserDel(server-name, user-name)
w9xUserExist(s:server-name, s:user-name)
w9xUserGetDat(s:server-name, s:user-name, s:element)
w9xUserList(s:server-name, i:account-type)
w9xUserRename(s:server-name, s:old-username, s:new-username)
w9xUserSetDat(s:server-name, s:user-name, s:element, s/i:value)

Parameters and usage for all these functions are the same as in the
corresponding wnt[..] functions in the Windows NT extender, with the
restriction that "server-name" must specify an NT server (it can't be a
blank string), and "group-type" (where applicable) must be @GLOBALGROUP.

NetWare 4 extender 14024  First showing up in WB 99G
New functions:
n4FileUsers(s:server, s:filename)
Lists network users who have a file open.

WinBatch version 99F

WB 99F  Apr 15, 1999


DLL 2.8fbt  First showing up in WB 99F

New IntControl:

IntControl(70, p1, 0, 0, 0) (32-bit only)
Set delay after WinWait[..] functions.


In 32-bit version, changed floating point to string conversions again.
If you have used the Decimals() function specifying a "places" value of 0
or higher, then results will no longer be returned in scientific format
for numbers whose absolute values are < 0.0001.  Also, if you have
specified Decimals(0), then results will now be returned in scientific
format for numbers whose absolute values are > 2147483647.

DirRename was failing if the old and new names had drive letters that were
the same letter but one was upper case and the other was lower case.

In 32-bit version, there is a problem with IntControl(68) causing the
computer to reboot if it does not support the power-off feature.  We've
added a new parameter to work around this:

P2  Meaning
--  -------
0  Power-off if supported by the computer (*see note below*)
1  Don't attempt to power-off
2  Attempt to power-off in any case

Note: We don't currently have a reliable method of determining if a
computer supports the power-off feature, so 0 will attempt to do a
power-off in any case.

In 32-bit version, changed the delay after a successful WinWaitExist,
WinWaitChild, and WinWaitClose, from 1 second to 1/2 second.  This can be
changed or disabled with the new IntControl(70), above.


Windows NT extender 11011  First showing up in WB 99F

Fixed a rare problem with the extender crashing when making the first call
to any of the extender functions.

In wntSvcCfgSet, for request #7, if you specify "ServiceStartName" with no
password, the password will be set to a blank string (ie, same as
"ServiceStartName|").  To specify a non-blank password, use the form
"ServiceStartName|Password".

WinBatch version 99E

WB 99E  Apr 12, 1999

Fixed a problem with "#include" directives not working in executables
compiled with WinBatch 99D.


DLL 2.8ebt  First showing up in WB 99E

In 32-bit version, changed floating point to string conversions, so that
results will now be returned in scientific format for numbers whose
absolute values are < 0.0001.

In 32-bit version, in the Decimals() function you can now specify these
values for "places":

Value   Meaning
-----   -------
-2    Use alternate method of converting to strings, with no trailing zeroes
-3    Always use scientific format

WinBatch version 99D

WB 99D  Feb 11, 1999

The compiler now automatically compresses the WinBatch script and any
"Other files" when creating an EXE, and uncompresses them when the EXE is
run.  This will cause the compile to take a bit longer, and may add a
slight delay at runtime (depending on the CPU speed and the size of the
files involved), but it will almost always result in smaller compiled EXE's.


DLL 2.8dbt  First showing up in WB 99D

New IntControl:

IntControl(65, p1, 0, 0, 0)
Sets maximum line length for FileRead.


Fixed problem using the Call() function to call WBC files created with
older versions of the compiler (pre-99A).  Very small files worked, but
files over a certain size caused a verification failure error message.

FileDelete now returns a "File cannot be deleted" error instead of "File
not found" if the specified file exists but cannot be deleted.

Optimized FileRead by using buffered reads (for files only, not for
pipes).  The default buffer size is 4096 bytes, and this is also the
maximum length of a line which can be read.  This size can be changed
using the new IntControl(65).  Lines which are too long to be read will
return an error (instead of being truncated, as in previous versions).

If you do a BinaryTagFind followed by another BinaryTagFind, the second
BinaryTagFind will now search for the next tag.  Previously, you had to do
a BinaryTagRepl before being able to search for the next tag.

Fixed a problem with the wildcard string functions (StrIndexWild,
StrLenWild, and StrSubWild) where the text would not match a pattern with
trailing asterisks, eg: StrIndexWild("abc", "abc*", 1).

DllCall no longer crashes if called with an insufficient number of
parameters.

Fixed a problem with OLE, where, if an OLE call returned a NULL OLE object
which you assigned to a variable, and then tried to assign a new value to
that variable, it would cause a "Bad OLE channel" error.

In 32-bit version, added a 1-second delay after a successful WinWaitExist,
WinWaitChild, and WinWaitClose.


Windows NT extender 11010  First showing up in WB 99D

Fixed problem where a wntUserExist which returned @FALSE could prevent
subsequent NT extender function calls from working properly.


NetWare 4 extender 14023  First showing up in WB 99D

Fixed problem with object names being returned with relative names instead
of canonical names in some cases.

WinBatch version 99C

WB 99C  Jan 20, 1999

Fixed problem with large compiled EXE's giving a "DLL not found" error at
runtime if they contained (exactly) 4 extender DLL's.

Fixed problem with compiler causing an error when embedding "Other files"
that were 0 bytes in size.

DLL 2.7cbs  First showing up in WB 99C

Fixed problem with BinaryTag[..] functions not being able to handle
binary buffers larger than 64K.

Windows NT extender 11009  First showing up in WB 99C
Fixed problem with DLL not loading on NT 3.51.

Note: wntRunAsUser requires NT version 4.0 or higher.

Fixed problem with DLL not loading if RASSAPI.DLL was not found.

Note: wntRasUserGet and wntRasUserSet require RASSAPI.DLL.

NetWare 3 extender 12023  First showing up in WB 99C
New function:
n3GetConnNum(s:server)
Gets the connection number for the current workstation.

NetWare 4 extender 14022  First showing up in WB 99C
New function:
n4GetConnNum(s:server)
Gets the connection number for the current workstation.

WinBatch version 99B

WB 99B  Jan 13, 1999
DLL 2.7bbs  First showing up in WB 99B
Call() function now handles WBC (encoded) and WBE (encrypted) files created
with versions of the compiler prior to 99A.

WinBatch version 99A

WB 99A  Jan 5, 1999
Added additional option for IntControl(1007):

p1   Meaning
--   -------
3   Suspend script until user clicks on the tray icon

This can be used at any point after a WinBatch script has already been
placed in the tray (with p1 == 1).  When the user clicks on the tray
icon, it will return one of the click values as listed for p1 == 0.

Fixed problem with PopMenu where, if you clicked on the tray icon but didn't
select a menu item, the next few times you clicked on the tray icon the menu
would come up and then immediately disappear.

The compiler will now unconditionally extract embedded files (in the "Other
files" category), whether or not they already exist.  They will be extracted
to the directory where the large EXE is located, or to the Windows directory
if the EXE is being run from a floppy disk or CD-ROM.  As before, extender
DLL's will not be extracted if they already exist in the EXE directory or on
the path.

WinBatch can now run scripts larger than 64K.

Compiler can now compile scripts larger than 64K.

DLL 2.7abs  First showing up in WB 99A

New function:

MouseCoords(s:win-name, s:child-win)
Returns coordinates of the mouse within a window.


Fixed a problem with several file functions, which occured if the current
directory was a UNC of the form "\\SERVER\SHARE\DIR[\...]" (not just
"\\SERVER\SHARE"), and the specified file name or wildcard did not contain
path information.  This could cause a "File not found" type of error.

When a WIL script is manually terminated by the user (eg, by pressing
Ctrl-Break), it now displays the line that was being processed.

Added additional option to IntControl(62):

P1   Method to use
--   -------------
-2   Don't activate WIL dialog windows at all.

Added new request # to MouseInfo:

Req#  Return value
----  ------------
7   returns mouse coordinates relative to the bounding rectangle of the
window under the cursor, in virtual (1000x1000) screen units.

Fixed problem with some of the Binary[..] functions crashing (instead of
returning an error) if an offset < 0 was specified.

In 32-bit version, changed the way the following string sorting and
comparison functions operate:

BinarySort
ItemSort
ItemSortNc
StrCmp
StriCmp
>, >=, <, and <= (operators)

Previously, they were sorting (or comparing) strings on a
character-by-character basis.  They now perform a "word sort", which sorts
strings based on their collation sequence.  Hyphens and apostrophes are
ignored, and all other non-alphanumeric characters are sorted before any
alphanumeric character.

Changed ItemSortNc so that, if the strings being sorted are the same on a
case-insensitive basis, they will then be sorted on a case-sensitive basis.

In 32-bit version, changed memory allocation for strings to be dynamic.
This means that you should no longer receive an error 3096 ("Out of memory
for strings"), unless Windows itself is completely out of memory (unlikely).

In the Dialog function, ampersands ("&") are now once again being converted
to underscores in static text and varying text fields.

In 32-bit version, increased limit for FileItemize and DirItemize lists from
32K to 1MB.

Fixed a problem with menu parsing if you had a third-level menu followed
by a top-level menu.

OLE functions now support in-process servers.

Fixed a problem with MouseClick not sending the correct types of clicks.

Fixed an intermittent OLE crash problem.

OLE now supports properties with parameters.

Windows NT extender 11008  First showing up in WB 99A
New functions:
wntUserExist(s:server-name, s:user-name)
Determines whether a user exists.

wntCurrUsers(s:server-name, s:flags)
Lists users currently logged into a server.

wntFileUsers(s:server-name, s:file-pathname)
Lists network users who have a file open.

wntAcctInfo(s:server-name, s:account-name, i:request)
Returns information about a user account.

wntGroupAdd(s:server-name, s:group-name, i:group-type, s:comment)
Creates a user group.

wntGetDrive(s:net-resource)
Lists local drives mapped to a UNC.

wntSvcCfgGet(s:server, s:service-name, i:flags, i:request)
Gets a configuration parameter for a service.


wntSvcCfgSet(s:server, s:service-name, i:flags, i:request, s/i:value)
Changes a configuration parameter for a service.

wntEventWrite(s:server-name, s:source-name, i:type/category, i:event-id, s:description)
Writes an entry to an NT event log.

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

wntAuditDel(server-name, resource/share-name, user/group name, object-type)
Removes audit records from a resource.

wntAuditGet(server-name, resource/share-name, user/group name, object-type)
Returns audit records for a resource.

wntAuditList(s:server-name, s:resource/share-name, i:object-type, i:flag)
Returns list of users who have audit records for a resource.

The following changes have been made to wntRunAsUser:

After you use wntRunAsUser, any programs you launch via the Run[..] or
ShellExecute commands will be run in the context of the impersonated user.
In order for this to work, the currently logged-in user (not the user
being impersonated) needs to have the following privileges set:

Increase quotas
Replace a process level token

You can specify a user name of "" to end the impersonation.

The "flag" parameter can contain one or more of the following values,
combined using the bitwise OR ("|") operator:

Flag   Meaning
----   -------
1    Allow new child processes to interact with the desktop

Fixed wntChgPassword when specifying an old-password of "*UNKNOWN*".

Functions which return a tab-delimited list no longer include a tab at
the end of the list.

Added new request to wntGroupInfo:

Req  Returns
---  -------
2   i:group's RID (relative identifier)

This request is valid only with global groups.

Added new "element" to wntUserGetDat:

"user_id" (i):  user's RID (relative identifier)

Note: This element cannot be set using wntUserAddDat or wntUserSetDat.

Added new "element" to wntUserGetDat and wntUserSetDat:

"primary_group_id" (i):  RID (relative ID) of the user's primary global group

You can determine a group's RID using wntGroupInfo with request = 3.

Note: This element cannot be set using wntUserAddDat.

Windows 95 extender 11004  First showing up in WB 99A
New functions:
w95FileUsers(s:server-name, s:file-pathname)
Lists network computers who have a file open.

w95GetDrive(s:net-resource)
Lists local drives mapped to a UNC.

w95FileClose now closes all connections to a file, instead of just the
first one.  It also now returns the number of connections which existed
(and were closed) for the specified file.

Functions which return a tab-delimited list no longer include a tab at
the end of the list.

Windows 9x extender 11001  First showing up in WB 99A
New function:
w9xOwnerGet(s:server-name, i:reg-key, s:resource-name, i:object-type, i:flag)
Returns the owner of an object.

NetWare 4 extender 14021  First showing up in WB 99A
New functions:
n4GetUserName(s:context)
Returns the name of the currently logged-in user.

n4ObjGetVal(s:context, s:object, s:attribute)
Returns values for an object attribute.

n4ObjOptions(s:value-delim, s:field-delim, s:null-sub, i:flags, s:reserved)
Specifies options for n4ObjGetVal.

n4ObjectProps now handles all value types, except file streams.
Distinguished names are now returned in abbreviated, typeless form.
Binary strings are returned with any NULL's replaced by spaces.  For
complex structure types (ie, not a single string or integer), the most
useful information from the structure is returned, in the best form
possible.  To get all the data from such value types, use n4ObjGetVal.

Fixed a problem with n4NameConvert returning a typed name with format == 4.

WILX extender 11108  First showing up in WB 99A

Fixed xMessageBox so the message box will come the foreground in Windows
98 and NT 5.0.

WinBatch version 98E

WB 98E  Nov 9, 1998

Fixed a problem with PopMenu not setting the focus to the previously-active
window before executing a menu item.

WinBatch version 98D

WB 98D  Sep 29, 1998
PopMenu now puts double-quotes around the menu file name when launching the
editor.

PopMenu now attempts to return the focus to the previously-active window after
executing a menu item.

DLL 2.6dbr  First showing up in WB 98D

New functions:

DebugTrace(i:mode, s:log-file)
Outputs debug information to a file.

WinItemProcID(i:process-id, i:flags, i:return-type)
Returns a list of windows for the specified process.

You can now obtain the process ID of an application that is launched with
the RunShell function by specifying @GETPROCID as the "waitflag".  This is
the same as specifying @NOWAIT, except that on success the function will
return the process ID of the application that was launched.   This process
ID can be used with the WinItemProcID function (see above).  The process
ID may be a negative number.  If you use RunShell to launch a shortcut to
a special (non-executable) shortcut (eg, a dial-up networking item), a
process ID cannot be obtained.  Instead, a 1 will be returned to indicate
success.  In all cases, a return value of 0 indicates failure.

Fixed problem with TimeDiff returning a negative number for the month
field, in certain cases.

The date string returned by the FileTimeGet function now includes a 4-digit
year, if this was configured via Control Panel.

In 32-bit version, fixed problem assigning string properties to OLE objects
(they weren't being properly converted to Unicode, so looked like gibberish).

Fixed problem with NetInfo(1) missing some installed clients under Windows
95, in unusual cases.

Fixed problem with BinaryIndexEx returning 0 instead of -1, if the string
being searched for would extend beyond the limits of the binary buffer.

Windows NT extender 11007  First showing up in WB 98D
New function:
wntMemberLst2(server-name, group, group-type)
Lists all members of a user group, with domains.


Modified the format of the "acct_expires" element in wntUserAddDat,
wntUserGetDat, and wntUserSetDat.  Previously, this was set and returned
as an integer representing the number of seconds since 1/1/70.  It has
now been changed to a string in "YYYY:MM:DD:hh:mm:ss" format.

WILX extender 11107  First showing up in WB 98D
Under Windows NT, xEjectMedia no longer returns an error or displays a
"Drive not ready" message if the drive is empty.

WinBatch version 98C

WB 98C  Sep 18, 1998
New IntControl:

IntControl(1007, p1, p2, p3, p4) (32-bit only) (Requires Windows 95+ or NT 4.0+)
Add/remove/check tray icon.


Fixed problem with compiler displaying an "Uninitialized variable" error if
certain options were chosen, and there was no "LastSource=" setting in the
compiler section of WWW-PROD.INI (which would have been the case if this
was the first time the compiler was run).

The #include directive will now also look for the specified file (if it
does not contain path information) in the same directory as the script
file being run or compiled

Fixed problem with the compiler always using ".EXE" as the extension when
reloading previous configurations, even when the output was a .WBC file.

DLL 2.5cbq  First showing up in WB 98C
New Functions:

FileCopyAttr(source-list, destination, warning, s:attributes)
Copies files, and sets file attributes.

FileMoveAttr(source-list, destination, warning, s:attributes)
Moves files, and sets file attributes.

TimeDiff(s:time-value-1, s:time-value-2)
Returns the difference between two points in time.

New IntControls:

IntControl(63, p1, p2, p3, p4)
Sets coordinates for AskFileText and AskItemList windows.

IntControl(64, 0, 0, 0, 0) (32-bit only)
Gets the exit code returned by the last program run.


The windows displayed by AskFileText and AskItemList can now be resized
by the user.

In 32-bit version, the "Tile" parameter of the Wallpaper() function has a
new option:

2  =  Stretch

This is available in Windows 98, and in Windows 95 with "Plus" installed.

Fixed a problem in dialog boxes, where pressing a hotkey corresponding to
the "OK" button (ie, the pushbutton with a value of 1) would select the
highlighted pushbutton instead, if the highlighted pushbutton was the
first control in the dialog and the focus had not previously been switched
away from it.

In 32-bit version, fixed problems with floating point to string conversions.

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

The existing documentation is not clear on the purpose or usage of the
TimeSubtract function.  TimeSubtract is designed to subtract a
time-difference from a time-value:

TimeSubtract(s:time-value, s:time-difference)

"time-value" is a valid date-time string, in YmdHms format.

"time-difference" is an amount of time to be subtracted from
"time-value", in YmdHms format.

The result is a time string in YmdHms format.

Examples:

; Subtract 1 day from 9/1/98 (at midnight)
TimeSubtract("1998:09:01:00:00:00", "00:00:01:00:00:00")

; Subtract 48 hours from the current time
TimeSubtract(TimeYmdHms(), "00:00:00:48:00:00")

TimeSubtract is NOT designed to determine the difference between two
points in time.  For that, use TimeDiffDays, TimeDiffSecs, or the new
TimeDiff function (above).

Adjusted the way TimeAdd and TimeSubtract deal with cases where you are
adding or subtracting a certain number of months, and the result would
be an invalid date.  For example:

TimeAdd("1998:08:31:00:00:00", "00:01:00:00:00:00")

Here, you are asking to add one month to August 31, but there are only
30 days in September and therefore there is no September 31.  In previous
versions, the result would have been October 1 (ie, there are 31 days in
August, so add 31 days).  In this new version, it will no longer wrap the
month add/subtract operation past the end of a month, so the result will
now be September 30.  Similarly, in this example:

TimeSubtract("1998:10:31:00:00:00", "00:01:01:00:00:00")

which subtracts one month and one day from October 31, the result will
now be September 29, not September 30.  That is to say, it first
subtracts the month(s), adjusts the result to the last day of the month
if necessary, and then subtracts the day(s) (and hours, minutes, seconds).

In 32-bit version, added an additional option to IntControl(28):

2  =  GUI font (Windows 95+ and NT 4.0+ only)

Note that this option applies to AskLine (and AskPassword), as well
as to AskFileText and AskItemList.

BinaryClipGet now stops reading clipboard data at the first NULL
character for text format types (1, 7, and 13).

BinaryClipPut now adds a NULL terminator to the data being written to
the clipboard for text format types (1, 7, and 13).

Windows NT extender 11006  First showing up in WB 98C
New functions:
wntRasUserGet(s:server-name, s:user-name, i:request)
Gets RAS information for a user.

wntRasUserSet(s:server-name, s:user-name, i:privilege, s:phone-number)
Sets RAS information for a user.

wntRunAsUser(s:domain/server, s:user-name, s:password, i:login-type, i:flags)
Run as a different user.

WinBatch version 98B

WB 98B  Jun 24, 1998


In 32-bit version, the compiler now allows you to specify a tech support
URL (web page) to be used if an error occurs in the script (under
"Settings").  This can be overridden using IntControl(50).

In 32-bit version, the compiler now allows you to specify version
information strings to be embedded in the EXE (under "Version Info").

The compiler now creates a configuration file for each source file you
compile.  It will be placed in the same directory as the source file, and
will have the same base name with an extension of ".CMP".  For example, if
you compile "C:\UTIL\TEST.WBT", it will create a configuration file named
"C:\UTIL\TEST.CMP".

The compiler now allows you to specify additional files to be embedded in
a large EXE (under "Other files").

The compiler no longer supports automatic batch mode.  If you run it with
command-line parameters, it will bring up the interactive interface with
the specified source file and output type pre-selected.

The ".DAT" file format for extenders to be embedded by the compiler has
changed.  The new format is a text file with the first line being the
description of the file, and one or more additional lines listing files
to be embedded.  The files may contain a full path; if a file doesn't have
path information, the compiler will look for it first in the compiler
directory, then on the path.  For example:

Novell NetWare 4.x
wwn4z32i.dll
wwn4z16i.dll

For backwards compatability, the second line of the .DAT file may contain
a list of files, delimited by commas.

In 32-bit version, the compiler now supports embedded file names longer than
16 characters, and no longer converts embedded file names to upper case.

In 32-bit version, the compiler now has an option to have the script run
hidden (under "Settings").

Changed BoxNew so that if you create a new box which covers or overlaps an
existing box, the most recently created box will be on top.


DLL 2.5bbq  First showing up in WB 98B

New functions:

BinaryTagInit(i:buffer, s:start-tag, s:end-tag)
Initializes a binary tag operation.

BinaryTagFind(s:tag-struct)
Finds the next binary tag.

BinaryTagExtr(s:tag-struct, i:flags)
Returns the text between the last-returned pair of binary tags.

BinaryTagRepl(s:tag-struct, s:new-string)
Replaces a binary tag with text.

BinaryIndexEx(handle, offset, string, direction, i:match-case)
Searches a buffer for a string.

ItemSortNc(list, delimiter)
Sorts a list, ignoring case.


In 32-bit version of FileVerInfo, if you specify a blank string for
"language-key", it will try to look up the item under the following
language keys, in the specified order:

In 32-bit version, changed method for converting floating point numbers to
strings.  The new method should produce fewer anomolies, but in some cases
the results will be slightly different than the previous method.

Fixed problem with BinaryPokeStr letting you store a string that was one
byte larger than the size of the buffer.

Fixed problem with BinaryIndex and BinaryIndexNc failing if the string was
found at the very end of the text in the buffer (ie, right before the EOD).

WinActivate no longer resets a window's "stay-on-top" attribute.

Fixed a problem in dialog boxes, where pressing the "Enter" key would
sometimes select the "OK' button instead of the highlighted pushbutton.

Fixed a problem with OLE calls causing a 3130 error if they were supposed to
return an object handle, but the function call failed (ie, returned 0), and
the return value was not assigned to a WIL variable in the script.

The built-in variables "param1" through "param9" are now correctly undefined
for parameters which are not passed, when making multiple Call's.

Added 2 additional activation methods to IntControl(61) and IntControl(62):

P1   Method to use
--   -------------
3   Change foreground lock timeout.
4   Attach to the input thread of the foreground window.

Changed the default method in Windows 98 and NT 5.0 to "3".

AskDirectory now handles "start-dir" having a trailing backslash.

NetWare 3 extender 12022  First showing up in WB 98B
New functions:
n3FileTimeGet(s:filename, i:time-field)
Gets Netware time information for a file.

n3DirTimeGet(s:dirname, i:time-field)
Gets Netware time information for a directory.

NetWare 4 extender 14020  First showing up in WB 98B
n4FileTimeGet(s:filename, i:time-field)
Gets Netware time information for a file.

n4DirTimeGet(s:dirname, i:time-field)
Gets Netware time information for a directory.

Fixed problem with n4MemberSet not completely adding the user to the group.

Fixed problem with n4MemberDel deleting all members in the specified group.

WinBatch version 98A

WB 98A  Jun 15, 1998

WinBatch compiler now accepts a single file name as a command-line
parameter (such as via drag-and-drop).

WinBatch compiler no longer converts output file name to lower case.

WinBatch compiler now removes end-of-line comments as well as entire
comment lines when optimizing WBT's.

Added the ability to embed external files when running or compiling a
WinBatch script, by using the new "#include" pre-processor directive.
The syntax is:

#include "filename"

DLL 2.5abq  First showing up in WB 98A

New functions:

BinaryCompare(handle1, offset1, handle2, offset2, count)
Compares portions of two binary buffers.


BinaryReadEx(handle, binary-offset, filename, file-offset, count)
Reads a portion of a file into a binary buffer.

BinaryWriteEx(handle, binary-offset, filename, file-offset, count)
Writes a portion of a binary buffer to a file.

BinaryAnd(target-handle, target-offset, source-handle, source-offset, count)
Performs a bitwise AND on portions of two binary buffers.

BinaryOr(target-handle, target-offset, source-handle, source-offset, count)
Performs a bitwise OR on portions of two binary buffers.

BinaryXor(target-handle, target-offset, source-handle, source-offset, count)
Performs a bitwise XOR (exclusive OR) on portions of two binary buffers.

BinaryConvert(handle, source-type, target-type, code-page, flags)
Converts a binary buffer.
This function can be used to perform the following types of conversions:

8-bit <-> Unicode
Multibyte <-> Unicode
ANSI <-> OEM
-> Uppercase
-> Lowercase

BinaryClipGet(handle, format)
Reads the contents of the Windows clipboard into a binary buffer.

BinaryClipPut(handle, format)
Writes a binary buffer to the Windows clipboard.

FileTimeGetEx(filename, time-field) (32-bit only)
Gets extended time information for a file or directory.

FileTimeSetEx(file-list, YmdHms, time-field) (32-bit only)
Sets extended time information for one or more files.

ObjectAccess(app.objname, create-flag)
Opens or creates an OLE 2.0 Automation object.

DirSize(s:dir-name, i:flags)
Finds the total size of a directory.


AskDirectory(prompt, browse-root, start-dir, confirm-prompt, flags) (32-bit, Win95/NT40 only)
Displays a directory browse dialog box, and returns the selected directory name.


New IntControls:

IntControl(53, p1, 0, 0, 0)
Set line terminator type for FileWrite.

IntControl(54, p1, p2, 0, 0)
Keep window on top.

IntControl(56, p1, 0, 0, 0)
Terminate an application.

IntControl(57, p1, 0, 0, 0) (32-bit, Windows 95 only)
Disable/enable system keys.

IntControl(58, p1, 0, 0, 0) (32-bit only)
Set system time.

IntControl(59, p1, p2, 0, 0)
Sends a WM_WININICHANGE or WM_SETTINGCHANGE message.

IntControl(60, p1, p2, 0, 0)
Sends a WM_DEVMODECHANGE message.

IntControl(61, p1, 0, 0, 0) (32-bit only)
Sets WinActivate() method.

IntControl(62, p1, 0, 0, 0) (32-bit only)
Sets dialog activation method.

The date string returned by the TimeDate function now includes a 4-digit
year, if this was configured via Control Panel.

In 32-bit version under Windows NT, RegDeleteKey now deletes a key even if
it has subkeys (under Windows 95 it has always done this).


Added additional special characters to the SendKey (and SendKeysTo and
SendKeysChild) functions:

Key                      SendKey equivalent
---                      ------------------
0 on numeric keypad      {NUMPAD0}
1 on numeric keypad      {NUMPAD1}
2 on numeric keypad      {NUMPAD2}
3 on numeric keypad      {NUMPAD3}
4 on numeric keypad      {NUMPAD4}
5 on numeric keypad      {NUMPAD5}
6 on numeric keypad      {NUMPAD6}
7 on numeric keypad      {NUMPAD7}
8 on numeric keypad      {NUMPAD8}
9 on numeric keypad      {NUMPAD9}
* on numeric keypad      {NUMPAD*}
+ on numeric keypad      {NUMPAD+}
- on numeric keypad      {NUMPAD-}
. on numeric keypad      {NUMPAD.}
/ on numeric keypad      {NUMPAD/}
Enter on numeric keypad  {NUMPAD~}  (32-bit only)

In 32-bit version, the Run[..] commands can now be used to launch a
shortcut to a non-executable, such as a document or a directory.  However,
the "Wait" option is ignored in this case.

Fixed problem with TimeSubtract failing if the result was less than 1 year.

If the "length" parameter of StrSub is past the end of the string, it now
extracts to the end of the string, instead of returning a blank string.

Changed FileRead to treat line feeds as line terminators, instead of
carriage returns.  This means that FileRead now supports both DOS files
(which have CR/LF terminators) and UNIX files (which have LF terminators).

Fixed problem with IntControl(5) in the 32-bit version.

In the Dialog function, ampersands ("&") are no longer being converted to
underscores in static text and varying text fields.

Added parameter to IntControl(49):

IntControl(49, p1, p2, 0, 0)

p2 = specifies the value that a dialog box (created using the "Dialog"
function) will return if the user closes the dialog without pressing
one of the pushbuttons in the dialog (eg, by pressing {Alt-F4}, or
by clicking on the "Close" icon in the title bar).  The default is 1.
If a dialog returns 0, processing will be transferred to the label in
the script marked ":Cancel" (if any).

IntControl(40) now correctly sets the share mode used when opening a file
in "APPEND" mode with FileWrite(previously, it was only affecting files
opened in "WRITE" mode).

Fixed problem with input focus being lost when a dialog (created using the
"Dialog" function) was minimized and restored.

In 32-bit version, fixed problem prepending the path specified in the registry
under "App Paths" when launching a program, if the existing path was more than
300 characters long.

In 32-bit version, FileTimeGet no longer updates the file's last-access time.

SendKey (and SendKeysTo and SendKeysChild) now turns caps lock off while
sending keystrokes (and restores the previous state when it is done).  This
fixes a problem that was occurring when caps lock was on, and a shifted key
combination was specified [eg, SendKey("+a")], resulting in a lower-case
character being sent.  Although this was faithfully duplicating the behavior
of typing keystrokes manually ("reverse caps lock"), the intended behavior
is for SendKey to ignore the caps lock state, and to therefore behave
consistently whether caps lock is on or off.

In 32-bit version under Windows 95, fixed problem using KeyToggleSet twice
in a row.

Fixed bug in StrIndexWild that could cause program to hang.

Improved parameter handling for OLE functions:


Fixed string memory leak with OLE functions.

The following functions, which return a date string in YmdHms format, now
return a 4-digit year by default.  This can be changed using IntControl(41):

FileYmdHms
TimeAdd
TimeJulToYmd
TimeSubtract
TimeYmdHms

Under Windows 98 and NT 5.0, fixed problem with WinActivate and SendKeysTo
not working, and problem with WIL dialogs not being activated.  By default,
an alternate window activation method will be used under these operating
systems, which can be modified with IntControl(61) and IntControl(62).

Under Windows 98 and NT 5.0, messages boxes are now brought to the
foreground, but they will not be activated.

DiskScan no longer adds a trailing delimiter to the returned list.

DiskFree and DiskSize now accept lists with a trailing delimiter.

In the "overwrite warning" dialog in FileCopy and FileMove, if the file
name is too long to be displayed in its entirety, the beginning and end of
the name are now displayed, instead of the name simply being truncated.

In 32-bit version, the Wallpaper() function now supports the Active Desktop
wallpaper in Internet Explorer 4.0.

Fixed problem with StrIndexWild returning 0 if an asterisk ("*") in the
wildcard pattern matched 0 characters in the string.

In 32-bit version, improved the way FileFullName handles relative path
names, when the current directory is a UNC (network share).

The following functions no longer return a delimiter at the end of the list:

DirItemize
FileItemize
IntControl(31)
ItemInsert
ItemRemove
ItemSort
NetInfo
WinItemize
WinItemChild
WinItemNameId

Functions which take a date/time string in YmdHms format now return an
error if "24" is specified as the hour.

Windows 95 extender 11003  First showing up in WB 98A
The following functions have been renamed and moved to the new Windows
95/RADMIN (remote administration for Windows NT) extender.  The existing
functions will continue to work in this version, but may be removed or
modified in future versions.  Note that some of the parameters in the new
DLL have been changed (specifically, a "group-type" parameter has been
added to the w95ListGroups and w95Member[..] functions).  Refer to the
help file for the new extender for further information.

Old name        New name
-------------   -------------
w95ListGroups   w9xListGroups
w95MemberDel    w9xMemberDel
w95MemberGet    w9xMemberGet
w95MemberGrps   w9xMemberGrps
w95MemberList   w9xMemberList
w95MemberSet    w9xMemberSet
w95ServiceAt    w9xServiceAt
w95UserInfo     w9xUserInfo

New functions:

w95ServerType(s:server-name)
Returns a server's platform.

w95ServiceInf(s:server-name)
Returns a server's type.


w95ShareAdd now creates persistent shares (ie, they do not disappear when
you reboot).

In 32-bit version, IntControl(68) (shut down computer) now does a power-off,
if supported by the computer.

Windows NT extender 11005  First showing up in WB 98A
New functions:
wntUserProps(s:server-name, s:user-name, i:request)
Returns information about a network user.

wntServerList(s:server-name, s:domain-name, i:server-type)
Lists servers in a domain.

wntUserAdd(s:server-name)
Adds a user account.

wntUserAddDat(s:element, s/i:value)
Sets parameter information for wntUserAdd.

wntUserDel(server-name, user-name)
Deletes a user account.

wntServerType(s:server-name)
Returns a server's platform.

wntServiceInf(s:server-name)
Returns a server's type.

wntUserGetDat(s:server-name, s:user-name, s:element)
Returns parameter information for a user account.

wntUserSetDat(s:server-name, s:user-name, s:element, s/i:value)
Modifies parameter information for a user account.

wntUserRename(s:server-name, s:old-username, s:new-username)
Renames a user account.

In wntAccessAdd and wntAccessDel, added additional values for "object-type":

301  directory in an NTFS partition, and all its subdirectories
302  directory in an NTFS partition, and all files in the directory
303  directory in an NTFS partition, and all its subdirectories, and
all files in the directory and all its subdirectories
401  registry key, and all its subkeys

wntFileClose now closes all connections to a file, instead of just the
first one.  It also now returns the number of connections which existed
(and were closed) for the specified file.

wntChgPswd can now be used to specify a new password without knowing the
old password, if you are a member of the Administrators or Account
Operators local group.  To do this, specify "*UNKNOWN*" as the old
password.  In this case, the "user" parameter must specify an actual user
name (ie, it cannot be a blank string).

NetWare 4 extender 14019  First showing up in WB 98A
New function:
n4SetContext(s:context, s:tree)
Changes the current user's default context and/or tree.

n4ObjectProps now supports integer values, and some (but not all) other
non-string value types.  Unsupported types will now be returned as blank
strings ("").

WinBatch version 97D

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.

WinBatch version 97C

WB 97C  Jun 26, 1997
DLL 2.4cbp  First showing up in WB 97C
New function:
ShortcutDir(s:name) (32-bit only)

New IntControl:
IntControl(52, p1, 0, 0, 0) (32-bit only)
Set dialog font.

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).

Fixed problem with w95UserInfo crashing if RADMIN32.DLL was not available.

WinBatch version 97B

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.

WinBatch version 97A

WB 97A  Jun 12, 1997

New IntControl's:

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

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.

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

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

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

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

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

WinItemizeEx(s:partial-winname, i:multiple, i:hidden)
Returns the full name of window(s) matching a partial window name.

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, "https://techsupt.winbatch.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.


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


w95ShareInfo(s:server-name, s:share-name, i:request)
Returns information about a shared resource.

w95UserInfo(i:request)
Returns information about the currently logged-on user.



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.

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.

wntShareInfo(s:server-name, s:resource/share-name, i:share-type, i:request)
Returns information about a shared resource.

wntGroupInfo(s:server-name, s:group, s:group-type, i:request)
Returns information about a group.

wntUserInfo(i:request)
Returns information about the currently logged-on user.

wntSvcStart(s:server, s:service-name, i:flags, s:params, s:delimiter)
Starts a service.

wntSvcControl(s:server, s:service-name, i:flags, i:control-code)
Stops or controls a service.

wntSvcStatus(s:server, s:service-name, i:flags, i:request)

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.

n4UserGroupEx(s:server-name, s:user-name, s:context)
Returns a list of groups to which the specified user belongs, in the specified context.

n4GetContext(i:request)
Returns the current user's default context or tree.


WILX extender 11106  First showing up in WB 97A

New function:

xEjectMedia(s:drive) (32-bit version only)
Ejects removable media from a device.

WinBatch version 96M

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).

WinBatch version 96K

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").

WinBatch version 96J

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.

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


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.

WinBatch version 96G

WB 96G  Oct 21, 1996

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.

WinBatch version 96H

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".

WinBatch version 96F

WB 96F  Oct 18, 1996
In BoxTextFont, expanded the "pitch & family" parameter to now be
"pitch & family & character-set":

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.


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

IntControl(1004, 0, 0, 0, 0)
Returns the file name of the current WinBatch 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).

DLL 2.3fbn  First showing up in WB 96F
New functions:

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

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

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.

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

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.

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

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

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

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

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


New IntControls:

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


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

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

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


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


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


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


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


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 NT, NetInfo(1) will return a list of installed network
provider ID's, delimited with the standard file delimiter (by default,
a tab).

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.

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.

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

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

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

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


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.

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

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

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.

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

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

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

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

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

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

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

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.

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

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


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.


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


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


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

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

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

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

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

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

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


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

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


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.

WinBatch version 96E


WB 96E  June 27, 1996

New IntControl:

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

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".

WinBatch version 96D

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


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.


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

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

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.

New IntControl's:

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


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

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.

WinBatch version 96C

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)
n3DirAttrSet(dirname, attribs, mode)
n3MapDir(net-path, local-name)
n3MapRoot(net-path, local-name)

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.

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

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

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

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

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

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

Added new request #4 to n3ServerList:


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.

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

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

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


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

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

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


Added new request # to n4ServerList:

4 = all known servers (TAB-delimited list)


Windows 32 extender 10005

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

WinBatch version 96B

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.

WinBatch version 96A

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.


New IntControl's:

IntControl(37, p1, p2, p3, 0)
Replaces the specified icon in an EXE 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.
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.

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.

WinBatch version 95E


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).

WinBatch version 95D


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.

WinBatch version 95C


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.

WinBatch version 95B

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)".

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)
MouseClickBtn(win-name, child-win, button-text)
MouseMove(x, y, win-name, child-win)

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.

WinBatch version 5.X

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 of WinBatch 5.0H

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 <Ctrl-Break> 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:



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