Owl Mini

WinBatch® Versions

WinBatch version 2017A

WB 2017A  Jan 04, 2017

DLL 6.17aqa First showing up in WB 2017A

Fixed defect in the BoxTitle and BoxOpen functions that could cause process memory
corruption when the title parameter contained text longer than 256 characters.

Fixed defect in AskFileName function that made it necessary to provide at least one file
type definition when using flag parameter values of 100 or higher.

Added new flag value to AskDirectory:
32   makes directory browse dialog an owned window. The value 32 can be combined with other
flag parameter values.

Modified IntControl 78 to to make it possible to free a single UDF or UDS.  To free a single
UDF or UDS specify a value of 1 in the p1 parameter and place the name of the UDF or UDS to be
freed in the p2 parameter.  A single UDF or UDS cannot be freed while it is executing.

Added more descriptive error message when a UDF or UDS associated with a callback handle by
'DllCallbackCreate' is used by a process thread other than the main WIL thread.

Added extended-length path support to the following file and directory functions:
DirAttrGet
DirAttrGetEx
DirAttrSet
DirAttrSetEx
DirExist
DirInfoToArray
DirMake
DirRemove
DirSize
FileAppend
FileAttrGet
FileAttrGetEx
FileAttrSet
FileAttrSetEx
FileCompare
FileCopy
FileDelete
FileExist
FileGet
FileGetW
FileInfoToArray
FileItemize
FileItemPath
FileMapName
FileMove
FileNameLong
FileNameShort
FileOpen
FilePut
FilePutW
FileRename
FileSize
FileSizeEx
FileTimeCode
FileTimeGet
FileTimeGetEx
FileTimeSet
FileTimeSetEx
FileTimeTouch
FileVerInfo
FileYmdHms

The following functions support extended-length paths but require extended-length file
paths be converted to a Unicode string before being passed to the function:
BinaryRead
BinaryReadEx
BinaryWrite
BinaryWriteEx

Extended-length paths are file and directory names that have a combined length greater
than 259 characters with a maximum length of approximately 32766 characters.  When passing
an extended path to a supporting function, the path must be an absolute path. It cannot be
a partial nor relative path and path segments must be separated by back slashes (\).
Forward slashes (/) cannot be used.  Either the "\\?\" prefix for local path or the
"\\?\UNC\" for UNC paths can be added to beginning of a path to improve performance.  The
"\\?\" prefix should be placed before the drive letter of a local path.  The "\\?\UNC\"
prefix should replace the leading "\\" for UNC (share) paths. Supporting functions that
return absolute paths automatically include the appropriate extended-length path prefix
when the total length exceeds 259 characters. Note that optical media, like the ISO 9660
CD/DVD format, often have more restrictions on the length of files, folders, and paths
than the Windows operating system so these devices may not support extended-length paths.

New IntControl:
IntControl(99, p1, 0, 0, 0)
Unloads a previously added extender.  Returns 1 if the extender was unloaded and 0
otherwise.
p1   File name of extender to unload.

WinBatch Studio:
Eliminated UI artifacts in the Project Window on Windows XP systems.

Project file items are now either selected or highlighted when added to a project in the
Project Window tree.

Common Language Runtime (CLR) Hosting:
Improved support for multiple field structs (value types) returned by dotNet object
methods and properties.  Note that structs must still have the COM Visible attribute in
order to create an instance of the struct in a WIL script.

Added a "useany" option to the 'ObjectClrOption' function.  The option is similar to the
function's "use" option for loading assemblies except that it does not require a strong
assembly name.  Instead the option attempts to load an assembly using the assembly's weak
name. An assembly's weak name is an assembly name without the Version, Culture,
PublicKeyToken and optional processorArchitecture values. The function performs the
"useany" task by searching the Global Assembly Cache (GAC) for the latest version of the
named assembly.  It is not necessary to use the option to load non-GAC assemblies because
the CLR does not require that non-GAC assemblies have strong assembly names.  Setting the
CLR version using this function's "version" option limits "useany" to search for GAC
assemblies associated with the specified version and older versions of the CLR.

Changes to the Dialog and related functions:
Added a DATETIME control.  The DATETIME control is the WIL Dialog implementation of the
Date and Time Picker Windows Common Control. It can be used to both display and receive
date and time input in multiple formats.

The DATETIME control uses all dialog template control definition attributes except
'value' with the following control specific meanings:

var   - The name of a variable that receives the user selected date/time from the
control on a non-canceling exit from the dialog.  Optionally, the variable can
contain a vertical bar(|) delimited list of YMDHMS date and time values.  The
first item of the list is used as the control's initial date/time.  The second
item is the minimum date/time the control will accept and the third item is the
maximum date/time the control will accept.  Use an empty list elements to use
the control's default for the respective item.  Using DEFAULT instead of a
variable name sets the date/time to the current date/time with control defined
limits.

text  - The text attribute is used to indicate the date/time format the control
displays. Specifying 'DEFAULT' or using an empty string causes the control to
use the current system default date format.  The following table lists the
standard Windows date/time format characters accepted and interpreted by the
control.  Nonformat character are accepted but they must be with a few
exceptions enclosed in single (') quotes.

Format    Used For                    Description
d      Days       Displays the day as a number from 1 to 31
dd      Days       Displays the day as a number with a leading 0 if the
number is less than 10
ddd      Weekdays   Displays a weekday name with 3 letters as Mon, Tue, etc
dddd      Weekdays   Displays the complete name of a week day as Monday, etc
M      Months     Displays the numeric month from 1 to 12
MM      Months     Displays the numeric month with a leading 0 if the number
is less than 10
MMM      Months     Displays the short name of the month as Jan, Feb, Mar, etc
MMMM      Months     Displays the complete name of the month as January, etc
yy      Years      Displays two digits for the year as 16 for 2016 or 03 for
2003
yyyy      Years      Displays the numeric year with 4 digits
h      Hours      Hours with no leading zero for single-digit hours; 12-hour
clock.
hh      Hours      Hours with leading zero for single-digit hours; 12-hour
clock.
H      Hours      Hours with no leading zero for single-digit hours; 24-hour
clock.
HH      Hours      Hours with leading zero for single-digit hours; 24-hour
clock.
m      Minutes    Minutes with no leading zero for single-digit minutes.
mm      Minutes    Minutes with leading zero for single-digit minutes.
s      Seconds    Seconds with no leading zero for single-digit seconds.
ss      Seconds    Seconds with leading zero for single-digit seconds.
t      Time Mark  One-character abbreviation (for example, A or P).
tt      Time Mark  Two-character abbreviation (for example, AM or PM).

style - The control supports the @csInvisible(1) and @csDisabled(2) styles. In addition
the control accepts the following new styles:

@csCheckbox (134217728) - Adds a check box that indicates no date/time value
when unchecked.
@csSpinner (536870912)  - Replaces the controls drop down calendar with a
spinner.  The spinner can be used to change the
value of individual elements of the displayed
date-time.

font  - Sets the display font for both the edit and drop down calendar elements of the
control.

textcolor - Sets the text color for the drop down calendar element only.

backgroundcolor - Sets the background color for the drop down calendar element only.

Added the following new event code to the 'DialogProcOptions' function in support of the
new DATETIME control:
@deDtChange(23) -  Date or time change: user has changed the date/time.  This event
also fires if the date/time range is changed and the current
value of the DATETIME control does not fall within that range.
The new control date/time is passed to user defined callbacks in
the callback's fifth parameter.

Modified the 'DialogControlGet' function to support a new DATETIME request codes:
@dcFormat(28) - Returns a DATETIME control's current format as a string.  The
function returns an empty string if no format was previously
specified.

Use the @dcDate(7) request code to obtain the date/time shown in the control in
YYYY:MM:DD:HH:MM:SS format. Use the @dcText request code to obtain the date/time as
text in the format displayed by the control.

Modified the 'DialogControlSet' function to support a new DATETIME request codes:
@dcFormat(28) - Sets a DATETIME control's current display format using the special
format characters also used in the control's template text
attribute.

Use the @dcDate(7) request code to set the date/time shown in the control.  The
date/time should be in the YYYY:MM:DD:HH:MM:SS format with one exception. When the
control has the @csCheckBox style, an empty string ("") can be sent to the control
to uncheck the control's chechbox. The empty string does not change the displayed
date/time.  The control's range can also be set using a vertical bar(|) delimited
list of YMDHMS date and time values.  Neither the @dcText nor @dcTitle request code
can be used to set the displayed date.

The DialogControlState request code @dcsGetStyle can be used to determine whether or not
the @csCheckBox and @csSpinner styles are set for the DATETIME control  However, the
@dcsRemStyle or @dcsAddStyle request codes cannot be used to change the @csCheckbox and
@csSpinner styles.  The @dcsRemStyle or @dcsAddStyle request codes can be used to change
the DATETIME control's @csInvisible and @csDisabled styles.

WinBatch version 2016B

WB 2016b, May 18, 2016

DLL 6.14bpb First showing up in WB 2016B

Added support for dynamic array creation and redimensioning of WIL and COM variant arrays.
Arrays are created dynamically by assigning a value to a previously undefined variable using
brackets and comma separated subscripts array syntax following the new variable's name.
Existing arrays can be redimensioned by assigning a value to an array element that is beyond
the upper bound of an existing dimension or adding a new dimension to the array's comma
separated subscript list.  Dynamic array assignment is optimized for single dimension arrays.
Use in redimensioning multi-dimension arrays is significantly slower than initially creating
an array with the highest required array subscripts.  An existing non WIL array variable
cannot be converted to an array by using array subscript syntax with the existing non array
variable's name.  Doing so will result in an "Expression continues past expected end." error.

Added support for the BYREF variant type to the ObjectType function. Use the BYREF variant
type in combination with another type to create a reference to a variant of the indicated
type. The BYREF type cannot be used alone or in combination with the ARRAY or VECTOR variant
types. Separate the two types passed to ObjectType with a vertical bar (|) to form a BYREF
type combination.  The BYREF type can also be used in combination with another type when
specifying a COM Automation object method parameter's type using the BYREF type combination
followed by a single colon(:) and then the expression that evaluates to the parameter's
value.

Modified the 'ObjectType' function's handling of uninitialized WIL array elements when
converting a WIL array to a COM variant array (safearray) and no element type is used along
with the 'ARRAY' variant type.  Previously, the function converted initialized elements to
to variant type 'ERROR' but it now converts uninitialized elements to the 'EMPTY' variant
type.  This change prevents 'Type mismatch' errors when assigning values to uninitialized
COM variant array elements.

Fixed a parser defect that caused an error message when a colon(:) concatenation operator
immediately followed the end of a multiline text string constant without any intervening
white space.

Modified the Setup program to register WinBatch Studio so that it appears as an option in
Window's File Manager 'Open with...' context menu dialog on Windows 10 systems with no
previous WinBatch installation.

Modified WIL interpreter DLL loading and unloading to reduce the possibility of FileMenu
causing the Explorer shell process to restart on no-reboot-requested installs of WinBatch or
WinBatch+Compiler over an existing WinBatch or WinBatch+Compiler installation.
Note that this change only affects the installation of future versions of WinBatch or
WinBatch+Compiler over this and future version of WinBatch or WinBatch+Compiler and does not
affect installing this version over older versions of WinBatch or WinBatch+Compiler. Also
note that a reboot is still recommended after a WinBatch or WinBatch+Compiler installation
even when the Setup program does not prompt for a reboot.

Added a third parameter to the "WindowOnTop" function.
"Retry" - (Optional) Set to a @False (default) or @True value to indicate whether or not
the function should use the current WIL retry timeout setting when a window
name is provided in the function's first parameter. Set to @True to have the
function use the current timeout setting. Set to @False or omit, to have
the function immediately generate an error when the target window is not found.
The parameter is ignored when the first parameter is a window id.
Note that IntControl 46 can be used to change the current retry timeout setting
(default is 9 seconds.)

Added support for multiline string to DllStructAlloc's member-descriptor parameter.
Note that per multiline string requirements the  member-descriptor's data type and name
separator colon (:) character must be escaped by using a double colon (::) instead of
the single colon and that a type/name member pair must be on the same line. Multiple pairs
can be on a single line, however.

WinBatch Studio
Fixed several incorrect syntax coloring problems related to multiline string constants.

Fixed 'Projects' menu's 'Open Project File' menu item not being enabled when a project file
is selected.

Corrected a problem that caused the dockable Project Tree toolbar dialog to display without
the 'Default' workspace name and icon the first time WinBatch Studio was started after a
clean installation of WinBatch or WinBatch+Compiler.

The Project Tree toolbar dialog is now toggled on and off solely by the 'Project Tree' menu
item of the 'View' menu bar menu.  Previously, the 'Restore workspace at startup' option
blocked display of the Project Tree toolbar at WinBatch Studio startup when the 'Restore
workspace at startup' option was not checked.

Modified the 32-bit and 64-bit debuggers to set the debug process's current working
directory to the location of the script being debugged.  The current working directory is
restored to its previous setting when the debug session ends.

Added 'Run' menu item to the context menu of the project toolbar window.  The menu item
executes a WIL script in a separate WinBatch process.  The 'Run' menu item only displays
for WIL file type files.

Added a new 'Debug Parameters...' menu item to the 'Debug' main menu bar dropdown menu. Use
this menu item to displays a Debug Parameter dialog. The dialog allows you to create,
remove, move and change WIL script parameters passed to the current WIL script when it is
executed using the 32 and 64 bit Run, Debug, Step Into, Step Over or Run to Cursor commands.
Debug parameters are not supplied to WIL scrips executed using the Project Tree toolbar
dialog's Run context menu.  Debug parameters remain associated with a script for as long as
the script file is an open document associated with a workspace.  The parameters will remain
associated with a file in the current workspsce between WinBatch Studio sessions when the
"Restore workspace at startup" option is selected.  The parameters will also remain
associated with a file even when the "Restore workspace at startup" is not selected, if the
file's saved workspace is not the current workspace at session end.

The Debug Parameters dialog displayed by selecting the 'Debug Parameters...' menu item
allows you to create, remove, move and change the parameters passed to a WIL script.  The
dialog displays the list of parameters, one per line, along with a toolbar. The list's
toolbar buttons and the dialog's buttons perform the following tasks:

New button        Creates a new parameter.  Enter the parameter value in the edit box
displayed in the toolbar's list and press return or click on the list
outside of the edit box to create the parameter.
Delete button     Deletes a selected parameter from the list.
Move up button    Moves a selected parameter toward the top of the parameter list.  This
changes the order in which the parameters are passed to the WIL script.
Move down button  Moves a selected parameter toward the bottom of the parameter list.
This changes the order in which the parameters are passed to the WIL
script.
Clear All         Removes all parameters associated with the current WIL script.
OK                Saves changes and dismisses the dialog.
Cancel            Closes the dialog without saving changes.

Note that it is unnecessary to quote parameter values unless you want quotes to be part
of the parameter value passed to the WIL script.

WinBatch version 2016A

WB 2016a  Feb 10, 2016

DLL 6.14apa First showing up in WB 2016a

The RegOpenKeyEx was modified to only require that 3 parameters instead of 5 by making the
4th and 5th  parameters optional.

Added support for 0 (REG_NONE) value type to the RegSetEx function's 5th parameter. When
this type is used the values of the function's 3rd and 4th parameters are ignored.

Corrected problem in the DllStructPeek function that sometimes caused truncation of
returned Unicode string structure members.

Added support for multiline text string constants:
Multiline text string constants are text string constants that occupy more than one line
in the body of a script. Only the dollar-sign + double-quote character combination($") can
be used to enclose a multiline string constant. With the few exceptions noted below all
text appearing between the beginning '$"' delimiter and ending '$"' delimiter are
included in the resulting constant's text.  This includes the ASNI new line (line-feed)
character that delimits each line in scripts and any white-space characters.  Note that
when a script line is delimited by the carriage-return + line-feed combination, the
carriage return is converted to a space and the line-feed character is retained.

In order to maintain preprocessor performance the colon(:) and number-sign(#) characters
must be escaped in multiline text string constants. To place a single colon or number-sign
in a multiline text string, specify a double colon(::) or number-sign(##). The failure to
escape these characters results in an error.

As is the case with single line text string constants, to place a single percent-sign (%)
in a multline text string constant specify a double percent-sign(%%).

To include a single multiline text string constant delimiter($") in a constant's text use
a double combination($"$").

To use multiline text string constants in the 'then' or 'else' clause of the single
statement form of the 'if' statement syntax, each line of the constant after the first
line must begin with either a 'then' or an 'else'.  Any white-space characters before the
'then' or 'else' and one white-space character after the 'then' or 'else' are not included
in the text constant.  Note that multiline text string constants are used as is without
the special single line syntax requirements in structured 'if' syntax code blocks.

Substitution is permitted in multiline text string constants.

PopMenu
Modified active window detection so that it blocks use of Windows Runtime application
windows on Windows 10 unless no regular desktop window is active. This change does not
affect PopMenu on older versions of Windows.

WinBatch Studio
Fixed problem in the Options dialog's File Type tab's Font selector that prevented the
Bold or Italic font style selections from being recognized.

Miscellaneous usability fixes and improvements.

Added multiline string syntax coloring.

This release introduces the concepts of tabbed editing, workspaces and projects to
WinBatch Studio:
Added a 'Tab View' menu item to the View menu bar menu. Selecting this menu item
turns tab style file viewing on and off in the main editor window.  Tabs are
located Microsoft Excel style near the bottom of the main window.

Added a 'Project Tree' menu item to the View menu bar menu.  This menu item toggles
the display of a dialog toolbar window containing a hierarchical display of all user
created projects associated with the current workspace.

Added a new 'Projects' menu item to the main menu bar.  This menu item contains menu
and sub menu use to create, modify, and control workspaces and projects.  Many
changes made with these menu items are reflected in the project dialog toolbar.
Project related menu items are only enabled when the project toolbar window is
visible.  The new menu has the following menu items:

'Add'  This sub menu displays 4 menu items:
'New Project'    This menu item displays a dialog that allows you to create a new
project in the current workspace or as a sub project of the
current project in the workspace.
'New File'       Displays a dialog that allows you to add a new file item in the
current project. Note that the file is not physically created on
the computer's file system.
'Existing Files' This menu item displays a standard file selection dialog that
allows you to add one or more existing files to the current
project.
'Current File'   Use this menu item to add the file currently displayed in the
main window to the current project.
Note that the 'Add' menu items are also available as Project Tree dialog toolbar
context menus items.
'Open Project File' Opens the currently selected file in the main file viewing area.
Note that double-clicking a file item in the project tree dialog
toolbar will also open the selected file in the main file viewing
area of the editor.
'Remove'            Removes the currently selected file or project from its
containing project or workspace. Note that removed files are not
deleted from the file system.
'Workspaces'        This menu item displays the workspace manager dialog. This dialog
allows you to create, remove rename or select a workspace as the
active workspace. A workspace consists of user defined tools,
projects, project files and open windows. The workspace dialog is
described below.
'Close Workspace'   Closes a currently open workspace.

The names of the most recently used workspaces are display below the 'Close Workspace'
item. Selecting a workspace name makes the workspace the active workspace.

The Workspace Manager dialog is displayed by selecting the 'Workspaces' menu item.
It allows you to create, rename, open and close WinBatch Studio workspaces. The dialog
displays a list of workspaces along with a toolbar.  Use the list's toolbar buttons
and the dialog's buttons to perform the following tasks:

'New button'        Use to create a new workspace.  Enter the workspace name in the
edit box displayed in the toolbar's list and press return to
create the workspace.
'Delete button'     Deletes a selected workspace form the list.
'Move up botton'    Moves a selected workspace name toward the top of the workspace
list.  This change is reflected in the workspace MRU.
'Move down botton'  Moves a selected workspace name toward the bottom of the workspace
list.  This change is reflected in the workspace MRU.
'Open'              Processes pending workspace changes, closes the Workspace Manger
dialog and makes the selected workspace the current workspace.
'Save'              Processes pending workspace changes, saves the current state of
the selected workspace and closes the Workspace Manger dialog.
When a workspace state is saved all currently open document
windows will be restored the next time the workspace is loaded
into the editor.
'Done'              Processes pending workspace changes and closes the dialog.
'Cancel'            Closes the dialog without processing changes.


WinBatch version 2015B

WB 2015B  Jul 29, 2015

DLL 6.14bob First showing up in WB 2015b

Modified COM exception error reporting to display a system error number in the 'More Error
Info' dialog when text based exception information is not provided by the COM server
reporting the exception.

Modified setup.exe to allow the installation of WinBatch or WebBatch on install target hard
drives or shared folders with more than two terabytes of free space.

Added new optional parameter to the SendKey, SendKeyTo, and SendKeyChild functions.  Use
the new parameter to indicate the number of seconds to delay between keystrokes sent to the
currently active or targeted window. Use a floating point number for the parameter's value
to indicate partial second values.  When the parameter is used in a call to one of these
functions, the value overrides any keystroke timing value set using IntControl 35 for the
duration of the function call.  If the char-string paramter of these functions contains
only one key value, the delay will occur after the keystroke is sent to the keyboard
driver but before the function returns.

Added Windows 10 OS support to the manifests of all distributed executables.

Modified the 'Two Explorers, side by side' menu item for both PopMenu and FileMenu so that
the menu item functions properly on Windows 10.

Added support for the LPVOID, LPCSTR, and LPCWSTR data type names in structure descriptor
strings passed to the DllStructAlloc function. Also added support for structure members
declared as pointer using a supported type name followed by an asterisk (*) character.
Note that the DllStructPeek and DllStructPoke functions do not perform any interpretation
of the contents of the memory location contained in a member with an asterisk modified data
type or the LPVOID data type.
Structure members declared as LPVOID or with an asterisk modifier will usually either
contain or should be set to a valid memory address or 0 depending on the requirements of
the DLL function using the structure.  See IntControl 32, IntControl 42, and IntControl 98
documentation for more information about using raw memory addresses in WIL scripts.

Modifed the the WIL COM subsystem to workaround a defect on some versions of Windows in
the WMI service COM Automation exception reporting.

New Function:

WinIsRuntimeApp(s:partial-winname)
The function returns a @TRUE(1) when a window is associated with a Windows Runtime
App (Window Store App.) For most non Runtime windows, it returns @FALSE(0).  Windows
associated with system processes, like the Windows shell's 'File Explorer' , do
cause the function to return @True even though the processes are not Windows Runtime
Apps. The function always returns @FALSE on Windows 7/2008 R2 and older versions of
Windows.

"partial-winname" - A window name that can be either an initial portion of, or an
entire window name.

The function only works with top-level (parent) application windows.

WinMacro:
WinMacro, the WinBatch macro recorder, returns as a menu option in PopMenu's main menu
on Windows Vista/2008 and newer versions of the Windows operating system. WinMacro
required extensive internal modifications to make it possible to record and playback
macros on newer versions of Windows. These changes impact both the behavior of
WinMacro's user interface and the user input events WinMacro can record and playback.

The user interface behavior changed in the following ways:
When the "Edit Script" toolbar button or "Edit" menu item is selected WinMacro now
automatically creates a script file version of the selected macro.

Once a script file for a macro has been created, WinMacro will always load and
execute the script version of the selected macro when the "Play" toolbar button or
menu item is selected.  This means that any modifications made to the script are
always reflected during macro play back unless the "Save Macro as WinBatch Script"
options is unchecked in the "Save WinMacro Macro" dialog. When the option is
unchecked, WinMacro will play back the original macro as recorded.

It is no longer possible to change the playback speed after a macro is recorded.
The playback speed must be set before recording a new macro.

If WinMacro cannot find the script file version of a macro previously converted to a
script, the macro cannot be played unless the "Save Macro as WinBatch Script"
options is unchecked in the "Save WinMacro Macro" dialog.

WinMacro now performs all macro playback using the WIL interpreter.  This means that
only mouse movements, mouse button clicks, and key strokes are recorded. Mouse button
support is confined to the left and right mouse buttons. Other mouse buttons including
scroll wheel rotation or clicking are not subject to recording. The Window key is
supported but holding down the Windows key while repeatedly pressing another key is
interpreted as individual combined key events. This means that pressing and holding the
Windows key while repeatedly pressing and releasing the tab key cannot be recorded and
then used to cycle through currently running application windows on playback.
Non-standard keyboard keys like the 'Fn' key found on many notebook computers are not
supported.

The format of the macro archive file (.waf) has changed.  This change means that macros
recorded using the old WinMacro application can still be played on a Windows XP/2003
system using the new WinMacro but new macros cannot be added to old style archives
using the new WinMacro. In order to record new macros on Windows XP/2003 a new archive
must first be created.

The new WinMacro requires Windows XP or newer and cannot be used on Windows 2000 or
older versions of the Windows operating system.


WinBatch version 2015A

WB 2015A  Jan 21, 2015

DLL 6.14aoa First showing up in WB 2015A

Entering license information for either the 32-bit or 64-bit version of WinBatch will now license
both versions of WinBatch and entering license information for either the 32-bit or 64-bit version
of the Compiler will also license both versions of the Compiler.

Fixed problem that caused the 'DialogControlGet' function to sometimes report incorrect error
information.

Fixed problem in the 'SnapShot' function that sometimes caused unexpected results when secondary
monitors were to the left or above the primary monitor on multi-monitor systems with an extended
desktop.

Fixed buffer overrun in the StrTypeInfo function.

Modifed PopMenuStarup program to start PopMenu without user consent when UAC prompting is disabled
on Windows 8/2012 and newer systems. This change only affects administrator accounts.

Modified the 'FileRename', 'FileMove', and 'FileDelete' functions to report any system error code
produced when the functions fail. The error code can be viewed by pressing the 'More Error Info'
button of the error message dialog box.

Added a new optional 'Flags' parameter to the 'StrTrim' function.  The 'Flags' parameter is used to
have the function only remove space and tab characters from either the left-hand or right-hand side
of the function's string argument.  Setting the parameter to 1 will cause the function to only
remove spaces and tab characters from the left-hand side of the string. Setting the parameter to 2
will cause the function to only remove space and tab characters from the right-hand side of the string.
Setting the parameter to 3 or not specifying the parameter causes default behavior which is to remove
space and tab characters from both sides of the string.

Added support for two new sort options to the 'ArraySort' function as alternatives to the default
'WIL relational operator' sort. The new options are represented by two new WIL constants passed to the
function by way of its second parameter. The constants can be combined with either a @Descending or
@Ascending constant using the bitwise OR(|) operator.

@Stringsort -  This option causes the ArraySort function to treat all array elements as text and
compare each element character by character.  Character code point values are used for
comparisons without consideration of written language syntax or semantics. The contents
of array elements do not need to be text in order to use this option. This option cannot
be combined with the @Logicalsort option.

@Logicalsort - The ArraySort function will use a logical string comparison for sorting when this option
is specified.  Digits in strings are treated as numerical content rather than text and
comparisons are not case-sensitive. This sorting algorithm is identical to the algorithm
used by Windows File Explorer to sort displayed file names.  The contents of array elements
do not need to be text in order to use this option. This option cannot be combined with the
@Stringsort option and requires Windows XP/2003 or newer.

The decimal place display setting for floating point numbers as set by calling the 'Decimals' function can
influence the sort order of arrays with elements containing floating point numbers.

Added support for two new search options to the 'ArraySearch' function. The new options are represented by
the two new WIL constants also used by the 'ArraySort' function.

@Stringsort - Use this option to perform a fast binary search of arrays sorted by the ArraySort function
using the same option.  The array must be sorted in ascending order and the search is always
case-sensitive.  This option cannot be combined with any other search options.

@Logicalsort - This option is used to perform a fast binary search of arrays sorted by the ArraySort
function using the same option.  The array must be sorted in ascending order and the search
is not case-sensitive.  The option cannot be combined with any other search options and
requires Windows XP/2003 or newer.

The decimal place display setting for floating point numbers as set by calling the 'Decimals' function can
influence the search result when performing a fast binary search for a floating point number or performing a
fast binary search of any sorted array that may contain floating point numbers.  Therefore, the decimal place
display setting in effect when sorting an array must also be in effect when performing a fast binary search
of an array.


New Functions:

FileLockItemize(s:filename [, n:flags])  - Requires Windows Vista/2008 or newer
The function returns a delimited list containing the full image file names of all running processes and
services that are currently using a file. Generally, in-use files cannot be deleted, moved to another
folder or overwritten.  Typically, files that are opened without sharing enabled are treated as in-use
files.  Common examples of in-use files include executable image files of running processes and '.DLL'
files currently loaded into running processes.  The function returns an empty list, if 'filename' is not
locked by any processes.

"filename" - A single absolute or relative path + file name to be checked for locking.
"flags"    - Optional @False or @True value to indicate whether or not the function should error when
"filename" cannot be found. The value @False (the default) instructs the function
to return an empty list when "filename" is not found. @True instructs the function to
report an error when the file cannot be found.

Notes: This function requires Windows Vista/2008 or newer. It cannot be used to identify the image file
of a process running on a remote computer nor will it return the image file names of elevated processes
when the function is used by a restricted WinBatch process. If a remote process is locking a local file,
the function may return a single word like 'system' to indicate that the file is in use but that the
process is unidentifiable. If only remote processes are locking a remote file on a share and that remote
file is checked using this function, the function will return an empty string.

Added 99 new Dialog function related constants to WIL. The following table list the constants along with
their value and brief description.

DialogprocOptions Constants (also passed to a user defined callback procedure in the second parameter.)
@deInit        (0)         The one-time initialization
@deTimer       (1)         Timer event
@dePbPush      (2)         PUSHBUTTON or PICTUREBUTTON pressed
@deRbPush      (3)         RADIOBUTTON selected
@deCbCheck     (4)         CHECKBOX checked
@deEdText      (5)         EDITBOX or MULTILINEBOX text edited
@deFlSelect    (6)         FILELISTBOX item selected
@deIbSelect    (7)         ITEMBOX item(s) selected
@deDlChange    (8)         DROPLISTBOX item selected
@deCaChange    (9)         CALENDAR date change
@deSpChange    (10)        SPINNER number change
@deClose       (11)        Close clicked (Made visible via DialogProcOptions 1002)
@deFlDblclick  (12)        FILELISTBOX double-click
@deIbDblclick  (13)        ITEMBOX double-click
@deComEvent    (14)        COMCONTROL Event notification from DialogObject (NOT DialogProcOptions)
@deMiSelect    (15)        MENUITEM selected
@deMiInit      (16)        MENUITEM being initialized
@deResize      (17)        Dialog resized
@deRvrSelect   (18)        REPORTVIEW row selected
@deRvrDblclick (19)        REPORTVIEW row double-clicked
@deRviCheck    (20)        REPORTVIEW item's checkbox checked/unchecked
@deRviText     (21)        REPORTVIEW first column item's text changed
@deRvhClick    (22)        REPORTVIEW header clicked

DialogprocOptions Constants (not passed to a user defined callback procedure.)
@dpoDisable    (1000)      Codes -1=GetSetting 0=EnableDialog 1=DisableDialog 2=Disable and wait cursor.
@dpoBkground   (1001)      -1=Get Current otherwise bitmap or color string.
@dpoSysMenu    (1002)      -1=Get Current 0=none 1=close 2=close/min 3=close/max 4=close/min/max.
@dpoTitle      (1003)      Set/Get Dialog Title - (-1 to get.)
@dpoCtlName    (1004)      Returns the name associated with a control's number.
@dpoCtlNumber  (1005)      Returns the number associated with a control's name.
@dpoClientSize (1007)      Returns a space delimited list of the width and height of the dialog's client area.

DialogControlState Constants
@dcsSetFocus   (1)         Give Control Focus.
@dcsGetStyle   (2)         Retrieves a control's style bits.
@dcsAddStyle   (3)         Gives a control a style.
@dcsRemStyle   (4)         Remove a control style
@dcsGetFocus   (5)         Returns the name of the control with the focus.
@dcsMouseOver  (6)         Centers the mouse cursor over a control.

Dialog Control Styles
@csDefault     (0)         Does nothing when used with DialogControlState. Same as DEFAULT in template.
@csInvisible   (1)         Sets a control invisible.
@csDisabled    (2)         Sets a control disabled.
@csListOnly    (4)         User cannot type text in edit box part of DROPLISTBOX. A template only style.
@csReadOnly    (8)         Sets a control to read-only (user cannot type in text.) Use with EDITBOX, MULTILINEBOX and SPINNER.
@csPassword    (16)        Places an EDITBOX in 'password mode' where only *'s are displayed.
@csDefButton   (32)        Sets a button as the default button.  Use with PUSHBUTTON and PICTUREBUTTON.
@csDigits      (64)        Sets a control to only accept digits.  Use with EDITBOX and MULTILINEBOX.
@csFlat        (128)       Gives a button a 'flat' or 'no depth' appearance. Use with PUSHBUTTON and PICTUREBUTTON.
@csNoAdjust    (256)       Turns off auto-height adjustment of an ITEMBOX or FILELISTBOX.  A template only style.
@csCenter      (512)       Centers text in control. Use with VARYTEXT and STATICTEXT.
@csRight       (1024)      Set text flush-Right in control. Use with VARYTEXT and STATICTEXT.
@csCurLeft     (2048)      Sets input cursor to left edge of control without text being selected. Use with EDITBOX and MULTILINEBOX.
@csCurRight    (4096)      Sets input cursor to right edge of control without text being selected. Use with EDITBOX and MULTILINEBOX.
@csShield      (8192)      Display the Security Shield icon on a button control (Vista/2008 and newer.) Use with PUSHBUTTON and PICTUREBUTTON.
@csMenuCheck   (32768)     Adds a check mark graphic to the left of a menu item. Use with MENUITEM.
@csMenuRadio   (65536)     Adds a radio button like dot graphic to the left of a menu item. Use with MENUITEM.
@csMenuSep     (131072)    Makes a menu item a separator bar graphic. Use with MENUITEM.
@csMenuBreak   (262144)    Causes a menu item to start a new column. Use with MENUBAR.
@csNoHeader    (524288)    Removes the header bar from a REPORTVIEW control.
@csFirstHeader (1048576)   First row of source array or file is used as column header text. Use with REPORTVIEW
@csGrid        (2097152)   Gives a REPORTVIEW control Grid lines.
@csSingleSel   (4194304)   Set a REPORTVIEW control to allow only one row to be selected at a time.
@csFullSel     (8388608)   Causes a REPORTVIEW control to highlight all row columns when the row is selected.
@csAsort       (16777216)  Causes REPORTVIEW rows to be sorted in ascending order.
@csDsort       (33554432)  Causes REPORTVIEW rows to be sorted in descending order.
@csColEdit     (67108864)  Causes a REPORTVIEW control to allow Editing of first column text.
@csColCheck    (134217728) Add a checkbox to first column of each REPORTVIEW row.
@csIncHeader   (268435456) Cause the column header text to be included when REPORTVIEW's contents are save to file or array.

DialogControlSet and/or DialogControlGet Constants
@dcCheck       (1)         Sets or gets the check state of a CHECKBOX or REPORTVIEW.
@dcDot         (2)         Sets or gets the dot graphic state of a RADIOBUTTON.
@dcText        (3)         Sets or gets the text in an EDITBOX or MULTILINEBOX.
@dcTitle       (4)         Sets or gets the text of a PICTURE, RADIOBUTTON, CHECKBOX, PICTUREBUTTON, VARYTEXT, STATICTEXT, GROUPBOX, PUSHBUTTON or MENUITEM
@dcContents    (5)         Sets or gets the contents of an ITEMBOX, FILELISTBOX, DROPLISTBOX or REPORTVIEW.
@dcSelect      (6)         Sets or gets the selected items in an ITEMBOX, FILELISTBOX, DROPLISTBOX or REPORTVIEW.
@dcDate        (7)         Sets or gets the date value of a CALENDAR.
@dcSpin        (8)         Sets or gets the current numeric value of a SPINNER.
@dcTabStop     (9)         Sets the fixed tab stops of a MULTILINEBOX.
@dcScroll      (10)        Sets or gets the visible item of an ITEMBOX, FILELISTBOX, MULTILINEBOX or REPORTVIEW (Set only.)
@dcBackColor   (11)        Sets or gets the background color of ANY CONTROL (Except CALENDAR, MENUBAR, MENUITEM, PICTURE and PICTUREBUTTON.)
@dcBitmap      (12)        Sets or gets the bitmap of a PICTURE or PICTUREBUTTON.
@dcTextColor   (13)        Sets or gets the text color of ANY CONTROL (Except CALENDAR, MENUBAR, MENUITEM, PICTURE and PICTUREBUTTON.)
@dcAddItem     (14)        Sets an item in a ITEMBOX,FILELISTBOX,DROPLISTBOX or REPORTVIEW.
@dcRemItem     (15)        Removes an item (using DialogControlSet) from a ITEMBOX,FILELISTBOX,DROPLISTBOX or REPORTVIEW.
@dcGroupDot    (16)        Gets the control with the dot in a RADIOBUTTON group.
@dcPosition    (17)        Sets or Gets a controls origin and size in dialog units for ALL CONTROLS (Except MENUBAR and MENUITEM.)
@dcMenuNames   (18)        Gets the names of menu items of ANY CONTROL.
@dchWnd        (19)        Gets the system windows handle of ANY CONTROL (Except MENUBAR and MENUITEM.)
@dcHeaderText  (20)        Sets or gets the column header text of a REPORTVIEW.
@dcColWidth    (21)        Sets or gets the column width of a REPORTVIEW
@dcAppendCol   (22)        Appends a column (using DialogControlSet) to the right side of a REPORTVIEW
@dcRemoveCol   (23)        Removes a column (using DialogControlSet) from a REPORTVIEW
@dcFind        (24)        Gets all rows with first column text that matches search text. Use on a REPORTVIEW
@dcCancelEdit  (25)        Cancels (using DialogControlSet) a user edit of the text in the first colum of a REPORTVIEW
@dcGetChecked  (26)        Returns all checked rows (using DialogControlGet) of a REPORTVIEW
@dcColFormat   (27)        Sets or gets the column format (0=left, 1=center, 2=right) of a REPORTVIEW


DialogObject Constants
@doAddEvent    (1)         Call dialog callback when the specified COMCONTROL event occurs.
@doRemEvent    (2)         Stop calling dialog callback when a previously requested COMCONTROL event occurs.
@doGetObject   (3)         Return an object references to the specified COMCONTROL control.
@doGetPicture  (4)         Creates and returns an object reference to a picture object.

Dialog Callback Procedure Return Code Constants
@retCancel     (0)         Cancels dialog.
@retDefault    (-1)        Continue with default processing for control.
@retNoExit     (-2)        Do not exit the dialog.

Modified the 'Dialog' function to accept vertical bar (|) delimited style constants instead of numbers in
the control style attributes of dialog templates.  Numbers can still be used to indicate a control's style.

Dialog Editor
Fixed problem that caused hard crash when the editor received a mouse click notification in its window
client area outside of the dialog template and the displayed template has multiple controls selected.

Added the new 'Use Constants' option to the 'Save' property page of the 'Options' dialog. When checked
(the default), Dialog Editor will use vertical bar (|) delimited style constants instead of numbers
in controls style attribute of dialog templates.

WinBatch Studio
Modified Dialog Callback Procedure generator to use the new WIL dialog related constants when creating
the procedure and related documentation. Also changed the callback generator to use WinBatch Studio user
specified tab preferences when formatting lines. Also fixed several minor generator formating problems.

Added new context menu item to the 'Code Block' popup menu item called 'Convert Dialog Callback Constants'.
When selected, the menu item converts all instances of old style dialog constants to the new intrinsic dialog
related constants in the currently viewed document.  It also adds a comment character to the beginning of any
line that assigns a value to one of the known variable based constants.

Keyword Lookup (Shift+{F1}) now synchronizes the help viewer Contents and Index tabs to the targeted keyword on
successful lookups.

Added new 'Find All' button to the 'Find...' menu item's dialog box.  Pressing the 'Find All' button will cause
WinBatch Studio to search for all instances of the supplied search term in the current document. The search
results are displayed in the Find Results tabbed window near the bottom of the WinBatch Studio's application
frame window.  The 'Find All' search can also be started by selecting the new 'Find All' menu item of the
right-click context menu


WinBatch version 2014B

WB 2014B July 30, 2014

DLL 6.14bnb First showing up in WB 2014B

Made several performance related enhancements to the Windows Interface Language parser.

Modified the 64-bit version of the FileMenu to use the 64-bit version of the WIL interpreter instead of the 32-bit
interpreter. This change improves performance and stability on 64-bit versions of Windows.

Fixed a defect in ArrayItemize function that cause it to return an empty item list when the first array element was
an empty string even though the array had additional elements.


The 'FileAppend' function now writes system error information to the wwwbatch.ini file when the function fails for
an otherwise unknown reason.

Modified the setup program to reduce the occurrence of automatic reboots when performing silent installs.
NOTE: This change does not remove the need to manually reboot the system to insure that the installation is completed.

New Functions

IntControl(97,0,0,0,0)
This IntControl frees all resource associated with all Dll Structure handles created by one or more calls to the
'DllStructAlloc' function. All Dll Structure handles are invalid after using this IntControl.
The IntControl returns the number of Dll Structure handles destroyed.

IntControl(98,p1,p2,0,0)
Use this IntControl obtain information about a DLL structure handle.
p1 a valid DLL structure handle returned by a call to the DllStructAlloc function.
p2 determines the type of information returned by the IntControl.
1 = return the size in bytes of a structure represented by the DLL structure handle.
2 = return the memory address of the buffer holding the C-language structure represented by the DLL structure handle.

DllStructAlloc(s:member-descriptor[, i:memory-address])
Create a Dll Structure handle to an entry in the WIL Structure descriptor table.

The returned handle can be used with DllCall or DllCallcdecl when calling an external DLL entry point that
requires the memory address of a C/C++ language style structure as a parameter.  The handle can be used to both pass
information to or retrieve information from the DLL entry point depending on the entry point's implementation.

The member descriptor string parameter must contain the string representation of the C/C++ language structure to create.
Each member of the structure must have both a supported data type specifier and a name.  The data type specifier
can be any data type from the list below.  The member name can be any text excluding tab (@tab), space (" "), colons (:),
or semicolons (;).  Each data type/member pair can be separated by white space or semicolons. The member data types must
be compatible with the documented data types for the DLL structure. Each structure member descriptor must be listed in
the order indicated by the external DLL's documentation or 'header' file.  Use the '[elements]' qualifier to indicate that
a member is an array.  The opening square bracket ([) must immediately follow the name with no intervening white space and
'elements' must be an integer indicating the number elements in the array.

When used, the optional second parameter must be a structure memory address returned by an external DLL entry point.
The function copies the contents of the supplied memory location into memory allocated for the structure described by
the first parameter.  This parameter is only necessary when an entry point returns a memory address to a structure or
has an out parameter that is a pointer to a pointer to a structure.

Use the returned DLL structure handle with DllCall or DllCallcdecl by passing the handle to the external function with
the new 'lpstruct' parameter type specifier. The structure descriptor table shares resources with binary buffers so a
combined maximum of 128 binary buffer and DLL structure handles can be active at one time.

"member-descriptor" Tab or space character delimited list of data type*:name pairs of structure members. Data type and
name must be separated by a colon (:) character.

"memory-address" DLL entry point supplied memory address to a DLL structure.

Note: the function assumes standard Windows 8 byte structure alignment.

*Supported data type string include: atom, byte, bool, boolean, char, colorref, dword, dwordlong, dword_ptr, double,
float, handle, hbitmap, hbrush, hmenu, hcursor, hdesk, hfile, hfont, hglobal, hicon, hiinstance, hkey, hmodule, hmonitor,
hpen, hrgn, hwnd, hresult, int, int_ptr, int64, long, lptr, long_ptr, lparam, long64, lpstr, lpwstr, short, uchar,
unsigned char, ushort, uint, ulong, unsigned long, unsigned int, word, wchar, wparam, wndproc.


DllStructPeek(i:structure-handle, s:member-name)
Retrieves the value of a member of a DLL structure represented by a structure table handle. Usually, call the function
after the structure handle has been passed as a parameter during a DLL entry point call to retrieve data suppled by the
DLL entry point. The structure-handle parameter must be a value returned by the DLLStructAlloc function and the
member-name parameter must be one of the structure member names supplied in the member descriptor string used to
create the handle.

The function returns a string when the member data type is 'lpstr' or 'lpwstr' and an array when array syntax is
used on the member name in the descriptor string.  A string of decimal digits (a huge number) is returned for most
8 byte integer data types and a floating point number is returned for the 'double' and 'float' data types. Most other
data types are represented by an integer return value.

"structure-handle" Dll Structure handle returned by the DllStructAlloc function.

"member-Name" Structure member name from the structure descriptor string used to create the 'structure-handle'
parameter.

DllStructPoke(i:structure-handle, s:member-name, s/i/a:member-value)
Set the value of a member of a DLL structure represented by a structure table handle.
The structure-handle parameter must be a handle supplied by the DllStructAlloc function and the member-name
parameter must be one of the structure member names from member descriptor string used to create the handle.
Call the function before passing a DLL structure to a DLL entry point when the entry point is using a structure
to obtain information from the caller.

The function attempts to convert the member-value parameter to the data type of the member indicated in the
structure descriptor string.  However, the value must be an array for array structure members.

The function returns 1 (@True) on success.

"structure-handle" Dll struct table handle return by the DllStructAlloc function.

"member-Name" Structure member name from the structure descriptor string used to create the 'structure-handle'
parameter.

"member-value" New value of the structure member. Must be an array for member with an array data type qualifier.

DllStructFree(i:structure-handle)
Free all resources associated with a DLL structure handle. The handle is no longer valid after being passed
to this function.

Returns 1 (@True) on success

"structure-handle" Dll struct table handle return by the DllStructAlloc function

New Operators

The Windows Interface Language now supports eleven new compound assignment operators. Compound assignment operator,
like the simple assignment operator, store the value of the second operand in the variable specified by the first
operand. However, they also perform  an arithmetic, shift, concatenation, or bitwise operation prior to storing the
result.  The operation is performed on the existing value of the first operand and the results of the operation is
then stored as the new value of the first operand.

Compound assignment operators with examples, simple assignment equivalents, and descriptions:
<<=           x <<= y        x = x << y     Left Shift with Assignment
>>=           x >>= y        x = x >> y     Right Shift with Assignment
&=            x &= y         x = x & y      Bitwise And with Assignment
|=            x |= y         x = x | y      Bitwise Or with Assignment
^=            x ^= y         x = x ^ y      Bitwise Exclusive Or with Assignment
*=            x *= y         x = x * y      Multiplication with Assignment
/=            x /= y         x = x / y      Division with Assignment
+=            x += y         x = x + y      Addition with Assignment
-=            x -= y         x = x - y      Subtraction with Assignment
:=            x := y         x = x : y      String Concatenation with Assignment
mod=          x mod= y       x = x mod y    Modulo with Assignment


WinBatch Studio

Corrected a problem in the 64-bit WinBatch Studio debugger that could cause the DllLoad, DllCallCdecl, and
DllCall functions to fail unexpectedly.

Fixed several defects that sometimes cause quick help and auto-complete text to be clipped.

WIL Dialog Editor

Changed handling of left mouse button events so that a left button click on a control that is part of a
multiple control selection list will cause the control to be removed from the list.  Previously, left clicking
on a control caused the multiple selection to be cancelled. This change only applies when the control key is
not pressed along with the left mouse button.

Added the 'Select All' menu item to the 'Edit' menu. Selecting this menu item will result in the adding of all
controls to the multiple selection list.

WinBatch version 2014A

WB 2014A January 15, 2014

DLL 6.14ana First showing up in WB 2014A

Modified manifests for all executable files to indicate that Windows 8.1 is a supported OS.

Fixed string memory leak in the ArrayLocate, ArraySearch and ArraySort functions that occurred when these functions were used on arrays
with floating point number element values.

Enabled jump lists for WinBatch Studio and WIL Dialog Editor.

Fixed potential heap corruption problem cause by the ArrayRedim, ArrayInsert, and ArrayRemove functions when
these functions operated on an array passed as a parameter to a user-defined function or subroutines.

Added support for a '/silent' command line option to the 'uninstal' program.  When specified, this option causes the 'uninstal'
program to perform an unattended uninstall of WinBatch or WinBatch+Compiler.

Increased the maximum number of simultaneously loaded extenders from 10 to 32.  The total extender constants and functions is
increased to 750.  Depending on the number of functions and constants defined in each loaded extender, it is still possible to
reach the maximum number of extender functions and constants limit before the 32 extender limit is reached. Also note that
loading a large number of extenders may degrade script performance.

New Function:

ArrayItemize(a:array[,s:delimiter])
Converts a WIL array or variant safearray into a delimited item list. Each array element is converted to its string
representation before being added as an item to the delimited list. Any element that does not have a string
representation or does not have any value is ignored.  This means that it is possible to have fewer items in the
delimited list than elements in the passed in array.  It is also possible to have more items in the delimited list
than elements in the array because an array element may contain an embedded delimiter.  The function's return value
is the delimited list representation of the passed in array.

'array'      array to convert.
'delimiter'  [optional] item list delimiter (defaults to '@Tab'). Must be a single character.

ArrayReverse(a:array[,i:dimension])
Reverses the order of the elements in a WIL array or a variant safearray in place. This function is primarily intended
for use on single dimension arrays but it also accepts multi-dimensional arrays.  When the optional dimension parameter is
used on a multi-dimensional array the reversal process is performed on blocks of elements within the array. The elements
within each block are not reversed relative to each other.  For example, this feature can be used to reverse the perceived
order of the columns in a two dimension array without changing the order of the elements within each column. The function
always returns 1.

'array'      array to reverse.
'dimension'  [optional] array dimension to reverse or zero(0) (defaults to 0.) Valid values are 1 to the number of
dimensions in the passed in array or 0 to reverse the array without regard to dimension.


WinBatch Studio Changes

Added a new "Quick Help" menu item to the "Edit" menu.  The "Quick Help" menu includes two sub-menu items.

The first menu item "Insert parameters" inserts the parameters for function to left of the caret. This menu item takes over the
role previously performed by the "Insert parameters" context menu item.  Like the context menu version the new menu item can be
invoked using the F12. The new menu implementation is more responsive and reliable than the context menu version.

The second menu item "Auto complete" displays a list of WIL and WinBatch functions that match a partially typed word to
the left the insertion caret.  When a listed function name is selected and the Enter key is pressed or a function name is
double-clicked, the partially typed work is replaced with the full function name.  This functionality can also be invoked
using the Alt+Right Arrow key combination.

Added a new "Display syntax sensitive quick help" option to the "File types" tab of the "Options" dialog for "WIL" files.
When this option is checked and the mouse cursor hovers over a WIL or WinBatch function name, the editor displays a popup
window with the function syntax and description. This option also enables the display of a window containing a function
parameters whenever an opening parenthesis is typed immediately after a WIL or WinBatch function.

WinBatch Studio "Find in Files" searches can now be interrupted during the file search. To halt a search relaunch the
"Find in Files" dialog from the Search dropdown menu on the main menu bar and then clicking the "Stop Find" button or
pressing the return key. The "Stop Find" button text will change back to "Find" once the search is halted.

WinBatch version 2013C

WB 2013C Aug 13, 2013

DLL 6.13cmc First showing up in WB 2013C

Fixed string memory leaks in 6.2 WIL Dialogs with a user-defined callback procedures or functions.

Modified the WinBatch 32 bit and 64 bit compilers to workaround a problem that intermittently prevented the compilers
from writing options and version information to compiled script executables on Windows 7.

Modified error handling to reduce the occurrences of the generic CLR "Exception has been thrown..." error in the
"More Error Info" error display by suppling more specific error information when that information is made available
by the error's source object instance.

Fixed memory leak that sometimes occurred when using a 'callback' parameter type with the DllCall function.

WinBatch Studio Changes

Made several general reliability and stability fixes to WinBatch Studio's external tool functionality.

Removed WinBatch Studio's dependence on the Wbml.exe program to start WinBatch scripts as a external process.

Modified WinBatch Studio's Run command to allow WinBatch scripts with the '.wbt_if' file extension to start from the
Run command with medium integrity and restricted access token on Windows 8/8.1/2012. This modification allows the Run
command to duplicate the security level of WIL scripts with the '.wbt_if' file extension when started directly from
the Windows shell on Windows 8/2012 and newer versions of the OS. All other WinBatch registered script file extensions
receive the higher of either the manifest controlled security level associated with the file extension or the current
security level of WinBatch Studio on Windows 8 and newer. This change does not effect Windows 7/2008 R2 and older as
the Run command still duplicates the security level the script would receive when started from the Windows desktop shell.

Fixed a problem that under certain conditions resulted in incorrect WinBatch Studio default registry settings being applied
when installing WinBatch over an existing installation.

WinBatch version 2013B

WB 2013B May 22, 2013

DLL 6.13bmb First showing up in WB 2013B

Modifed the ShellExecute, RunShell, RunEnviron, and RunWithLogon functions
to accept the new constant @NOACTIVATE in the functions' "display mode"
parameter. The @NOACTIVATE value causes the targeted application's window
to be displayed in its most recent size and position but without making the application's
window the active windows when another top-level window is already active.

The ObjectType function will now convert a "NULL" (VT_NULL) variant to a
null "BSTR" (VT_BSTR). "NULL" variants are now also converted to null "BSTR"
variants when assigned to an element of a SafeArrays of type "BSTR".

Added auto-detect ability to safearrays passed as parameters to dotNet class
methods and constructors. This reduces the need to use either the 'ObjectClrType'
function or the colon (:) type indicator on array parameters.

WinBatch Studio

Fixed problem in the WinBatch Studio 64-bit debugger that caused the 'Version'
function to report an empty string instead of the current WinBatch Studio version string.

Modified how the WinBatch Studio 32-bit and 64-bit debuggers load and unload
the Common Language Runtime so that scripts exhibit the same behavior when
executed more than once in the same debugging session.

Fixed a 32-bit and 64-bit debugger problem that caused an intermittent memory
access violation when debugging scripts that load the CLR.

Changed status bar to display a user tool's menu text when the mouse cursor hovers
over the associated user tool button.

Dialog Editor

Fixed problem in Dialog Editor that prevented the menu editor from always
detecting and preserving menu item position changes.

WinBatch version 2013A

WB 2013A Apr 24, 2013

DLL 6.13ama First showing up in WB 2013A

Fixed defect in the 'RegQueryMulSz' function that caused it to not include the
last character of the last item in the returned list of registry values.

Modified the 64-bit version of the 'RegOpenFlags' function to return 2 (64-bit view)
instead of 0 on the first call to the function.

Added the "UNKNOWN" variant type to the 'ObjectType' function. The variant type
parameter value can only be used with the value 0 in the function's second
parameter to create a NULL VT_UNKNOWN variant.

The 'ObjectType' function now converts WIL arrays and binary buffers to
variant safearrays of a specific type. Request conversion by prepending "ARRAY|"
to the variant element type in the first parameter.  The function's second parameter
should contain a WIL array, a Variant safearray or a binary buffer when using the "ARRAY|"
specification. The special type specification "ARRAY|VARIANT" can be used to convert
WIL arrays already containing multiple variant types into a safearrays of type VARIANT.

New Functions

The following three new functions give WinBatch scripts access to the Microsoft .Net Framework.
WinBatch makes this possible by hosting the common language runtime (CLR) and exposing
functionality for creating and accessing the members of classes, structures and enumerations
of managed code assemblies (DLLs) that are part of or based on the Framework.

The WinBatch CLR hosting environment works by wrapping Framework based classes, structures
and enumerations in light weight COM Automation objects to take advantage of the WinBatch
interpreter's existing understanding of COM syntax and semantics. This approach lessens
the challenge of using managed objects in WinBatch script for those already familiar with
COM Automation. However, it is still recommended that you have a basic understanding of
object oriented programming concepts as used by the Framework.  It is also important to
carefully read and understand the documentation for a Framework based type before using
it in a WinBatch script.

WinBatch access to the Framework uses COM but it is not completely dependent on the
Framework's COM interop. This is because the WinBatch directly hosts the CLR.  The
hybrid approach offers significant advantages over a COM interop only implementation.
First, assemblies do not need to be registered in the Windows registry to be accessed.
Second, whole classes, class methods and class properties do not need to be attributed
as COM visible to be accessed through WinBatch. Third, WinBatch CLR hosting is not tied
to a specific Framework Class Library (FCL) or CLR version. WinBatch only requires that
the Framework be installed on the system.

While WinBatch CLR hosting has many advantages, this version has limitations that should
be considered before deciding whether or not to implement a solution using Framework
based assemblies. The following is a partial listing of those limitations:
- Delegates and event callbacks are not supported. (This limits the effectiveness of UI related classes.)
- Generics can only be used when pre-instantiated with appropriate type parameters by another CLR object.
- Remote access to an assembly running in another process is not supported.
- WinBatch scripts cannot be compiled into CLR applications or assemblies.


ObjectClrNew(s:typename [, u/s/i/f/v:ctorparm,...] )
Creates a class, structure or enumeration implemented by a managed assembly. The function returns
a Framework based type as a COM Automation reference that can be used to access the members of the
underlying Framework based type. The assembly implementing the type specified by 'typename' must
be loaded into the WinBatch process before this function can be called to create the type.  The
exceptions to this requirement are types implemented by the "mscorlib" assembly. This assembly
is automatically loaded by WinBatch when the CLR is loaded. All other assemblies must be loaded
into the WinBatch process using the 'ObjectClrOption' function's 'use' option.

"Typename"     The name of a Framework based class, structure or enumeration. The name must be
fully qualified by including the dot (.) separated namespace prefixed to the type's
immediate name.  The namespace name and immediate name must also be separated by a dot
character. Ctorparm, etc. - 0 to 15 constructor parameters to be used when creating a type.
Since type constructors can be overloaded, the type and number of these parameters control
which constructor will be used to create the type.

Members of the returned object reference are call using the same variable-name+dot+member-name syntax
used by standard COM Automation object references. However, there are some important differences between
regular COM calls and CLR type member calls.

The most significant difference is that CLR constructors and type member names can be overloaded. This means
that more than one member can have the same name. When more than one member has the same name, WinBatch
and the CLR determine which member to call based on the number and type of the parameters passed in the call
statement. The combination of member name, parameter types and parameter count is called the member's signature.
This means that using the correct type for each parameter is crucial to calling the correct member.

Both member overloading and the fact that WinBatch cannot query the object for type information before making
a member call as it does with regular COM Automation references means that the colon (:) type qualifier needs
to be used more frequently on CLR object member parameters. Fortunately, WinBatch will take standard variant
type names like BSTR, UI8, BOOLEAN, R8, e.g., and convert them to equivalent Framework types automatically.
It will also automatically deduce the correct Framework type for variant variables passed as parameters to
a member without needing to specify a type with the colon qualifier.  When a Framework based type does not
have equivalent variant type, the fully qualified Framework based type name can be used with colon type
qualifier on a parameter. This is most often necessary when the object member is expecting an up-cast or
down-cast of Framework based class, when it is expecting a value from a Framework based enumeration, or when
it is expecting an array with elements of a specific Framework based type. In the case of arrays, the type
qualifier should be the Framework based type of the elements prefixed to the variable name of a variable that
holds either a WIL array or a variant safearray. No array type information ('ARRAY' or 'System.Array') should
be included in the type qualifier.  When using a Framework type name qualifier with any parameter the type
qualifier's assembly must be loaded before the member with the qualified parameter is called.

Another significant difference between standard COM Automation object and Framework based wrapped objects
is that unlike standard COM Automation objects, Framework based object member names are case sensitive.

The function allows access to most Framework based types and there members but there are a few limitations
and restrictions.  The following is a partial list of those limitations and restrictions:
- WinBatch relies on the CLR hosting's reflection functionality to instantiate classes.  There are a
few classes attributed to block instantiation via reflection.
- WinBatch does not support out parameters.  Method without parameters can still be called but out
parameter values are not modified on the method's return.
- Class member overloads that rely solely on the return type and name for their signature cannot be used.
- Value types (structures) that only provide a multiple parameter constructor(s) cannot be used.
- A small number of type member names conflict with WinBatch identifier naming rules and cannot be called
directly.
- Parameterize properties are not supported.

ObjectClrOption(s:option-name, s:option-value )
Sets CLR configuration options before the CRL is loaded and loads an assembly into the current
WinBatch process. The function returns @True on success.

"Option-name"  Available options are "version", "appbase", or "use".  See below for details.

"Option-value" Can be a CLR version string, file system path, or assembly name depending on the
option-name.

The Option-name parameter values meaning and usage:
"version" Use this option to instruct WinBatch to load a specific version of the CLR. The
option-value parameter string must start with the character "v" followed by the first three
parts of the version number. Currently, Microsoft provides the following CLR versions "v1.0.3705",
"v1.1.4322","v2.0.50727" and "v4.0.30319".  The option must be set before the first call to this
function with the "use" option or before the first call to the 'ObjectClrNew' function.  If the
"version" option is not used before the CLR is loaded, WinBatch will attempt to load the current
system's latest installed version of the CLR.
"appbase"  The option-value parameter for this option is used to indicate the full file system path that
presents the location of assemblies you plan on using in your script that are not installed
into the global assembly cache (GAC) of the system running the script. This option must be set
before the first call to this function setting a "use" option or before the first call to the
'ObjectClrNew' function.
"use"      This option is used to load assemblies into the WinBatch process. Assemblies must be loaded
before the types the assembly implements can be used.  The option-value parameter for the is
option must be a string variable or literal containing an assembly name.  If an assembly is
stored in the GAC, it is generally necessary to use the fully qualified assembly name.  The
fully qualified assembly name has the format "assembly's name, version=x.x.x.x, culture=xxxx,
PublickeyToken=xxxxxxxxxxxxxxxx".  For example, the fully qualified name of the "System.Data"
assembly is "System.Data, version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
Full assembly names can be found by using the Mscorcfg.msc tool, by view the global assembly
cache directory directly, or by using the Gacutil.exe tool.

ObjectClrType(s:typename, u/s/i/f/v:value-reference )
Use this function to either associate a Framework based type name with a value, or to up-cast or
down-cast Framework based object references.  If the second parameter is a simple string, integer,
float, variant that is not a reference to a Framework based object, the returned reference can only
be used as a parameter to a Framework based object method call, as the right-hand side of a Framework
based object property assignment or a constructor argument in a call to 'ObjectClrNew'.  In other
words, the returned reference does not have user callable methods, properties or fields.  On the other
hand, if the second parameter is a reference to a Framework based object and the first parameter is
the typename of a base or derived type of that object then the returned reference can be used to
access the members of either the base or derived type of the input object.

"Typename"        The name of a Framework based class, structure or enumeration. The name must be fully
qualified by including the dot (.) separated namespace prefixed to the type's immediate
name.  The namespace name and immediate name must also be separated by a dot character.

"Value-reference" A value or Framework based object reference to associate with Typename.

If the second parameter does not contain a Framework based object reference, the assembly implementing
typename must be loaded before the return reference is used as a method parameter, property value or
constructor argument. If the second parameter contains a Framework based object reference, the assembly
implementing typename must be loaded before this function is called.

Fixed several problems with the MousePlay function incorrectly locating the mouse cursor on multi-monitor
systems when using a window origin instead of a screen origin. Also fixed problems that caused the function
to use an invalid origin instead of the origin of the restored parent window when the parent windows was
minimized and a child window was specified. These are breaking change that may require changing existing
scripts that use the function.

Modified the legacy WinMacro application to reflect the  multi-monitor fix in the MousePlay function.
This may require rerecording macros that were recorded using mouse coordinates relative to a specific
window instead of to the screen.

Dialog Editor

Changed General property page's control name verifications to prevent case only name changes from
generating a duplicate name error.

Editor no longer clears the undo list when a dialog template is saved.

WinBatch Studio Changes

Fixed Print Preview memory corruption problem in WinBatch Studio.

WinBatch version 2012C

WB 2012C Oct 24, 2012

DLL 6.12clc First showing up in WB 2012C

Minor changes to the WinBatch and WinBatch+Compiler setup program to accommodate
installation of shortcuts to the Windows 8 start screen.

Added workaround for a bug in Windows 8 that prevented the 'WindowOnTop' and
'WinActivate' functions from working properly.

Refreshed the icons for many installation executables.

Made minor improvements to the capture of additional error information generated
by COM server dlls and executables.

Fixed problem caused by specifying a dialog MENUITEM with the DEFAULT keyword
as the MENUITEM's text attribute.

Fixed problem with resizeable dialogs that occasionally caused the dialog to be
resized when restored from the shell taskbar.

Added new 268435456 (Include Header Text) style to dialog REPORTVIEW controls.
When this style is set, the REPORTVIEW control column header text is added as
the first row of the array returned from an item search request, a selected
or checked item request, or a request for all items of the control.  This style
will also cause the control's associated variable to contain the column header
text as the first row of the array referenced by the variable. The style can be
used in a control's dialog template entry and as a parameter to the DialogControlState
function's remove and add style request codes.

WinBatch version 2012B

WB 2012B July 17, 2012

DLL 6.12blb First showing up in WB 2012B

Modified the ObjectCreate function to interpret a blank string in the second parameter to
indicate that the object should be created using the local machine as the object server.

WinBatch is no longer dependent on the msvfw32.dll at run time.  This allows the interpreter
and compiled scripts to execute on Server Core for Windows 2008 installations that do not
have this system dll installed by default. Note that WIL dialog boxes will not be able to
display bitmaps in PICTURE or PICTUREBUTTTON controls, nor will they display dialog background
bitmap on systems without the dll. This change does not affect all other versions of Windows
and Windows Server, including Windows 2008, because these systems have msvfw32.dll installed.

Changed the order of the WinBatch interpreter's shutdown sequence to workaround a thread
deadlock problem in Windows 7 32-bit COM Automation system unloading.

Fixed problem with the file size displayed for files larger than 2GB in overwrite warning
dialogs.

Fixed a problem that could cause a variable containing an array to become corrupted when
the variable was created in a Called script, UDF or UDS that was not exited via a
'Return' statement.

Modified the DllCall and DllCallCdecl functions to also accept ordinal entry points.

Changed the Terminate function to display Unicode strings without conversion to their
ANSI equivalents.

Changes to the Dialog function and related functions:

Added the new REPORTVIEW control.  The Reportview control is a ListView common control with the
'report' Windows style.  It can be used as either a simple grid control when a full featured
grid control is not needed or as an advanced version of the WIL dialog ITEMBOX control.

The REPORTVIEW control supports all dialog template control definition attributes with the
following control specific meanings:

var - The name of a variable that receives an array of user selected rows from the control
on a non-canceling exit from the dialog.  Optionally, the variable can contain an array of
values to display in the control. When the variable is used to populate the control, the
control will have a column for each column in the array.  The array can optionally contain
text for each column heading in the first row of the array. See the style attribute for details.

Note that the array variable contents will only be used to populate the control when the 'text'
control definition attribute is set to 'DEFAULT'.

text -  The 'text' can either be set to 'DEFAULT' or set to the path and file name of
a CSV file used to populate the control. The file must meet the same CSV file requirements
specified for the 'ArrayFileGetCsv' function and the value separator must be a comma(,).
The first line of the file can optionally contain column headings.  See the style attribute
for details.

style - The control supports the invisible(1) and disable(2) styles. In addition the control
accepts the following new styles:

noheader(524288) The header bar is not display across the top of the control.

firstheader(1048576) The first row of the source array or file is treated as column header
text.

gridlines(2097152) The control displays vertical and horizontal lines to form a grid.

singleselect(4194304) Only one row can be selected at a time.

fullrowselect(8388608) Selection highlighting extends to all subitems in the selected row.

sortascending(16777216)  The control is populated with rows ordered from lowest to highest
first column values. Sorts using an "intuitive" sort (See ArraySort for details);  The user
can reorder control rows based on any column's values by clicking on the column header.

sortdescending(33554432) The control is populated with rows ordered from highest to lowest
first column values. Sorts using an "intuitive" sort (See ArraySort for details).  The user
can reorder control rows based on any column's values by clicking on the column header.

Note: if both sortascending and sortdecending are used, sortascending takes precedence.

edititem(67108864) The first column text can be edited in place.

checkbox(134217728) Enables check boxes for each first column item in the control.

Added the following new event codes to the 'DialogProcOptions' function in support of the
new REPORTVIEW control:

REPORTVIEW Item Select(18) User has selected row in the REPORTVIEW control. The text of
the first column  of the selected row is passed to the callback UDF/UDS in the callback's
fifth parameter.

REPORTVIEW Double-Clicked(19) User has used the mouse to double-click a row in the REPORTVIEW
control. The text of the first column of the double-clicked row is passed to the callback
UDF/UDS in the callback's fifth parameter.

REPORTVIEW Checked/Unchecked(20) User has checked or unchecked an item in a REPORTVIEW control
with the 'checkbox' style.  The text of the checked item is passed to the callback UDF/UDS in
the callback's fifth parameter.

REPORTVIEW Edited Item Text(21) User has changed the text of a first column item in a
REPORTVIEW control. The user modified text of the item is passed to the callback UDF/UDS in
the callback's fifth parameter. Note that if more than one first column item of a control
contains the same value, it is possible for the fifth parameter to contain a tab delimited
list of multiple occurrences of the targeted item's text. The number items in the list
indicates which instance of the item is the target of the event.

REPORTVIEW Column Click(22) User has used the mouse to click a column header of a REPORTVIEW
control. The one based column number of the clicked column is passed to the callback UDF/UDS
in the callback's fifth parameter. The event is fired before the indicated column is sorted
so the sort direction can be controlled by setting or changing the sort direction style of the
control during the callback. Sorting is effectively cancelled by removing both sorting related
styles from the control.

Modified the 'DialogControlGet' function to support the new REPORTVIEW control.  The function
also has a new fourth parameter that is sometimes necessary when the request code is used to
query information about a REPORTVIEW control.

Existing 'DialogControlGet' request codes that have different requirements or return different
results when used with the REPORTVIEW control:

1 Returns 1 if the REPORTVIEW control has the checkbox(134217728) style and the indicated
item is checked. The functions optional fourth parameter must be used to indicate the text of
the item to test.

5 Returns a one or two dimension array containing the contents of a REPORTVIEW control.

6 Returns a one or two dimension array containing all selected rows of a REPORTVIEW control.

New request codes added to support the REPORTVIEW control:

20 Returns a tab delimited list of REPORTVIEW column headings.

21 Returns a space delimited list of the width of each REPORTVIEW column in dialog units.

24 Returns a one or two dimension array containing all REPORTVIEW rows which have first
column text matching one of the items specified as a tab delimited list in the functions fourth
parameter.

25 Returns 1 if the next user edit of an item will be canceled upon completion. This request
code only applies to REPORTVIEW controls with the  edititem(67108864) style.

26 Returns a one or two dimension array containing all checked rows of a REPORTVIEW control.
This request code is only relevant when a REPORTVIEW control has the checkbox(134217728) style.

27 Returns a space delimited list of format specification for each REPORTVIEW column. The
returned values have the following meanings:
0 - left justify text
1 - center justify text
2 - right justify text

Request codes 11, 13, 17, 18, 19 also work as expected with the REPORTVIEW control.

Modified the 'DialogControlSet' function to work with the new REPORTVIEW control.

Existing 'DialogControlSet' request codes that have different parameter or return types when
used with the REPORTVIEW control:

1 Checks or unchecks an item in a REPORTVIEW control. Use the function's set-info(fourth)
parameter to indicate the first column text of the row to check or uncheck.  The text can be
a delimited list to indicate which row should be checked or unchecked when multiple rows
have the same first column text.

5 Replaces the contents of the REPORTVIEW control  The function's fourth parameter must
contain either a CSV file path+name, or a one or two dimension array that will be used to
replace the existing contents of the control. Supports variant safe arrays.

6 Toggles the selection state of a row in a REPORTVIEW control. Use the function's
set-info(fourth) parameter to indicate the first column text of the row to select or unselect.
The text can be a delimited list to indicate which row should be selected when multiple rows
have the same first column text. Use an empty string to unselect all selected rows of a
control. Note that the control automatically unselects a selected row when a new row is
selected when the control has the singleselect(4194304) style.

10 Scrolls a REPORTVIEW control row into view. Use the function's set-info(fourth) parameter
to indicate the first column text of the row to scroll to.

14 Adds a row to a REPORTVIEW control.  The functions function's set-info(fourth) parameter
can be an array or delimited list.  If the delimited list lacks enough items or the array
enough columns the remaining columns of the control will be left empty.  If either the list
or array has too many items or columns, the extra text will be ignored. If an array parameter
contains multiple rows, all array rows will be added to the control. Supports variant
safe arrays.

15 Removes a row from a REPORTVIEW control. Use the function's set-info(fourth) parameter
to indicate the first column text of the row to remove.  The text can be a delimited list
to indicate which row to remove when multiple rows have the same first column text.

New request codes added to support the REPORTVIEW control:

20 Changes the column headings text of a REPORTVIEW control. Place a tab delimited list
of the new column headings, one for each column, in the function's set-info(fourth) parameter.

21 Specify a new width in dialog units for each REPORTVIEW column as a space delimited in
the function's set-info(fourth) parameter. Column widths can be set to -1 to cause a column's
width to fit the column contents. -2 can be used to set a column's width to match the column's
header text. Setting the farthest right column to -2 causes that column to fill the remaining
width of the control.

22 Adds a new column to the far right side of a REPORTVIEW control.  Indicate the columns
header text in the functions set-info (fourth) parameter.

23 Remove a column from a REPORTVIEW control.  The function set-info parameter should contain
one based number from left to right of the column to remove.  Note that column 1, the left most
column, cannot be removed from the control.

25 Toggles canceling of a pending or the next edit of a REPORTVIEW control item.  The
set-info parameter should be @True to turn on edit canceling and @False to turn off canceling.
The function returns the previous edit cancel setting.

27 Specify the format for each REPORTVIEW column as a space delimited in the function's
set-info parameter. Valid values and there meanings:
0 - left justify text
1 - center justify text
2 - right justify text

Request codes 11, 13, 17 also work as expected with the REPORTVIEW control.

Note that the above functions apply case insensitive text comparisons when identifying items
in a REPORTVIEW control.

WinBatch version 2012A

WB 2012A Feb 1, 2012

DLL 6.12ala First showing up in WB 2012A

Fixed problem in 'RegQueryEx' function that caused an error when the 'subkey-string'
parameter was a Unicode string and the 'type' parameter was set to 3.

Changed 'ObjectCreate' function's remote server access to error
if it is unable to create the object on the remote system instead of first
attempting to use a local copy of the targeted object.

Fixed problem with "IntControl 73" goto (p1=1) error handling
that caused the script lines following :WBERRORHANDLER goto label to be ignored when
an error occurred in the expression associated with an "ElseIf" or "Case"
statement.

Incorporated workaround for bug in Windows Vista and newer Common Dialogs
that caused the WinBatch "AskFileName" function to return random
characters instead of redisplaying if a user selected to many files
when calling the function with multi-selection flag 2.

Added an optional third parameter to the "AddExtender" function which can be
used to specify a file name for the 64-bit version of an extender. This allows
for the specification of both a 32-bit and 64-bit extender in a single system
architecture independent call to AddExtender. Specify zero(0) for the second
parameter if version checking is not needed and you are using the optional
third parameter.  Note that 64-bit WinBatch still treats the first parameter
as the file name of a 64-bit extender when no third parameter is present.

AddExtender(filename, [version[, filename]])
"Filename"  32-bit or 64-bit WIL extender Dll filename. Must be 32-bit
extender if 3rd parameter is also used
"Version"   [optional] minimum required extender version number
"FileName"  [optional] 64-bit WIL extender Dll filename

Added an optional parameter to both the "ChrHexToUnicode" and "ChrUnicodeToHex"
functions that permits the functions to either convert or create a hex strings
with most significant byte first Unicode (UTF-16) character byte pair order.

ChrHexToUnicode(hex-string[, flag])
"hex-string"  a Unicode string in hex format.
"flag"        [optional] 0 (default), or 1 to reverse the byte order
of each "hex-string" byte pair before converting to a Unicode
character.

ChrUnicodeToHex(Unicode-string [, flag])
"Unicode-string"  a Unicode string
"flag"            [optional] 0 (default), or 1 to reverse the order of each
character byte pair in "Unicode-string" before adding it
to the returned hex string.

Added level 10 to the WinVersion function. Level 10 causes WinVersion to
return 1 when the current native Windows operating system is  32-bit and
2 when the current native Windows operation system is 64-bit. The value
returned is independent of the bitness of the current script's executable.

Modified the "Drop" function to accept a single array element as a parameter.
This permits setting an element of an array to the undefined
state while keeping the array and other elements defined. The function
does not support undefining COM Automation safe array elements.

The "ObjectType" function was modified to no longer accept WIL array
with no elements as the second parameter.

Modified 64-bit DllCall function so that it no longer generates an memory
access violation when an incorrect binary buffer is passed as a C structure
pointer parameters to a called dll entry point on Windows 7 systems.

WIL Dialog Editor Changes:

Corrected problem that could cause an access violation when an dialog template
with an invalid dialog font, text color or background color is loaded from the
clipboard.

Modified menu editor dialog to show the currently selected menu item in high
contrast in the list view control even when the list view control does not
have the input focus.

Setup Program Changes:

No longer starts WinBatch Navigator when the '/silent' command line option is used.

WinBatch Studio Changes:

Increased the number of characters that can be displayed in the 'Find In Files'
window from 64KB to 1MB.

The main WinBatch Studio Windows are now disabled when the array and binary buffer
variable viewing windows are visible to prevent the user from executing script statements
while viewing or editing variable contents. This prevents a potential hard crash.

Changed File related dialogs to use shell file dialog look and feel.

Added a 64-bit debugger to allow scripts to be tested and debugged in a native 64-bit
process using WinBatch Studio's debugger command. A menu option and tool bar button
allow toggling between 64-bit and 32-bit debugger modes.

Made numerous minor fixes to improve overall performance and reliability.

WinBatch version 2011B

WB 2011B Sep 09, 2011

DLL 6.11bkb First showing up in WB 2011B

WinBatch and the WinBatch+Compiler are now available with native 64-bit (x64) executables.
The x64 version of WinBatch or WinBatch+Compiler are available for installation whenever
32-bit WinBatch or WinBatch+Compiler is installed onto a 64-bit system. Native 64-bit
WinBatch and WinBatch+Compiler are not available for installation on 32-bit only or 64-bit
systems without the WoW64 (Windows 32-bit On Windows 64-bit) subsystem.  However, scripts
compiled with the WinBatch 64-bit compiler can be executed on x64 systems without WoW64
installed. 64-bit WinBatch is not intended for use on Itanium (IA-64) based systems and
compiled WinBatch scripts cannot be executed as a native Itanium program.

Changed implementation of the 'SvcWaitForCmd' native service function's logoff notification
handling (SERVICE_CONTROL_LOGOFF return value) so that it now works reliably on Windows XP
and newer.

Compiled WinBatch script running as a native service can now receive startup parameters from
the 'wntSvcStart' Network Extender function or from the Services.msc management console applet.
This is in addition to command  line parameters already recieved via the Windows registry.

The following additional control codes are now accepted by  the 'SvcSetAccept' function:
1. SERVICE_ACCEPT_HARDWAREPROFILECHANGE (32) - the computer's hardware profile has changed.
2. SERVICE_ACCEPT_POWEREVENT (64) - computer's power status has changed.
3. SERVICE_ACCEPT_SESSIONCHANGE(128) - computer's session status has changed (requires XP/2003 or newer.)
4. SERVICE_ACCEPT_PRESHUTDOWN(256) - computer is about to shutdown (requires Vista/2008 or newer.)

The 'SvcWaitForCmd' function returns the following new values for the cooresponding new
'SvcSetAccept' control codes:
1. SERVICE_CONTROL_HARDWAREPROFILECHANGE (12) - the computer's hardware profile has changed.
2. SERVICE_CONTROL_POWEREVENT (13) - power status has changed.
3. SERVICE_CONTROL_SESSIONCHANGE (14) - session status has changed (requires XP/2003 or newer.)
4. SERVICE_CONTROL_PRESHUTDOWN (15) - the system will be shutting down (requires Vista/2008 or newer.)

Modified IntControl 1007 to improve responsiveness to mouse clicks on the notification area icon.

Fixed problem that sometimes caused the directory parameter of AskFileName to be ignored.

Modified ArraySearch to continue searching past undefined array elements rather than halt the
search when an undefined element is encountered.

The ArrayToStr function now errors if passed a multi-dimension array.

Added support for the new 'callback' parameter type to the DllCall or DllCallcdec functions. This
parameter type should be used for external DLL function parameters that accept pointers to
application-defined callback functions.  The 'callback' type can only be used in conjunction
with the callback handle supplied by the 'DllCallbackCreate' function. See the documentation for
the new 'DllCallbackCreate' function for details.

Added support for VT_I8 ("I8") and VT_UI8 ("UI8")  variants to the 'ObjectType' and
'BinaryAllocArray' functions.

Added support for "I8" and  "UI8" parameter type specifications to COM object
method call parsing.

Updated WIL extender SDK with new 'addons.h' file for 64-bit extenders.

Fixed intermittent problem with the WindowsInfo.exe utility that prevented it
from starting.

Modified the 'ShortcutDir' function to support "Known Folder Id" GUIDs on Windows
Vista/2008 and newer versions of Windows.

Fixed slow initial Explorer file context menu display problem caused by FileMenu on
32-bit Windows Vista and newer versions of 32-bit Microsoft Windows.

Fixed FileInfoToArray issue were the total file size returned was zero. It will
now return an integer or (if the value is greater than max signed integer)
a floating point value.

New Functions

ItemLocateWild(pattern, list, delimiter, start)
Searches 'list' for first item that fully matches 'pattern' and returns the position
of the matching item or 0 if no item fully matches. The search starts with the item
indicated by the 'start' parameter. When an item satisfies the pattern, checking
of that item is halted. If the pattern is satisfied without consuming the entire
item, it is not considered a match and checking continues with the next item.

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

ItemLocateWild searches are case insensitive.

"pattern"       the pattern to search for. May contain wildcards.
"list"          a string containing a list of items.
"delimiter"     a character to act as a delimiter between items in the list.
"start"         position of first item to search.

DllCallbackCreate(UDF-name, return-type, parameter-types)
Associates a user defined function or subroutine with a callback handle.
The returned handle can be used with DllCall or DllCallcdecl when calling
external DLL functions that require a pointer to an application-defined callback
function as a parameter. The UDF/UDS associated with the handle is executed
when the external DLL function calls the application-defined function.

The associated UDF/UDS must have the same number of parameters that the external
DLL function expects for the application-defined callback.  The parameter types and
return type specified in the second and third parameters must be compatible with the
documented types for the application-defined callback function.

Use the callback handle with DllCall or DllCallcdecl by passing the handle to
the external function with the new 'callback' parameter type specifier. A maximum
of 512 callback handles can be active at one time.

"UDF-name"        name of previously defined user defined function or subroutine.
"return-type"     Expected return data type. WORD, LONG, VOID, or DOUBLE
"parameter-types" Space delimited list of the expected types of each parameter
for the application-defined function. Each type must be
either WORD, LONG, LPSTR, LPNULL, DOUBLE, or LPWSTR.

DllCallbackDestroy(handle)
Releases all resources associated with callback handle created by the
'DllCallbackCreate'function.  After destroying the handle, it cannot be used
as a parameter to the 'DllCall' or 'DllCallcdecl' functions.  The
DllCallbackDestroy function cannot be called from a UDF or UDS while it
is executing as an application-defined callback for an external function.

"handle"    Callback handle returned by the DllCallbackCreate function.

IntControl(96,0,0,0,0)
This IntControl frees all resources associated with all callback handles created
by the 'DllCallbackCreate' function. No previously defined callback handles
can be used after a call to this IntControl. It cannot be used by a user defined
function or subroutine while the function or subroutine is executing an
application-defined callback for an external function.

The IntControl returns the number of callback handles destroyed.

64-bit WinBatch only

WinMetrics(-3) now returns 5 when 64-bit WinBatch is executing the function on an
Intel64/AMD64 system.

IntControl 92 has no effect when a script is run by native 64-bit WinBatch or
as a compiled native 64-bit executable.

WinBatch version 2010D [Beta Only]



WinBatch version 2011A

WB 2011A January 19, 2011

DLL 6.11aka First showing up in WB 2011A


Fixed problem in Dialog Editor's 'Attribute' property sheet that caused error messages
to be displayed even though no error existed.

Fixed problem in the BoxDataClear function when used with error suppression that could
cause the WinBatch Studio debugger to hang.

Fixed memory leak caused by the 'ArrayRedim' function when a re-dimensioned array was
later dropped using either the 'Drop' or 'DropWild' function.

Added support for the new Vista/Windows 7 style shell file dialogs to the 'AskFileName'
function. The new dialog style can be invoked by adding 100 to the values passed in the
function's 'flag' parameter.  Each of the four values 100, 101, 102 and 103 otherwise
have the same effect as the corresponding 0, 1, 2, and 3 values. If one of the 100-plus
values is used on a system running a version of Windows predating Vista/2008, the added
100 is ignored and the function reverts to the older common file dialog style.

ArrayFileGet and ArrayFileGetCsv now attempt to report the line number of the first
invalid line encountered as "More Error Information".

Made a minor performance improvement to the 'ArraySort' function.

Made minor change to the search order used by WinBatch tools and compiled WinBatch
scripts when attempting to locate the WIL interpreter. This change addresses a protential
security issue describe in Microsoft Security Advisory No. 2269637.

Added the compile script executable's name to the "DLL File not found in path." error
message box's title.

Added workaround in the dialog COM Automation event handler implementation to process
invalid event parameter data supplied by a COM object or control. This workaround
prevents some "Invalid Argument" COM errors during event callbacks to a user defined
function.

Fixed problem that caused all dialog check boxes with a value greater than or equal to
32768 to be selected when a common check box variable contained the value of single
check box greater than or equal to 32768.

Fixed problem that could cause a memory access violation when a COM Automation
object is destroyed inside the object's event handler UDS while also accessing a
member of the same object outside the event handler UDS. This problem did not
effect event handler UDFs.

New Functions

ArraySearch( array, value[, options[, search-column[, start-sub[, end-sub]]]])
Searches a one or two dimension array for an element that matches a value. Returns the
index of the found element of a single dimension array, the index of the row containing
the found element of two dimension array , or -1 if the value is not found. The function
can optionally search using a fast binary search but the array must first be sorted on

"search-column' using the "ArraySort" function.

"array"         array to search.

"value"         value to find in "array".

"options"       0 to match case (the default),
1 to do a fast search on a sorted "search-column",
2 to search ignoring case, or
3 to do a fast search and ignore case.

"search-column" subscript of column to search for two-dimensional arrays.
The default is 0.

"start-sub"     subscript of first element or row to include in search.
The default is 0.

"end-sub"       subscript of last element or row to include in search.
The default is ArrInfo(array,1)-1.

ArrayInsert( array, sub[, dim [,value]] )
Performs in-place insertion of an element into a single dimension array, or the in-place
insertion of a row or column into a two dimension array.  Returns @True on successful
completion.

"array"   insert an element, row, or column into this array.

"sub"     subscript of the element to insirt into single dimension array.
Subscript of the row or column to insert into a two dimension array.

"dim"     must be 1 or omitted for single dimension arrays. Must be either 1
to insert an array row or 2 to insert an array column into a two
dimension array.

"value"   initial value of inserted element(s).

WinBatch Studio Changes

Corrected debug window problem that sometimes caused a memory access violation when
viewing the contents of a zero dimension array after viewing the contents of a
multi-dimension array.

Corrected problem that under certain conditions could cause corruption
of the PATH environment variable used by scripts started with the
WinBatch Studio 'Run' command.

WinBatch version 2010C

WB 2010C July 29, 2010

DLL 6.10cjc First showing up in WB 2010C

Fixed a problem in the ArrayLocate and ArraySort functions that under certain conditions
could cause a memory leak in the WinBatch string table.

WinBatch version 2010B

WB 2010B July 28, 2010

DLL 6.10bjb First showing up in WB 2010B

New functions:

ArrayRedim ( array, sub1, [sub2, [sub3, [sub4, [sub5]]] )
Changes array dimensions in-place while preserving existing content when possible.

"array" array to re-dimension
"sub1" to "sub5" specifies the new "array" dimensions or -1 to keep existing dimensions.

The default for "sub2" through "sub5" is 0 which deletes the existing dimension.
Once an array dimension is set to 0, all subsequent array dimensions must be
set to 0 or omitted.  -1 can also be used  for subsequent dimensions if current
corresponding dimension is already 0.

Returns @True on successful completion.

ArrayRemove(a:array,i:sub, [i:dim])
Performs in-place removal of an element from a single dimension array, or
the in-place removal of a row or column from a two dimension array.

"array" remove an element, row, or column from this array.
"sub" subscript of the element to remove in single dimension array. Subscript of the
row or column to remove in a two dimension array.
"dim" must be 1 or omitted for one dimension arrays. Must be either 1 to delete an
array row or 2 to delete an array column from a two dimension array.

Returns @True on successful completion.

Changed ArraySort to return 1 instead of 0 on successful completion.

Fixed problem that caused the contents of the wberrorarray variable to be destroyed
when the variable was passed as a parameter to a function.

Change behavior of BinaryBufInfo request -1 to return @false and not generate an
error when passed a freed binary buffer.

Fixed problem with ShortcutInfo that prevented the return of the shortcut's target
file when both the shortcut and target are on a remote machine.

Changed IntControl 31 to enumerate only 64-bit Explorer windows on X64 versions
of Windows.

DiskScan request 64 no longer causes an error when checking a virtual drive letter
created with the SUBST command.

Added manifest settings, code signature status and elevation level to the debug
trace file's system status information section.

The 'Debug' dialog displayed by the Debug function now displays the contents of
variables by truncating any text that would otherwise extend beyond the dialog's
boarders. Previously, the dialog some times did not display any text when the
variable's text was to long to fit within the dialog.


FileMenu Shell Extension

The WinBatch FileMenu shell extension now works with 64-bit Explorer on X64 versions
of Windows and is no longer dependant on the 32-bit Explorer on 64-bit systems.

Changes to the Dialog function and related functions

Add two new dialog template variables <dlg-variable>MinWidth and <dlg-variable>MinHeight
that can be used to indicate the approximate minimum width and height of the dialog
window that can be set by dragging the dialog's boarders. The values are assumed
to be in dialog units and to not include the height of the title and menu bars. When
either of these variables is present in a dialog template, the dialog becomes re-sizable
by either directly dragging the dialog's boarder or by using the 'Size' system menu.

Added new DialogProcOptions request code 17 that causes a call to a dialog's
user-defined-callback procedure when the dialog is resized, maximized, or restored from
maximized to normal size.

When the user-defined-callback is called with the resize request, the fifth parameter
to the user-defined-callback procedure contains a space delimited
list who's items represent the delta (change) in width and height of the dialog in dialog
units and can be either negative or positive numbers and the actual dialog width and height
in dialog units. The dialog height and width represent the internally maintained size of
the dialog's client area.  The client are is the area of a window used to display controls
and its size does not include the dialog window's borders, menu bar, nor title bar.
The data returned by the user-defined-callback is in this format:
{delta_width} {delta_height} {actual_width} actual_height}

The dialog template must use the <dlg-variable>MinWidth and/or
<dlg-variable>MinHeight variables in order to use DialogProcOptions option 17.
The DialogProcOptions function will error, if this request code is used with a dialog
template that does not contain at least one of these variables.

The Dialog Editor now disables the "Run Dialog" menu item and button when a dialog
contains a FILELISTBOX but no Cancel button (a button with the value attribute of zero.)

Fixed problem on Windows Vista and 7 that caused a the dialog to be too small when
the  dialog was created with a resize borders.

Added request-code #1007 to the DialogProcOptions function.  This request-code returns the
internally maintained width and height of the dialog's client area in dialog-units as a space
delimited list. The returned client area dimensions are the dialog's size not including the width
and height of  borders, the height of the menu bar, nor the height of the title bar. The third
parameter to DialogProcOptions must be set to -1 when using this request code.

WinBatch version 2010A

WB 2010A January 27, 2010

DLL 6.10aja First showing up in WB 2010A

New functions:

ArrayFromStr(string)
Accepts a text string and returns a one dimension array with one string
character per array element.

ArrayToStr(array)
Accepts a single dimension array and returns a text string constructed from the
concatenation the array's elements.

ArraySort(array,[options,[sort-column,[start-sub,[end-sub]]]])
Performs an in-place sort of arrays with one or two dimensions.

"array"       array to sort.

"options"     @ASCENDING for an ascending sort (the default) or
@DESCENDING for a descending sort.

"sort-column" subscript of column to sort on for two-dimensional arrays.
The default is 0.

"start-sub"   subscript of first row to include in sort. Default is 0.

"end-sub"     subscript of last row to include in sort. Default is ArrInfo(array,1)-1

ArrayLocate(array,value,[sub1, [sub2, [sub3, [sub4, [sub5]]]]])
Searches for an array an element that matches a value.

Returns a single dimensioned array that with one element per dimension of the
searched array. Each element of the returned array holds one subscript of the
element with the value when found and -1 if the value is not found.

"array"      array to search

"value"      value to search for in "array"

"sub1-sub5"  specifies the subscripts of the first element to search
in the array. The default for each parameter is 0.

Added new 'elseif' conditonal statement for use in conjunction with the structured
'if', 'else' and 'endif' syntax.  Like the 'if' the 'elseif' evaluates the expression
following it and the expression must evaluate to an integer.  But unlike the 'if'
statement the 'elseif' statement is only evaluated if a preceding 'if' or 'elseif'
statement has evaluated to zero (@False).  When an 'elseif' statement evaluates to
a non zero value (@TRUE), the series of statements after the 'elseif' statement up
to the next matching 'elsif','else' or 'endif' are executed. Once an 'if' or 'elseif'
statement in a if...elseif...else...endif syntax group evalutes to a non zero value (@TRUE),
no other 'elseif' statements in the group are evaluated. The 'elseif' statement cannot
be used with standalone 'if' and 'else' statements.

Fixed problem that caused a memory access violation when converting a variable
containing COM object references to a floating point number.

Fixed memory leak in WinBatch Studio.

Fixed WinBatch Studio's variable content display window so that it no longer
displays extraneous contents under certain conditions.

Changed WinBatch Studio so that for most installations previously defined user tools are
not lost when upgrading from a pre 2009C version of WinBatch. (Tool bar buttons may
still need to be re-added.)

Increase the 'DllCall' and 'DllCallCdecl' entry point parameter limits from 15 to 20.

Fixed problem in WinBatch Studio hints on Windows 7.

Fixes WinBatch Studio stack corruption problem that would occasionally cause a crash.


Changes to the Dialog function and related functions:

Changed EDITBOX and SPINNER controls so they can be drawn on top of other
dialog controls while still drawing correctly on Windows 7.

Added DialogProcOptions event-option-code 16 which causes a user-defined callback
procedure to receive an event notification when a dropdown menu, submenu, or context
menus is about to be displayed.  The name of the menu hosting control or menu item
is passed to the user-defined callback as the value of its third parameter.

Added DialogControlGet request-code 18 which accepts the name of a regular control,
menu item or the menu bar and returns a list of the names of MENUITEMs directly
associated with the named control or menu item.

DialogProcOptions now errors if an attempt is made to use 6.2 format dialog only
event-option-code with a 6.1 or older dialog format.

Added DialogControlGet request-code 19 which accepts the name of a regular control
and returns a window handle. The request cannot be used on MENUITEM and MENUBAR
controls because these controls are not windows.

WinBatch version 2009C

WB 2009C  Oct 21, 2009

DLL 6.09cic First showing up in WB 2009C

Added "Compatibility" section to application manifests for Windows 7 support.

Added surrounding quotes to the WinBatch Studio tools command line for the WIL
Dialog Editor and the WinBatch Compiler.

Added Dialog Editor, WinBatch Compiler, and Type Viewer buttons to WinBatch
Studio main tool bar and removed them as user tools.

Fixed WinBatch Studio problem that caused the Status Bar time display to be
off by one hour around DST changes.

Fixed WinBatch Studio install problem that caused the registry update failure
with some low privilege Vista user accounts.

Added WinBatch Studio detection of read-only file status changes to allow or
prevent editing of files after outside program adds or removes read-only status
from a file open in the work space.

Fixed RunWithLogon function problem that caused the dot "." to not work properly
as the domain parameter when using cached domain credentials.

Fixed error in ArrInitialize function that caused UDF variable table corruption
when a UDF is passed a persistent pointer to an array.

Fixed problem in the ItemSort function that caused an extra delimiter to be
added to return lists that contained ony delimiters.

Added test and error for a negative offset parameter to the BinaryEodSet function.

Fixed memory handle management issue that on rare occasions caused the unexpected
termination of the WinBatch and WinBatch Studio.

Setup doesn't install Filemenu.exe on Win7 64-bit, because 32 bit Windows explorer
no longer available on this platform.

Dialog function modified to work on Win7 64-bit.

Changed IntControl 31 request 1 to return 64-bit Explorer window ID's on Windows 7 64-bit.

Added request 10  to the MouseInfo function. Similar to request 0 except it also
returns the window name of static, hidden and disabled child windows that have
a caption. Examples of static windows include WIL Dialog VARYTEXT, STATICTEXT
and PICTURE controls.

Changes to the Dialog function and related functions:

Fixed bug in WIL Dialog SPINNER control that allow the control to accept out of
numeric range or character data.

Added two new "control" types, MENUBAR and MENUITEM. The two new types provide
support for menus in WIL dialogs.  Adding a MENUBAR to a dialog template causes a
menu bar to  be displayed at the top of a dialog's client area.  MENUITEMs can be
associated with the dialog's menu bar, another MENUITEM as a sub menu or a
control or the dialog as a context menu.

Added two new styles for the DialogControlState request #3 that are applicable
to MENUITEMs. Style 32768 causes the MENUITEM to display a check to the left of
the control. Style 65536 is used to display a dot graphic to the left of the
menu item.

Added DialogProcOptions event-option-code 15 to indicate that a user-defined
callback procedure should accept MENUITEM commands.

Increased the maximum number of controls per WIL dialog from 200 to 300.

Fixed problem that caused parts of a CALENDAR control to remain visible when
the control's style was changed to invisible while process a CALENDAR date selection
notification in the callback.

WIL Dialog Editor Changes:

Add Menu Editor to support MENUBAR and MENUITEM controls.

Add F10 hotkey to the Run Dialog menu item.

WinBatch version 2009B

WB 2009B  Feb 02, 2009

DLL 6.09bib  First showing up in WB 2009B

Fixed problem in TimeDelay function that caused the function to sometimes
hang in dialog user-defined-callback procedures.

Fixed problem in several registry functions that could cause a memory access
violation.

Fixed problem in the UacManifestSettings function that prevented it from reading
internal manifests correctly.

WIL Dialog Editor Changes:

Removed duplicate control names warning message that sometime appeared
when saving 6.1 dialog templates with Dialog Editor.

Fixed problem in Dialog Editor that prevented control text that contained extended
ANSI characters from being used properly when creating control names.

WinBatch version 2009A

WB 2009A January 12, 2009

DLL 6.09aia  First showing up in WB 2009A

The registry functions will now call a Unicode version of the function on
Windows NT/2000/XP/2003/Vista/2008 systems.

Changes to the Dialog function and related functions:

Added DialogProcOptions request-code 1004. Accepts a dialog control number
as the third parameter and returns the name of the control associated with the
number.

Added DialogProcOptions request-code 1005. Accepts a dialog control name as
the third parameter and returns the control number associated with the name.

WinBatch version 2008E

WB 2008E November 12, 2008

DLL 6.08ehe  First showing up in WB 2008E

Floating point COM VARIANTs (ObjectType types 'R4' and 'R8') now use
standard WinBatch decimal conversion rules when displayed as text. The
display rules do not affect the actual value of the VARIANT variable.

Changed the RegOpenFlags function to accept the parameter values 32 and 64.
These values supersede the old values 1 and 2 and set the registry view to either
32-bit or 64-bit respectively. Using the new values on 64-bit Windows causes all
registry function that accept subkey string paths to error, if a subkey contains the
string 'wow6432node'.

Changed registry functions to accept an optional parameter the controls which registry
view the function uses when accessing the Windows registry. The optional parameter's
values can be 32 to use the 32-bit view, 64 to use the 64-bit view, or 0 to use the view
indicated by the last call to the RegOpenFlags.The parameter value of 0 can also causes
a  function to use the WinBatch default 64-bit view, if no call to RegOpenFlags has been
made and setting the parameter to 0 is equivalent to omitting the parameter entirely.
Using the 32 or 64 values cause these functions to error if a function's subkey parameter
contains the string 'wow6432node'. Setting the parameter to one of the valid values
has no effect when running on 32-bit Windows. This change applies to the following
functions:

RegCreateKey
RegExistKey
RegDeleteKey
RegDelValue
RegExistValue
RegOpenKey
RegOpenKeyEx
RegEntryType
RegSetBin
RegSetExpsz
RegSetQword
RegSetValue
RegSetMulsz
RegSetEx
RegQueryBin
RegQueryExpsz
RegQueryQword
RegQueryStr
RegQueryValue
RegQueryDword
RegQueryMulsz
RegQueryEx
RegQueryItem
RegQueryKeyLastWriteTime

The following two functions have been modified to accept the 32 and 64 view values
as values for their existing optional parameter. The new values can be use to combine
with the previously existing values by using the 'OR' (|) operator:

RegSetDword
RegQueryDword

The following function has been modified to accept the three view values 0, 32 and
64 in it's previously reserved fourth parameter:

RegOpenKeyEx


Changes to the Dialog function and related functions:

New 6.2 dialog adds a required 'Name' attribute to control definition strings. The new
attribute is passed as the third parameter to user-defined-callback procedures and must be
used as the second parameter to the DialogControlSet, DialogControlGet,DialogControlState,
and DialogObject functions. Note: 6.1 style dialogs are still fully supported.

DialogControlState now returns the control name of the control with the input focus and
an empty string when using request-code 5 and no control has the input focus. (Applies to
dialogs with 6.2 or later format only)

The User Defined Dialog Callback function now receives a control name instead of control
number in the third parameneter. (Applies to dialogs with 6.2 or later format only)

The function DialogControlSet, DialogControlGet, DialogControlState, and DialogObject now
take a control name instead of a control number as their second parameter. (Applies to
dialogs with 6.2 or later format only)

Added new request 17 to DialogControlGet/Set. Retrieves/sets the size and location of a
control within a dialog's client area.

WIL Dialog Editor Changes:

Added 'Convert' menu item and tool bar button to WIL Dialog Editor that converts the current
dialog template from the 6.1 to the 6.2 dialog format. (Any user-defined-callback procedure
associated with a converted dialog must still be modified to be used with the new format.)

Added an input for the 'Name' control attribute to the Dialog Editor's General page of the
Control Attribute property sheet.

WIL Dialog Editor no longer runs on Microsoft Windows operating systems earlier than
Windows 2000.

Miscellaneous minor fixes and improvements to WIL Dialog Editor.

Changed the virtual to screen coordinates conversion technique in MouseMove
and MousePlay to better match the technique used in other WIL functions.

Change WinMacro's script generator to match the new coordinates conversion now used
by MousePlay.

Added new optional string parameter to the RegConnect function. Use optional parameter
to indicate the processor acrhitecture or 'bitness' used by the remote operating system.
Set the optional parameter to the string "RemoteOS32", if the remote computer is running
a 32-bit version of Windows and the computer running the script is using a 64-bit version
of Windows. Set the optional parameter to "RemoteOS64", if the remote computer is
running a 64-bit version of Windows and the computer running the script is using 32-bit
version of Windows. If the remote computer and the computer running the script are using
the same bitness, do not supply a value for this parameter.

Modified the TimeDelay function to no longer be sensitive to changes to the system time
settings when a positive time value is used.


The dialog changes require changes to the DialogProcOptions help file topic.

WinBatch version 2008D


WB 2008D July 18, 2008

DLL 6.08dhd  First showing up in WB 2008D

Fix to allow a compiled script to pass MS Logo certification as tested by
MS Application Verifier.

WinBatch version 2008C

WB 2008C  May 13, 2008

DLL 6.08chc  First showing up in WB 2008C

Modified imbedded manifests to handle high resolution monitors (DPI aware).

WIL Type Viewer

Added environment variable expansion to type library paths displayed in the
Type Library List page for Vista.

Added a "Previous" button to the Object Tree search dialog.

Added a "Cancel" button to the Object Tree repeat search message dialog.

Fixed occasional memory corruption problem caused by switching tabs after
using tree control search dialog.

Added check for and removal of quotes surrounding type library full file
names before attempting to find and open the library file.

Added ability to sort by any column of either the type library and programmic
identifier lists.

Made searches on the Programmic Identifier List page circular.

Miscellaneous usability and stability improvements.

WinBatch version 2008B

WB 2008B  Feb 29, 2008

DLL 6.08bhb  First showing up in WB 2008B
Fixed Winsock Extender dll unload issue when debugging in WinBatch Studio causing future Winsock
AddExtender statments to fail.

Documentation updates. New COM help file with lots of example code.

WinBatch version 2008A

WB 2008A Jan 30, 2008

DLL 6.08aha  First showing up in WB 2008A

Added request 64 to the DiskScan function. This request causes the function to return a list
of all USB bus disk drives. (Windows 2000 and later only)

Added test to LogDisk, DiskFree, DiskSize, DiskInfo, DiskVolInfo to prevent system error 13
dialogs from appearing when the functions attempt to access drives that the DiskScan
function lists but have actually been removed or do not contain media.

Fixed memory leak that occurred during certain string coercion processing.

Fixed corrupted string return issue in IntControl 77 option 72.

Changed WIL DLL version strings scheme.

WinBatch version 2007E

WB 2007E  Nov 27, 2007

DLL 5.15dep  First showing up in WB 2007E

Manifested versions of various WinBatch tools (WinBatch and WinBatch Studio).

Menu files updated to use ShellExecute rather than Run. This allows Vista to
prompt the user for elevation, if necessary.

Debugtrace now logs COM and Dialog Callback Events.

Fixed a problem with ChrStringtoHex and ChrUnicodetoHex crashing when passed
high order characters.

Fixed problem with DebugTrace accessing dangling COM object references.

Fixed problem that incorrectly allowed assignment to COM object properties
in the 'if' line of a structured 'if' statement block.

Fixed daylight saving time problem with IntControl 58.

Added Unicode support to Arrayize.

Fixed problem with DebugTrace accessing dangling COM object references.

Fixed problem that incorrectly allowed assignment to COM object properties in the 'if' line of   a structured 'if' statement block.

The following functions now return and accept Unicode strings directory pathnames without   conversion to MBCS on Windows NT/2000/XP/2003/Vista:

DirAttrGet
DirAttrGetEx
DirAttrSet
DirAttrSetEx
DirChange
DirExist
DirGet
DirHome
DirMake
DirRemove
DirRename
DirSize
DirWindows

WinBatch version 2007D

WB 2007D  Aug 28, 2007

DLL 5.14den  First showing up in WB 2007D

Fixed a problem with AppExist always returning @TRUE if 2 was specified
for "flags".  Also, note that for AppExist and AppWaitClose, if 2 is
specified for "flags", then the function returns a result immediately
regardless of the "retries" parameter.

Added a new request # to DiskScan:

Request   Returns
-------   -------
32     list of remembered (persistent) but currently non-connected drives.

DiskScan(0) no longer returns drives that are remembered (persistent) but
not currently connected.  These are now returned by DiskScan(32).

Fixed a problem that could occur when using comparison operators on
strings containing integer values larger than 2147483647.

RegLoadHive no longer returns a "file not found" error if "filename" is
relative to a remote computer where "handle" is connected from.

Fixed a problem with StrFixBytesL, StrFixCharsL, and StrFixLeft, when
"pad-string" specified more than one character.

Changed IntControl(59) and IntControl(60) to use SendMessageTimeout
instead of SendMessage.

PopMenu and FileMenu 2007D  First showing up in WB 2007D

Changes made to PopMenu and FileMenu to fix the Error 1932: Winexec
Function Failed [ The requested operation requires elevation ] on Windows
Vista.  Changed Run statements to ShellExecute in menu files.

WinBatch version 2007C

WB 2007C  Apr 26, 2007
DLL 5.14cen  First showing up in WB 2007C

New functions:

FileDigest(u:filename, s:algorithm, i:format)
Computes a message digest (hash) for a file.

"filename" specifies the file to hash.

"algorithm" specifies the hash algorithm to use, and can be one of
the following:

MD2
MD5
SHA
SHA1

Note that "SHA" and "SHA1" are the same.

"format" specifies the format of the returned string.

If "format" is 0, the message digest is returned as an unformatted
sequence of hex characters, with each byte in the digest
represented by two hex characters in the returned string.  For
example:

00112233445566778899AABBCCDDEEFF          (MD2/MD5  = 16 bytes)
00112233445566778899AABBCCDDEEFF00112233  (SHA/SHA1 = 20 bytes)

If "format" is 1, then hyphens (for MD2 and MD5) or spaces (for
SHA and SHA1) are inserted after every 8 characters in the
returned string.  For example:

00112233-44556677-8899AABB-CCDDEEFF           (MD2/MD5  = 16 bytes)
00112233 44556677 8899AABB CCDDEEFF 00112233  (SHA/SHA1 = 20 bytes)

UacElevationLevel() (Windows Vista only)
Gets the current UAC elevation level.

Return value is one of the following levels:

Level  Meaning
-----  -------
0    Error, or unsupported platform.
1    Process is default (UAC is disabled, or standard user).
2    Process is running elevated.
3    Process is not running elevated (user is in Administrators group).

UacExePromptTest(u:program-name) (Windows Vista only)
Determines whether a program would require a UAC elevation prompt.

"program-name" specifies the EXE to be run.

Return value is one of the following:

Value  Meaning
-----  -------
-1    running program would return an error
0    program would not require elevation
1    program would require elevation

UacManifestSettings(i:request)
Gets information on manifest and signature.

This function retrieves information about the currently running program.

Request  Meaning
-------  -------
0     Manifest present? (@TRUE or @FALSE)
1     Manifest requested execution level (string)
2     Manifest uiAccess (string)
3     Does file have a valid signature? (@TRUE or @FALSE)

Fixed a problem using the ':' string concatenation operator in an OLE
property assignment.

RegOpenFlags now returns the previous flag value.

ArrInitialize now supports a Unicode "value".

*****ALERT: Breaking Change - from versions 2007A/B only *****
Changed StrInsert to treat the optional "start" parameter as the position in "base-string" BEFORE which "new-string" is to be inserted, instead of after which. Therefore, to insert at the very beginning of "base-string", you would specify a "start" value of 1, and 1 is now the default value if the "start" parameter is not specified. Fixed problem with the MousePlay function not recognizing secondary monitors when they are logically above or to the left of the primary monitor on multi-monitor systems. Fixed a problem with MouseMove not handling negative coordinates properly. Added an optional parameter to FileOpen: FileOpen(filename, mode [, i:Unicode [, i:timeout]]) The "timeout" option specifies the number of seconds to spend retrying the file open operation if it fails due to a sharing violation. The default is 0, for no retry. If "timeout" is 1 to 20, the operation will be retried 20 times, evenly-spaced over the specified time period. If "timeout" is greater than 20, the operation will be retried once every second for the specified time period. If "timeout" is -1, the operation will be retried once every second with no timeout. If the file can be opened before the specified time period has elapsed, FileOpen will return successfully, otherwise it will fail. Fixed a problem with input not being re-enabled for a Terminate command (if it had been disabled with IgnoreInput). Fixed a problem with the Run[..] commands crashing if there was a registry key under "App Paths" that matched the name of the program being run, but whose "(Default)" value didn't match the path of the program being run. Changed the RegSet[..] functions to open the registry key with KEY_SET_VALUE access instead of KEY_WRITE access, if "subkey-string" was specified. Also made a similar change to AskColor and AskFont. Changes to the Dialog function and related functions: Added Security Icon Shield (Vista Only) style (8192) to PUSHBUTTON and PICTUREBUTTON controls. Fixed problem with DialogControlGet returning zero (0) instead of an empty string ("") for single selection ITEMBOX and FILELISTBOX controls without a user selection. WIL Type Viewer First showing up in WB 2007C Fixed bug that sometimes caused property parameters to not be shown in the "Syntax:" section of the "Selected member detail" window. The viewer now displays the names of properties and methods that have been flagged as hidden by the type information's author. Text has been added to the "Selected member detail" window to indicate that a member is flagged as hidden.

WinBatch version 2007B


WinBatch version 2007B

WB 2007B  Feb 26, 2007	   (Includes 2007A in this section)


For the Box functions which take a "coordinates" parameter, the maximum
length of each coordinate has been increased from 5 to 6 characters.

Compiler modified to insert Vista UAC manifest information into the EXE.
Options available in the compiler "Settings" dialog to specify the
"requested execution level" and "user interface access" flags for the
compiled EXE.

Compiler modified to optionally codesign "Authenticode" the compiled EXE
with a purchased code signing certificate.


DLL 5.13bem  First showing up in WB 2007B

New functions:

ArraySwapElements(array, subA1, subA2, subA3, subA4, subA5, subB1, subB2, subB3, subB4, subB5)
Swaps elements in an array.

This function swaps the values of two elements in an array.

"subA1" to "subA5" specify the subscripts of element "A"
"subB1" to "subB5" specify the subscripts of element "B"

Specify "0" for unused dimensions.  For example, to identify the
array element "arr[1,5]", subA1 is 1 and subA2 is 5.

Returns 1.

PtrGlobalTest(var)
Tests whether a variable has been marked as being globally accessible.

"var" specifies a variable name.

Returns @TRUE or @FALSE.

StrInsert(u:base-string, u:new-string, [u:pad-string [, i:start [, i:length]]]) (Windows NT/2000/XP/2003/Vista only)
Inserts a new string into an existing string.

"base-string" specifies the existing string.

"new-string" specifies the string to be inserted into "base-string".

"pad-string" specifies a character or string to be used for padding,
if necessary.  The default is a space (' ').

"start" specifies the position in "base-string" after which
"new-string" is to be inserted, where the position of the first
character of the string is 1.  To insert at the very beginning of
"base-string", specify a value of 0.  You can specify -1 to
insert after the end of "base-string".  If "start" is past the end
of "base-string", padding will be inserted between the end of
"base-string" and the beginning of "new-string".  The default is 0.

"length" specifies the number of characters to insert.  If "length"
is shorter than the length of "new-string", "new-string" will be
truncated.  If "length" is longer than the length of "new-string",
padding will be inserted after the end of "new-string".  The default
is the length of "new-string".

Returns the modified string.

StrOverlay(u:base-string, u:new-string, [u:pad-string [, i:start [, i:length]]]) (Windows NT/2000/XP/2003/Vista only)
Overlays a new string onto an existing string.

"base-string" specifies the existing string.

"new-string" specifies the string to be overlaid onto "base-string".

"pad-string" specifies a character or string to be used for padding,
if necessary.  The default is a space (' ').

"start" specifies the position in "base-string" at which "new-string"
is to be overlaid, where the position of the first character of the
string is 1.  You can specify -1 to overlay after the end of
"base-string".  If "start" is past the end of "base-string", padding
will be inserted between the end of "base-string" and the beginning
of "new-string".  The default is 1.

"length" specifies the number of characters to overlay.  If "length"
is shorter than the length of "new-string", "new-string" will be
truncated.  If "length" is longer than the length of "new-string",
padding will be overlaid after the end of "new-string".  The default
is the length of "new-string".

Returns the modified string.

New IntControls:

IntControl(93, p1, p2, p3, 0)
Performs certificate operations.

p1   Meaning
--   -------
0   Sign a file (Windows XP/Vista only)
p2 specifies a tab-delimited string with the following five parameters:
file to sign
certificate friendly name
description of file being signed (can be "" if not needed)
location (URL) of information about file (can be "" if not needed)
URL of timestamp server (can be "" if not needed)

1   Get the thumbprint of a certificate in a file
p2 specifies a .CER or .SPC file

2   Set the friendly name of a certificate
p2 specifies the thumbprint of a certificate
p3 specifies the friendly name to set

IntControl(94, i:filehandle, 0, 0, 0)
Returns the real file handle corresponding to a WIL file handle.

Returns a Windows file handle, or 0 if "filehandle" is invalid.

Changed the optional parameters in AppExist and AppWaitClose:

AppExist(s:program-name [, i:flags [, i:retries]])
AppWaitClose(s:program-name [, i:flags [, i:retries]])

The old "current-session-only" parameter has been expanded to a "flags"
parameter, which is a bitmask of values that may be combined using the
bitwise OR ('|') operator.  The following values may be specified:

Value  Meaning
-----  -------
1    current-session-only (same meaning as before)
2    "program-name" specifies a process ID instead of a program name

By default, AppExist and AppWaitClose retry up to 7 times (with a
half-second delay between tries) before returning, if the specified
application doesn't exist.  You can override this by specifying a
different value for "retries", which may be >= 0 (0 = no retries).

Added a parameter to IntControl(31):
IntControl (31, p1, 0, 0, 0)
p1  Meaning
--  -------
0  enumerate Explorer windows of class ExploreWClass
1  enumerate 32-bit Explorer windows of class CabinetWClass

Changed the method ShortcutDir uses, for better compatability.  It now
uses an API call instead of a registry lookup.  If the new method fails,
it will fall back to use the old method.  The "source" parameter is no
longer used.

FileGet and FileRead now use the code page set by ChrSetCodePage for
Unicode conversion of file contents, instead of the ANSI code page.

WWWBATCH.INI is now placed in the [Application Data]\WinBatch\Settings
directory, instead of in the Windows directory.

Note that IntControl(31) only enumerates 32-bit Explorer windows.

Display and Pause will now call a Unicode version of the function in
Windows NT/2000/XP/2003/Vista if "title" or "text" is a Unicode string.

Fixed a problem with FileInfoToArray and DirInfoToArray returning negative
numbers for file sizes between 2GB and 4GB, when "flag" 2 was specified.

ExeTypeInfo now returns 20 for 64-bit Windows EXE's (Windows NT/2000/XP/2003/Vista only).

Changes to OLE support:

Fixed problem that occasionally caused an error message to display when
a COMCONTROL fired an event before its dialog's dialog callback finished
processing the previous event.

WinBatch version 2006D

WB 2006D  Oct 16, 2006    (Limited Release)



DLL 5.12del  First showing up in WB 2006D

New functions:

StrTypeInfo(value, i:flag)
Gets character-type information for a string, or information for a character-type.

If "flag" = 0 or 1, "value" specifies a string of 1 or more characters.
For each character in the string, a character-type is determined.  The
character-type is comprised of one or more of the following values,
combined using the bitwise OR ('|') operator:

Value  Name        Meaning
-----  ----        -------
1   C1_UPPER    Uppercase
2   C1_LOWER    Lowercase
4   C1_DIGIT    Decimal digits
8   C1_SPACE    Space characters
16   C1_PUNCT    Punctuation
32   C1_CNTRL    Control characters
64   C1_BLANK    Blank characters
128   C1_XDIGIT   Hexadecimal digits
256   C1_ALPHA    Any linguistic character: alphabetical, syllabary, or ideographic
512   C1_DEFINED  A defined character (not used in Windows 95/98/ME)

If "flag" = 0, the function returns a value comprised of the
character-types of all the characters in the string, combined using
the bitwise AND ('&') operator.

If "flag" = 1, the function returns a value comprised of the
character-types of all the characters in the string, combined using
the bitwise OR ('|') operator.

If "flag" = -1, "value" specifies a character-type, and the function
returns a string describing the bits that make up the character-type.
The string is comprised of a space-delimited list of words, with one
word describing each bit contained within the character-type:

Value  Name        Word in string
-----  ----        --------------
1   C1_UPPER    "Upper"
2   C1_LOWER    "Lower"
4   C1_DIGIT    "Digit"
8   C1_SPACE    "Space"
16   C1_PUNCT    "Punct"
32   C1_CNTRL    "Cntrl"
64   C1_BLANK    "Blank"
128   C1_XDIGIT   "HexDg"
256   C1_ALPHA    "Alpha"
512   C1_DEFINED  "Undef" if the C1_DEFINED bit is NOT set (not used in Windows 95/98/ME)

String parameters and return values are ANSI in Windows 95/98/ME, and
Unicode in Windows NT/2000/XP/2003/Vista.

ChrHexToString(s:hex-string)
Converts a hex string to a string.

"hex-string" specifies a string in hex format, with two
hex bytes per character (eg, "48656C6C6F").

Returns a string.

ChrStringToHex(s:string)
Converts a string to a hex string.

"String" specifies a string.

Returns a hex string, with two hex bytes per character.

New IntControl:

IntControl(92, s:operation, i:value, 0, 0) (64-bit Windows only)
Disable file system redirection.

This IntControl disables or reverts file system redirection when
running in WOW64 (32-bit emulation under 64-bit Windows).

"operation" may be either "Disable" or "Revert".

If "operation" is "Disable", file system redirection is disabled,
and the function returns a value that should be specified on a
subsequent "Revert" operation.  "Value" should be set to 0.

If "operation" is "Revert", file system redirection is reverted to
the state specified by "value", which should be the result of a
previous "Disable" operation.  Returns a non-zero value on success.

Returns a value as specified above, or -1 on error.

New ':' string concatenation operator concatenates two strings (or
values which can be converted to strings).  For example:

Message("Windows version", WinVersion(1) : "." : WinVersion(0))

When prepending the path specified in the registry under "App Paths" when
launching a program, the registry value is no longer limited to 260
characters.

The return value of a cancel/error handler UDF is now treated as a bitmask
of values which may be combined using the bitwise OR ('|') operator.  The
following values may be specified:

Value  Meaning
-----  -------
1    Don't reset the handler mode to 0 when the UDF returns.
2    Treat this error event as unhandled, and do normal error processing.

Revised DebugTrace.  The new syntax is:

DebugTrace(i:request [, s/i:param [, s/i:param2]])
Controls and customizes the WIL debugging trace logs.

Request   Meaning                                     Param
-------   -------                                     -----
-1     Just return previous trace mode             (Ignored)
0     Turn trace off                              (Ignored)
1     Turn trace on                               Filename, or "" to use the previously-specified filename
10     Turn trace on and delete file               Filename, or "" to use the previously-specified filename
22     Continue prev trace mode in a UDF or Call   (Ignored)
100     Specify output filename                     Filename
101     Specify output filename and delete file     Filename
102     Dump variable table on error                @TRUE or @FALSE (default)
103     Dump debug data on keyword lookup           @TRUE or @FALSE (default)
104     Suppress statement timestamps               @TRUE or @FALSE (default)
200     Reset trace mode and flags                  New log file name, or "" to clear filename
203     Write a string to the log file              String
204     Write a string surrounded by "$"            String
205     Dump function tables now                    (Ignored)
206     Dump variable table now                     (Ignored)
207     Dump structure stack info now               (Ignored)
208     Dump system info now                        (Ignored)
277     Dump internal info now                      "" for summary, or specific request (w/optional "param2") (see IntControl 77)

For requests which take a file name, if "Filename" is "*DEBUGDATA*"
then debug output will be written to the system debugger using the
OutputDebugString Windows API (see WIL DebugData function).

Returns previous trace mode (@ON or @OFF).

IntControl(71) has been superseded by DebugTrace (old p1 = new request: 1 = 205, 2 = 103, 3 = 206).

Fixed a problem with AskDirectory when selecting a shortcut to a folder
in Windows 2000/XP/2003.

Fixed a problem with "#include" directives inside a called script not
searching the path for the specified file.

Fixed a memory leak when passing a variable as a parameter to a function
or UDF using the address ('&') or pointer ('*') operator.

Fixed a problem with FileInfoToArray and DirInfoToArray, where "flag" 2
was specified, and "file-list" (or "dir-list") contained an invalid file
(or directory) name or mask.

Fixed a problem with arrays sometimes not getting freed on variable reassignment.

Changes to the Dialog function and related functions:

Dialogs support the display of UNICODE text on Windows NT/2000/XP/Vista.
Dialogs still convert UNICODE to ANSI on Windows 96/98/Me.

DialogControlSet/Get functions modified to pass UNICODE text directly
between Windows NT/2000/XP/Vista dialogs and functions.

Dialog control variable handling modified to pass UNICODE text directly
between Windows NT/2000/XP/Vista dialogs and variables.

Fixed problem with the old default button's thick border not being
removed when DialogControlState is used to change a dialog's default
button.

Changes to OLE support:

Allow use of the colon(:) without a type name in type specification for
COM object method parameters.  This permits the use of the string
concatenation operator in actual parameter expressions.

Fixed a rarely occurring problem caused by calling ObjectEventRemove
inside a UDF event handler for the event being removed.

Changed handling of Windows message reflection to COMCONTROL controls
after the final release of the COM control host object.

Turned on support for the undocumented "return" property of "EventInfo"
object.  The "EventInfo" object is the fourth parameter of a user
defined dialog callback UDF/UDS.  The property allows passing the
equivalent of a function return value to a COMCONTROL after the control
fires an event.

Added better support for several required COM container interfaces to
make COM control support conform to published standards.  Appears to
have no noticeable effect on control or dialog behavior.

COM controls are now supported as UNICODE windows on Windows
NT/2000/XP/Vista systems.

WinBatch version 2006E

WB 2006E  Nov 27, 2006
Completed conversion of *.hlp to *.chm files for compatibility
with Vista.  Various modifications in support of the CHM files.

DLL 5.12eel  First showing up in WB 2006E
Fixed a problem with PtrPersistent when "value" was an expression.

Fixed a problem with Unicode text not being displayed properly in the
following functions:

AskFileText
AskItemList
AskLine
AskPassword
AskTextBox

Fixed a problem with the Unicode version of AskPassword not returning a
Unicode string.

WinBatch version 2006C

WB 2006C  Jun 1, 2006

Fixed a problem with the compiler creating invalid EXE's if certain types
of custom icons were used, in Windows NT/2000/XP/2003.

DLL 5.12cel  First showing up in WB 2006C
Fixed a small memory leak when calling a function with an optional
string parameter.

Added a new mode to IntControl(91):

p1   Meaning
--   -------
2   Only match long version of file names, using alternate method
(PathMatchSpec API).

RegQueryItem no longer returns blank items in the list.

Added new requests to IntControl(77):

Request  Meaning
-------  -------
72    LF-delimited list of tab-delimited structure stack information
110    number of DDE conversations open
111    number of DDE conversations available

For IntControl(81/82), you can now specify -1 for "p1", in which case it
will set the seed to a random value.

For DebugTrace, you can now specify a "mode" of 3 or 4, in which case
"filename" specifies a string to be written to the debug log file if
DebugTrace mode is already @ON.  Mode 4 writes the string surrounded by
a series of "$" signs.

Fixed another problem with doing an Exit within a cancel/error handler UDF.

Fixed a problem with IconExtract, IconInfo, and IconReplace possibly
crashing on an EXE containing invalid resource entries.

IconInfo no longer returns an error if the file is invalid.

Changes to the Dialog function and related functions:

Fixed problem with WIL dialogs sometimes not handling key stroke events
associated with COMCONTROL controls.

Changes to OLE support:

Fixed problem handling variants that are a NULL reference to an object
reference.

WinBatch version 2006B

WB 2006B  Mar 31, 2006
DLL 5.10bej  First showing up in WB 2006B

New functions:

ComputerNameGet(i:format)
Gets the name associated with the local computer.

In Windows 95/98/ME, "format" must be 0.  In Windows NT/2000/XP/2003,
"format" can be one of the following values:

Value   Meaning
-----   -------
0    The NetBIOS name of the local computer.

100    The NetBIOS name of the local computer.  If the local
computer is a node in a cluster, returns the NetBIOS name of
the cluster virtual server.

101    The DNS host name of the local computer.  If the local
computer is a node in a cluster, returns the DNS host name
of the cluster virtual server.

102    The name of the DNS domain assigned to the local computer.
If the local computer is a node in a cluster, returns the
DNS domain name of the cluster virtual server.

103    The fully qualified DNS name that uniquely identifies the
local computer.  This name is a combination of the DNS host
name and the DNS domain name, using the form
HostName.DomainName.  If the local computer is a node in a
cluster, returns the fully qualified DNS name of the cluster
virtual server.

104    The NetBIOS name of the local computer. If the local
computer is a node in a cluster, returns the NetBIOS name of
the local computer, not the name of the cluster virtual
server.

105    The DNS host name of the local computer.  If the local
computer is a node in a cluster, returns the DNS host name
of the local computer, not the name of the cluster virtual
server.

106    The name of the DNS domain assigned to the local computer.
If the local computer is a node in a cluster, returns the
DNS domain name of the local computer, not the name of the
cluster virtual server.

107    The fully qualified DNS name that uniquely identifies the
computer.  If the local computer is a node in a cluster,
returns the fully qualified DNS name of the local computer,
not the name of the cluster virtual server.  The fully
qualified DNS name is a combination of the DNS host name and
the DNS domain name, using the form HostName.DomainName.

Returns an ANSI string in Windows 95/98/ME, and a Unicode string in
Windows NT/2000/XP/2003.

ComputerNameSet(s/u:new-computername, i:format)
Sets the name for the local computer.

In Windows 95/98/ME, "format" must be 0.  In Windows NT/2000/XP/2003,
"format" can be one of the following values:

Value   Meaning
-----   -------
0    In Windows 95/98/ME, sets the NetBIOS name.  In Windows
NT/2000/XP/2003, same as 105 (below).

104    Sets the NetBIOS name.  The name cannot exceed 15 characters.

Warning: Using this option to set the NetBIOS name breaks
the convention of interdependent NetBIOS and DNS names.
Applications that use the DnsHostnameToComputerName function
to derive the NetBIOS name from the first label of the DNS
name will fail if this convention is broken.

105    Sets the NetBIOS and the Computer Name (the first label of
the full DNS name).  If the name exceeds 15 characters, the
NetBIOS name is truncated to 15 characters.

106    Sets the primary DNS suffix of the computer.

Changes do not take effect until the computer is restarted.

This function replaces IntControl(76).

DataCast(value, i:mode)
Converts or casts a value from one data type to another.

"value" specifies the value to be converted or cast.

"mode" species the operation to perform:

Mode   Meaning
----   -------
0    Cast single-precision floating point to double-precision floating point

"value" specifies a single-precision (32-bit) floating
point value, represented as a WIL long value containing
the same bit sequence as the float value.

Returns a WIL floating point value (64-bit).

1    Cast double-precision floating point to single-precision floating point

"value" specifies a WIL floating point value (64-bit).

Returns a single-precision (32-bit) floating point value,
represented as a WIL long value containing the same bit
sequence as the float value.

Casting a value involves changing it from one data type to another,
and may involve a loss of precision depending on the type of cast.

ErrorEvent(i:severity, i:error-code, s:error-message)
Causes a user-defined error.

This function replaces IntControl(79).

SendMessageA(s/i:window, i:message-id, i:wParam, s:lParam)
Issues a Windows "SendMessage", with lParam as an ANSI string.

"window" specifies either a window ID or a window handle.

This function replaces IntControl(22).

SendMessageW(s/i:window, i:message-id, i:wParam, u:lParam) (Windows NT/2000/XP/2003 only)
Issues a Windows "SendMessage", with lParam as a Unicode string.

"window" specifies either a window ID or a window handle.

This function is like SendMessageA, except "lParam" specifies a Unicode
string, and a Unicode version of "SendMessage" is called.

TerminateApp(s/u:winname/apppname, i:name-type, i:flags)
Terminates an application.

"winname/apppname" specifies a window name or application name,
depending on the value of "name-type"

name-type   winname/apppname
---------   ----------------
0       full or partial windowname of a WinBatch program window
1       full or partial windowname of a DOS program window
2       full or partial windowname of a Windows program window
3       application file name of a Windows program

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

Value   Meaning
-----   -------
1     "current-session-only" flag (valid only if "name-type" == 3).
If this flag is specified, and the script is running in a
Terminal Services environment, then the specified application
will only match if it is running in the same session as the
script.  Otherwise, the specified application will match
regardless of what session it is running in.

This function replaces IntControl(47), IntControl(48), and IntControl(56).

WindowOnTop(s/u:partial-winname, i:mode)
Keep window on top.

This function replaces IntControl(54).

WinWaitReady(s/u:partial-winname, i:timeout)
Waits until an application is waiting for user input.

This function replaces IntControl(36).

"Execute" statement now handles extender errors.

Fixed a problem with AskFileText displaying a blank file listing.

The following functions now receive Unicode "window-name" parameters in
Windows NT/2000/XP/2003:

DllHinst
DllHwnd
WinActivate
WinActiveChild
WinClose
WinCloseNot
WinExeName
WinExist
WinExistChild
WinHide
WinIconize
WinIdGet
WinIsDOS
WinItemChild
WinItemizeEx
WinPlace
WinPlaceChild
WinPlaceGet
WinPlaceSet
WinPosition
WinPositionChild
WinShow
WinState
WinTitle
WinWaitChild
WinWaitClose
WinWaitExist
WinZoom

The following functions now return Unicode strings in Windows NT/2000/XP/2003:

FindWindow
WinGetActive
WinItemChild
WinItemize
WinItemizeEx
WinItemNameId
WinItemProcId
WinName

Fixed problem with Unicode ITEMBOX controls in version 5.0 dialogs.

Added an optional parameter to IconReplace (and IntControl(37)):

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

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

Value   Meaning
-----   -------
1     delete un-replaced icon images in the target icon group
(32-bit EXE's only) (Windows NT/2000/XP/2003 only)

For example, if the target icon group in the EXE has 6 icon
images, and the specified .ICO file has only one icon image,
if you specify this flag then the one matching icon image in
the EXE will be replaced and the other 5 will be deleted.

Fixed a problem with RegQueryValue (and possibly other RegQuery[..] functions)
returning erroneous data if the registry value was NULL (0 bytes long).

Added an optional "format" parameter to WinResources:

WinResources (request# [, i:format])
This controls the format in which the value is returned if it is too large
to be returned as an integer.  The default format, 0, is floating point.
If you specify "format" of 1, the value will be returned as a huge number.

Added new request # to WinResources:
Req#	Return value
----  ------------
17   number of bytes of unreserved and uncommitted memory in the extended
portion of the virtual address space of the calling process
(Windows 2000/XP/2003/Vista only).

WinResources now supports return values larger than 2 gigabytes in
Windows 2000/XP/2003/Vista.

Fixed a problem with arrays getting freed after a syntax error in a
function call, before any error handler would be called.

DllCall and DllCallCdecl now support 'lpwstr' (Unicode string) as a return
type and parameter type.

Changes to the Dialog function and related functions:

Fixed problem with dialog background not updating properly when a
PICTURE control bitmap was removed with the DialogControlSet function
request-code 12.

Changes to OLE support:

Fixed minor memory leak that occurred when creating a COMCONTROL from a URL.

Add Work-around for problem in WebBrowser control that sometimes causes
WIL dialogs that use the control to hang on exit.

Fixed variable scope problem that occurred when attempting to handle a
COMCONTROL event for a dialog with a template defined in a UDF.

Removed restriction on handling COM events in dialogs launched from COM
event handlers.

WinBatch version 2006A


WB 2006A  Feb 7, 2006


DLL 5.10aej  First showing up in WB 2006A

New Functions:

StrFixBytes(s:base-string, s:pad-string, i:length)
Pads or truncates a string to a fixed length using bytes.

This replaces the previous "StrFix" function.

"length" specifies the length in bytes.

If either "base-string" or "pad-string" is a Unicode string, then
"length" must be an even number (each character is two bytes).

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

This replaces the previous "StrFixLeft" function.

"length" specifies the length in bytes.

If either "base-string" or "pad-string" is a Unicode string, then
"length" must be an even number (each character is two bytes).

Fixed a problem when using an extender constant (or an extender function
missing parentheses) on the left side of a '&' operator.

StrFix now works based on characters instead of bytes, and is identical to
StrFixChars.  New function "StrFixBytes" can be used to specify the length
in bytes.

StrFixLeft now works based on characters instead of bytes, and is
identical to StrFixCharsL.  New function "StrFixBytesL" can be used to
specify the length in bytes.

The following functions will now call a Unicode version of the function if
any of the string parameters are Unicode strings, in which case if the
return value is a string it will be a Unicode string:

StrCmp
StrFill
StrFix
StrFixChars
StrFixCharsL
StrFixLeft
StriCmp
StrIndex
StrReplace
StrScan
StrSub
StrTrim

The following functions will now call a Unicode version of the function in
Windows NT/2000/XP/2003 if any of the string parameters are Unicode strings,
in which case if the return value is a string it will be a Unicode string:

StrClean
StrCnt
StrIndexNc
StrIndexWild
StrLenWild
StrLower
StrSubWild
StrUpper

The following functions will now call a Unicode version of the function in
Windows NT/2000/XP/2003:

AskDirectory
AskFileName
AskFileText
AskItemList
AskPassword
AskTextBox
AskYesNo

Improved the performance of Arrayize.

Improved the performance of StrCat.

Fixed a problem with doing an Exit within a cancel/error handler UDF.

Added an optional parameter to WinItemizeEx:

WinItemizeEx(partial-winname, multiple, hidden [, i:return-type])

"return-type" specifies the format in which the list of windows will
be returned, and can be one of the following:

Type    Meaning
----  -------
0   Tab-delimited list of window titles (default)
1   Tab-delimited list of window ID's
2   List of window titles and their corresponding window ID's,
in the form: "window1-name|window1-ID|window2-name|window2-ID|..."

Note that the "return-type" values are numbered differently than in
WinItemProcID.

Fixed a problem with crashing on startup.

Changes to the Dialog function and related functions:

Added new request code to DialogControlState function.  Request code 6
positions the mouse cursor over an indicated control.

Modified DialogControlState request-code=remove style(4),
style=invisible(1) to work with more COMCONTROL controls.

Changes to OLE support:

Fixed divide by zero fault caused when loading type information for a
very unusual COM server with only old style property type information
and no method type information.

Modified COM hosting to support undocumented ambient property call made
by OWC pivot tables.  Necessary to make pivot tables user modifiable.

Fixed a small memory leak that occurred when an object reference was
passes as a parameter to an object method or assigned to an object
property.

Fixed resource leak that occurred when the DialogObject function was
used to create a picture object.

Modified DialogControlState request-code=remove style(4),
style=invisible(1) to work with more COMCONTROL controls.

WinBatch version 2005G

WB 2005G  Dec 7, 2005
DLL 5.9gei  First showing up in WB 2005G

RegOpenFlags no longer has any effect on 32-bit platforms.

Changes to OLE support:

Fixed problem that caused the unused fifth parameter of a dialog
user-defined callback procedure to not always be instantiated during a
COM event callback.

WinBatch version 2005F

WB 2005F  Dec 6, 2005
DLL 5.9fei  First showing up in WB 2005F
Fixed formatting errors in the WinBatch/hlp file.

PipeClientSendRecvData was returning a blank string ("") instead of
"*TIMER*" if no data was placed in the pipe before "read-timeout" elapsed.

Changes to the Dialog function and related functions:

PICTURE controls now displays dialog background color when the specified
bitmap file cannot be found.

Changes to OLE support:

Fixed problem with error reporting when a COM event source passes an
invalid VARIANT as a parameter.

Added handling of non-standard event parameter types that the regular
Windows APIs cannot process.

Fixed rarely occurring memory leak caused by COM method parameters with
more than one level of indirection.

WinBatch version 2005E

WB 2005E  Nov 28, 2005
New function:

ExtractAttachedFile(s:source-name, s:target-name/request) (compiled version only)
Extracts or lists embedded files in a compiled large EXE.

To extract an embedded file:

"source-name" specifies the name of the embedded file.  This must
not contain any path information.  The embedded file may be the
WIL DLL, an extender DLL, or an "other file".

"target-name/request" specifies the name of the output file that
will be written.  This may contain path information.

Returns 1.

To list embedded files:

"source-name" must be a blank string ("").

"target-name/request" specifies the type of embedded files to list:

Request   Meaning
-------   -------
0      WIL DLL
1      Extender DLL's
2      "Other files"

Returns a tab-delimited list of embedded file names, which do not
contain any path information.

Added an option to the compiler to skip auto-extraction of extenders and
"other files" from large EXE's.  The WIL DLL is always extracted from a
large EXE, if necessary.

Command-line parameters (param1, param2, etc.) may now be Unicode.

IntControl(1006) now returns a Unicode string.

DLL 5.9eei  First showing up in WB 2005E
New Functions:

BinaryPeekStrW(i:handle, i:offset, i:maxsize [, i:reverse-bytes])
Extracts a Unicode string from a binary buffer.

This function is like BinaryPeekStr, except that the return value is
a Unicode string.  The end of the string is reached when a Unicode
NULL character is found.

"maxsize" specifies the maximum number of *bytes* in the string, and
must be an even number.

If "reverse-bytes" is @TRUE, the bytes in each Unicode character are
reversed from the normal byte order.

BinaryPokeStrW(i:handle, i:offset, u:Unicode-string [, i:reverse-bytes])
Writes a Unicode string into a binary buffer.

This function is like BinaryPokeStr, except that it writes a
Unicode string.  Each character in "Unicode-string" requires 2 bytes
in the buffer.  The return value is the number of bytes written.

If "reverse-bytes" is @TRUE, the bytes in each Unicode character are
reversed from the normal byte order.

ChrGetCodePage(i:request)
Gets the current code page.
"request" specifies the code page to be returned:
Request   Meaning
-------   -------
0      WIL code page being used for Unicode conversions
1      ANSI code page associated with the default system locale
2      ANSI code page associated with the default user locale
Returns the requested code page.

ChrSetCodePage(i:code-page)
Sets the current WIL code page.
"code-page" specifies a valid available code page, or one of the
following system default code pages:

Value   Meaning
-----   -------
0   ANSI code page
1   OEM code page
2   Macintosh code page
3   The current thread's ANSI code page (Windows 2000/XP)
42   Symbol code page (Windows 2000/XP)
65000   Translate using UTF-7 (Windows 98/ME/NT4/2000/XP/2003)
65001   Translate using UTF-8 (Windows 98/ME/NT4/2000/XP/2003)
Returns the previous WIL code page.

ChrHexToUnicode(s:hex-string)
Converts a hex string to a Unicode string.
"hex-string" specifies a Unicode string in hex format, with four
hex bytes per Unicode character (eg, "480065006C006C006F00").
Returns a Unicode string.

ChrStringToUnicode(s:string)
Converts an ANSI string to a Unicode string.
"string" specifies a string.
Returns a Unicode string.

ChrUnicodeToHex(u:Unicode-string)
Converts a Unicode string to a hex string.
"Unicode-string" specifies a Unicode string.
Returns a hex string, with four hex bytes per Unicode character.

ChrUnicodeToString(u:Unicode-string)
Converts a Unicode string to an ANSI string.
"Unicode-string" specifies a Unicode string.
Returns a string.

PtrGlobalDefine(var)
Marks a variable as being globally accessible.
"var" specifies a variable name.
This function can only be called from the main script, not from a UDF.
If "var" does not already exist, it will be created.
Returns a pointer string.

PtrGlobal(var)
Retrieves a "pointer" to a global variable.
"var" specifies a variable name.
"var" must have been previously been marked as global using PtrGlobalDefine.
Returns a pointer string.

PtrPersistent(var, value)
Creates a "pointer" to a persistent variable.
"var" specifies a variable name which CANNOT be longer than 25 characters.
"value" specifies a value which will be assigned to "var" if "var"
does not already exist.

This function marks a variable as persistent.  If called from a UDF,
the variable will retain its value after the UDF returns.

If "var" does not already exist, it will be created.  If it already
exists, its value will not be changed.

Returns a pointer string.

StrByteCount(s/u:string, i:request)
Returns the length of a string, in bytes.

"string" specifies an ANSI or Unicode string.

"request" specifies how "string" should be treated in order to
calculate its length:
Request   Meaning
-------   -------
-1      current format (ANSI or Unicode)
0      ANSI string (including double-byte ANSI character sets)
1      Unicode string


FileGetW(s/u:filename [, u:null-char])
Converts a file to a Unicode string variable.

This function is like FileGet, except that the return value is
a Unicode string, and "null-char" specifies a Unicode character.

"filename" specifies an ANSI file name in Windows 95/98/ME, and a
Unicode file name in Windows NT/2000/XP/2003.

Returns a Unicode string containing the file contents.

FilePutW(s/u:filename, u:string)
Writes a Unicode string to a file.

This function is like FilePut, except that "string" specifies a
Unicode string.

"filename" specifies an ANSI file name in Windows 95/98/ME, and a
Unicode file name in Windows NT/2000/XP/2003.

Returns the number of bytes (not characters) written to the file.
This will include a 2-byte Unicode header written to the beginning
of the file.

RegOpenFlags(i:flags)
Specfies registry view.

This function lets you specify an alternate view of the registry for
Reg[..] functions which create, open, and delete registry keys, when
running on (or accessing) a 64-bit Windows platform.
Flags   Meaning
-----   -------
0     32-bit view under Win32, 64-bit view under WOW64 (default)
1     32-bit view
2     64-bit view

Returns 1.

Added an optional parameter to AskLine:
AskLine(title, prompt, default [, i:format])

"format" specifies the format of the returned string:

Format   Meaning
------   -------
0      ANSI string (default)
1      Unicode string (Windows NT/2000/XP/2003 only)
2      hex string, with four hex bytes per Unicode character

Added an optional parameter to FileOpen:
FileOpen(filename, mode [, i:Unicode])

The "Unicode" option will affect how FileRead and FileWrite process
the file data, as below.

FileRead now returns a Unicode string if the file was opened with
FileOpen specifying "Unicode" as @TRUE.  FileRead can also now be used
to read files containing Unicode data, and will automatically determine
the correct file type (ANSI or Unicode), regardless of the "Unicode"
parameter in FileOpen, and will convert the return string if necessary.

The FileWrite "output-data" string is now treated as a Unicode string if
the file was opened with FileOpen specifying "Unicode" as @TRUE.
However, if you open an existing file in "APPEND" mode, FileWrite will
always output data to match the existing file type (ANSI or Unicode).

You can pass a Unicode string to any function that accepts an ANSI string.
If the function doesn't specifically support Unicode strings, they will be
converted to ANSI.

Message() will now call a Unicode version of the function if "title" or
"text" is a Unicode string

AskLine will now call a Unicode version of the function if "title",
"prompt", or "default" is a Unicode string, or if "format" is 1 or 2
(Windows NT/2000/XP/2003 only).

StrLen will now call a Unicode version of the function if "string" is a
Unicode string.

StrLen now returns the length of "string" in characters instead of bytes.
New function "StrByteCount" can be used to return the length in bytes.

StrCharCount will now call a Unicode version of the function if "string"
is a Unicode string.

StrCat will now call a Unicode version of the function if any of the
parameters are Unicode strings, in which case the return value will be a
Unicode string.

ClipAppend and ClipPut will now copy "string" to the Clipboard in Unicode
format if it is a Unicode string.

ClipGet will now return a Unicode string if the Clipboard contains Unicode
data.

ClipGetEx will now return a Unicode string if "format" = 13.  This format
now works properly on all Windows platforms.

The following functions will now call a Unicode version of the function if
any of the string parameters are Unicode strings, in which case if the
return value is a string it will be a Unicode string:
ItemCount
ItemCountCsv
ItemExtract
ItemExtractCsv
ItemInsert
ItemLocate
ItemRemove
ItemReplace
ItemSort

The following functions will now call a Unicode version of the function in
Windows NT/2000/XP/2003, and will return Unicode lists (or arrays
containing Unicode file names) on all platforms:
FileItemize
FileItemPath
DirItemize
FileInfoToArray
DirInfoToArray

Call() will now call a Unicode version of the function if "parameters" is
a Unicode string, in which case the parameters passed to the called script
will be Unicode strings.

Unicode strings may be passed as parameters to UDF's, in which case the
corresponding variable will be set to a Unicode string.

Fixed a problem with the "For" statement when "initial-value" was a string.

Changed the method IniItemize and IniItemizePvt use to itemize section
names when "section" is a blank string.  This will affect the behavior
when there are multiple sections in the file with the same name but
different cases, and they contain high ASCII characters (eg, [cliché] and
[CLICHÉ]).  The behavior now matches the Windows method.

You can now use IniItemize("") to itemize section names in WIN.INI.

The following functions will now call a Unicode version of the function in
Windows NT/2000/XP/2003:
Run
RunEnviron
RunHide
RunHideWait
RunIcon
RunIconWait
RunShell
RunWait
RunWithLogon
RunZoom
RunZoomWait

Fixed a problem with PtrPersistent and more than 9 UDF's.

The following functions will now call a Unicode version of the function in
Windows NT/2000/XP/2003 if "filename" is a Unicode string:
BinaryRead
BinaryReadEx
BinaryWrite
BinaryWriteEx

FileCompare will now call a Unicode version of the function in Windows
NT/2000/XP/2003 if "filename1" or "filename2" is a Unicode string.

SnapShot now supports multi-monitor systems.

The following functions now accept a Unicode string for "filename" in
Windows NT/2000/XP/2003:
FileAttrGet
FileAttrGetEx
FileExist
FileGet
FileOpen
FilePut
FileTimeCode
FileTimeGet
FileTimeGetEx
FileYmdHms

The following functions now accept a Unicode string for "file-list" in
Windows NT/2000/XP/2003:
FileAttrSet
FileAttrSetEx
FileTimeSet
FileTimeSetEx

The following functions now accept a Unicode string for "source-list" and
"destination" in Windows NT/2000/XP/2003:
FileAppend
FileCopyAttr
FileMoveAttr

The following functions now accept Unicode strings in Windows
NT/2000/XP/2003:
FileCopy
FileDelete
FileMove
FileRename
FileSize
FileSizeEx
FileTimeTouch

The following functions now accept and return Unicode strings in Windows
NT/2000/XP/2003:
FileBaseName
FileCreateTemp
FileExtension
FileFullName
FileLocate
FileMapName
FileNameLong
FileNameShort
FilePath
FileRoot
FileVerInfo

The line length specified by IntControl(65) is now in characters, not bytes.

DllHinst was returning a non-zero value for an invalid window in some cases.

When running in WOW64 (32-bit emulation under 64-bit Windows), Reg[..]
functions which create, open, and delete registry keys now access a 64-bit
view of the registry by default.  This can be changed with RegOpenFlags.

IntControl(77, 12) was listing a variable with a blank name, resulting in
a tab at the beginning of the list.

ParseData now accepts a Unicode string for "string", in which case the
variables created (param1, param2, etc.) will be Unicode.

Fixed a problem with SysParamInfo using request 8203.

Added new return value for WinMetrics(-2):
3 = Win64

Added new request to WinMetrics:
Req   Return value
---   ------------
-7   2 if WOW64 (32-bit emulation under 64-bit Windows), 0 otherwise

IniItemizePvt now returns "(NONE)" instead of "(File not found)" when
listing sections in a non-existent file.

Fixed a problem specifying multiple handler UDF's with IntControl(72) and
IntControl(73).

In FileCopy, if "destination" is a file name of the form "USB###" where
"#" is a digit between 0 and 9, it will now be treated as a port number.

Fixed a string memory leak.

IntControl(22) and IntControl(23) now work if "p1" = 65535.

FileInfoToArray and DirInfoToArray no longer have a limit of 100 names in
"file-list"/"dir-list".

Added additional "levels" for WinVersion, on Windows NT4[SP6+]/2000/XP/2003/Longhorn:

Level  Returns
-----  -------
6    Major version number of the latest Service Pack installed.

7    Minor version number of the latest Service Pack installed.

8    Bit flags that identify the product suites available on the
system.  This can be 0, or one or more of the following values,
combined using the bitwise OR ('|') operator:
Value  Meaning
-----  -------
1  Microsoft Small Business Server was once installed on the
system, but may have been upgraded to another version of
Windows (see note below).

2  Windows Server 2003, Enterprise Edition, Windows 2000
Advanced Server, or Windows NT Server 4.0 Enterprise
Edition is installed (see note below).

4  Microsoft BackOffice components are installed.

16  Terminal Services is installed.

32  Microsoft Small Business Server is installed with the
restrictive client license in force (see note below).

64  Windows XP Embedded is installed.

128  Windows Server 2003, Datacenter Edition or Windows 2000
Datacenter Server is installed.

256  Terminal Services is installed, but only one interactive
session is supported.

512  Windows XP Home Edition is installed.

1024  Windows Server 2003, Web Edition is installed.

Note that you should not solely rely upon the '1' flag to
determine whether Small Business Server has been installed on the
system, as both this flag and the '32' flag are set when this
product suite is installed.  If you upgrade this installation to
Windows Server, Standard Edition, the '32' flag will be unset,
however, the '1' flag will remain set.  In this case, this
indicates that Small Business Server was once installed on this
system. If this installation is further upgraded to Windows
Server, Enterprise Edition, the '1' flag will remain set.

9    Additional information about the system.  This can be one of the
following values:
Value  Meaning
-----  -------
1    The operating system is Windows "Longhorn", Windows XP
Professional, Windows XP Home Edition, Windows 2000
Professional, or Windows NT Workstation 4.0.

2    The system is a domain controller.

3    The system is a server.

Note that a server that is also a domain controller is reported
as '2', not '3'.

A blank string will be returned for these "levels" on unsupported
Windows platforms.

Changes to the Dialog function and related functions:

Added new option to DialogProcOptions function. Use 1003 to change the
dialogs title by placing a new title in the function's third parameter.
Place -1 in the third parameter to return current title.

Added two new control styles that can be used to control text selection
and cursor placement when a EDITBOX and MULTILINEBOX control receives
the input focus. Style 2048 prevents text selection and places the
cursor to the left side of the text. Style 4096 prevents text selection
and places the cursor to the right of the text. Both style only effect
selection when the control initially get the input focus. The user is
still able to manually selection text.

Changed rendering method for dialog buttons to fix an occasional problem
with dialog client area redraws.

New dialog control type COMCONTROL.

Changes to OLE support:

New functions:
ObjectEventAdd
ObjectEventRemove
DialogObject

Fixed problem that occurred when handling invalid parameters to the
ObjectGet/GetObject functions.

Fixed problem handling individual WIL array elements passed to object
methods as out parameters.

Fixed problem accessing members of safearray elements that are object
references stored as variants.

Changed type information handling for legacy COM Automation servers that
use variable descriptors instead of function descriptors to store object
property information in their type library.  (Found a COM serve that
still uses variable descriptors.)

Changed the values returned by IntControl(77,62,0,0,0) so they match the
integer values used when an unqualified COM object variables participate
in an integer expressions.

Add COM Controls and COM event support.

Fixed problem with assigning an object reference to an element of a
Variant array of variants when using WIL array syntax.

Added error to the ObjectEventAdd function to trap attempts to pass an
object reference that is not stored in WIL variable as the first
parameter to the function.

Fix bug that prevented ObjectEventAdd from finding an object's events in
certain situations.

Fixed problem that on rare occasions could cause a memory exception or an
"Object type mismatch" error during object property assignment.

Dialog Editor 2005E  First showing up in WB 2005E
Added Resize menu option.

Added Run Dialog menu option.

Added support for arrow keys to Script View mode.

Added simple context menu to Script View.

Sorted "Insert" menu items.

Added ability to change anchor control in multi-select alignment
operations.

Added visual feedback to identify the current anchor during multi-select
operations.

Fixed several tab key navigation problems associated with the deletions
of controls.

Added new option to the "Save" options property page. This option turns
off the Save prompting for templates loaded from the clipboard, modified
and then saved back to the clipboard.

WinBatch version 2005C

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

DLL 5.7ceg  First showing up in WB 2005C
New function:
RegQueryKeyLastWriteTime(handle, subkey-string) (Windows NT/2000/XP/2003 only)
Returns the last write time for a registry key.

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

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

p1   Meaning
--   -------
0   Only match long version of file names (default).
1   Match long and short versions of file names.

This controls the behavior of functions which take file masks.  By
default, masks only match the long version of the file name.  For
example, if you do FileItemize("*.htm"), it will not match a file
"home.html" whose short name is "HOME~1.HTM".  If you want it to match
the short version of the file name as well, set "p1" to 1.

Returns the previous setting.

New '&' address operator returns a "pointer" to a variable:

ptr = &var

Note that the "pointer" is a string, and not a real memory address.

New '*' pointer operator gets or sets the value of a variable referenced
by a "pointer".  It sets the value when it appears in a statement as the
first item on the left side of an '=' assigment:

*ptr = val
If answer == @TRUE Then *ptr = val
Execute *ptr = val

In other contexts, it gets the value:

val = *ptr
array[*ptr] = 5

Added a new parameter to IntControl(34):

IntControl(34, p1, p2, 0, 0)

"p2" = error type.  If p2 == 0, then p1 specifies a WIL error code.
If p2 == 1, then p1 specifies a Windows error code.

Added a new parameter to IntControl(70).  Revised documentation is as follows:

IntControl(70, p1, p2, 0, 0)
Set delay after WinWait[..] functions or PostMessage's.

"p1" specifies the delay, in milliseconds, after the type of
operation specified by "p2".

"p2" specifies the type of operation that the delay applies to:

If "p2" == 0, then "p1" specifies the delay after a successful
WinWaitExist, WinWaitChild, or WinWaitClose.  The default is 500
(ie, 1/2 second).  Specify 0 for no delay.

If "p2" == 1, then "p1" specifies the delay after successful calls
to the Windows PostMessage API (except when performing mouse clicks).
The default is 100 (ie, 1/10 second).  Specify 0 for no delay.

Returns previous setting.

Added an optional parameter to AskFileText and AskItemList:

AskFileText(title, filename, sort mode, select mode [, i:selection-required])
AskItemList(title, list variable, delimiter, sort mode, select mode [, i:selection-required])

If "selection-required" is @TRUE, the OK button will be grayed out
unless an item is selected in the listbox.  The default is @FALSE.

Added an additional parameter to IntControl(72):

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

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

Added a new "p1" mode and addidional parameter to IntControl(72) and
IntControl(73):

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

p1   Meaning
--   -------
3   Call the UDF specified by "p3"

"p3" specifies the name of the UDF.

The cancel/error handler UDF must be defined to accept exactly one
parameter.  The parameter it receives will be the "wberrorarray" array.
None of the other WIL variables will be automatically set.

By default, the cancel/error handler mode is reset to 0 when the UDF
returns.  If the UDF returns 1, the handler mode will not be reset.

If the cancel/error handler UDF is invoked in a variable assignment
statement (eg, "variable = function()"), and you set wberrorarray[11] to
a value inside the handler UDF, that value will be assigned to the
variable.  Note that this does not work for a property assignment.  By
default, the value assigned when a cancel or error occurs is 0.

Fixed a problem with buttons in the error message dialog having the wrong
names if an older version of the language localization file was in use.

It is now an error to return a value from a GoSub.

Fixed a problem with RunWithLogon failing when running under the
LocalSystem account in Windows XP Service Pack 2 and Windows Server 2003.

If BinaryReplace makes the buffer smaller by moving up the binary EOD, it
now fills the data past the new binary EOD with NULL's.

BinaryStrCount no longer counts strings which extend past the binary EOD.

It is now an error to attempt to Drop a variable while an assignment is
pending (eg, "x = MySubroutine()" where x is dropped within MySubroutine).

Fixed a problem with PipeServerRead truncating the second character of a
2-character string.

Fixed some problems with the conversion of parameters and strings to
floating point numbers.

Added a 100 millisecond delay after calls to the Windows PostMessage API.
This can be changed with IntControl(70).

In the Display function, you can now specify a negative number for "seconds",
in which case the negative number will be treated as a positive number (eg,
-5 will be treated as 5), and the display dialog will be invisible.

When processing goes to a Cancel or Error handler routine, the WIL array
variable wberrorarray[11] is set to 0.

Fixed a problem with WinArrange not calculating the screen area correctly.

Fixed a problem with IsFloat, IsInt, and IsNumber returning @FALSE for
some variant types.

All functions which take file masks now restrict the mask-matching to the
long version of the file name.  For example, if you do FileItemize("*.htm"),
it will no longer return a file "home.html" whose short name is "HOME~1.HTM".
You can modify this behavior with the new IntControl(91).

RegSetQword no longer requires the value to be 8 bytes long.

Changes to OLE support:

Even more performance improvements when using COM servers that have a
large number of members associated with each object in the programming
model(significantly speeds looping through Excel cell values.)

Added work around to allow access to Acrobat's buggy JSObject interface.

Corrected problem with IntControl(77,62,0,0,0) and single element arrays.

Added support for the variant type "ARRAY" to the "ObjectType"
function.  This allows the creation of embedded safe arrays as required
by a few COM object members.

Variant bstr to number convertions now follow regular WIL string to
number conversion rules.

Variant currency and decimal tests for numeric type are now done
based on content and variant type rather than just variant type.

WinBatch version 2005B



WB 2005B  Jan 26, 2005

Added support for an additional "state" to SvcSetState:

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

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


DLL 5.6bef  First showing up in WB 2005B

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

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

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

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

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

Changes to OLE support:

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

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

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

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

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

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

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

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

WinBatch version 2005A

WB 2005A  Jan 6, 2004
Compiler now sets "CompileTime" version string to time of compilation.

DLL 5.6aef  First showing up in WB 2005A
New functions:

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

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

\\.\pipe\PipeName

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Returns 1.

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

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

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

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

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

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

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

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

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

"filetype" specifies the type of file:

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

The icon information is returned as an array.

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

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

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

For each icon group 'x':

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

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

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

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

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

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

For each icon image 'x':

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

Added a new parameter to IntControl(35):

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

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

Added an optional parameter to IconReplace:

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

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

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

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

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

Fixed a memory leak if an array was created but not assigned to a variable.

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

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

WinBatch version 2004G

WB 2004G  Nov 29, 2004
DLL 5.5gee  First showing up in WB 2004G
Increased the maximum script line length from 255 to 2048 characters.

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

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

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

Added an optional parameter to RegQueryDword:

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

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

Added an optional parameter to RegSetDword:

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

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

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

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

Added an additional parameter to IntControl(73):

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

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

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

When processing goes to a Cancel or Error handler routine:

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

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

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

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

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

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

Changes to the Dialog function and related functions:

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

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

Changes to OLE support:

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

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

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

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

WinBatch version 2004F

WB 2004F  Jul 29, 2004
DLL 5.4fed  First showing up in WB 2004F
In IntControl(1007), if "p1" == 3 (suspend script), it now resets the
"clicked" state to 0 right before the function returns.

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

Changes to the Dialog function and related functions:

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

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

WinBatch version 2004E

WB 2004E  Jul 9, 2004
DLL 5.3eec  First showing up in WB 2004E

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

Fixed a problem passing variants to older extenders.

WinBatch version 2004D

WB 2004D  Jun 18, 2004
DLL 5.2deb  First showing up in WB 2004D
New function:
DirScript()
Returns the full path of the current WinBatch program.

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

Fixed a problem with using BoxDestroy in a Dialog callback.

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

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

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

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

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

Improved detection of misplaced Continue and Break statements.

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

WILX extender 39004  First showing up in WB 2004D
New function:

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

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

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

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

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

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

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

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

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

WinBatch version 2004C

WB 2004C  May 24, 2004
DLL 5.2ceb  First showing up in WB 2004C
Changes to the Dialog function and related functions:

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

WinBatch version 2004B

WB 2004B  May 19, 2004
DLL 5.1bea  First showing up in WB 2004B
Increased maximum variables from 1,000 to 2,000.

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

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

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

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

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

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

Added support for many more OLE types, including arrays.

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

New functions:

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

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

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

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

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

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

16  *  DIRECTORY            Identifies a directory.

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

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

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

512  *  SPARSE_FILE          The file is a sparse file.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

"string" specifies the main string.

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

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

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

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

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

Returns the number of occurrences.

SoundVolume(i:level)
Sets the speaker volume.

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

Returns the previous volume level.

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

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

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

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

Returns 1.

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

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

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

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

Returns a binary buffer handle.

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

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

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

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

2     Return file names with full paths

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

Header row:

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

Other rows:

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

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

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

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

ObjectConstantsGet(r:object)
Creates a Constants object.

(r) object reference: COM object reference.

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

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

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

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

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

conVal = adoConst.adBSTR

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

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

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

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

(r) constants: Constants object reference.

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

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

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

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

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

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

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

nNumberOfConstants = aConstants[0,0]

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

sName = aConstants[1,0]

And the first value is accessed with:

nValue = aConstants[1,1]

New structure operator:

ForEach

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

ObjectClose
ObjectCollectionClose
ObjectCollectionNext
ObjectCollectionOpen
ObjectType

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

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

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

ArrayFileGet
ArrayFileGetCsv
AskFileText
FileRead

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

IntControl(65) is revised as follows:

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

IntControl(83) is now obsolete.  See BinaryAllocArray.

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

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

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

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

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

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

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

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

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

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

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

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

DirSize
DiskSize
FileSize
FileSizeEx

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

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

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

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

Changes to the Dialog function and related functions:

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

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

WinBatch versions 2004A or older