List of Fixes and Improvements

WinBatch versions 5.0H and onwords

Keywords:    fixes improvements new releases features

 

WinBatch version 5.X

WinBatch/WIL DLL fixes. Dates indicate disk drop into manufacturing. Actual ship is often a week or two later. 5.0H Sept 1, 1994 Initial public release of WinBatch 5.0H 5.0J Sept 10, 1994 Network Extender fixes 5.0K Sept 19, 1994 Fixed "Use Older / Use Newer" swap in Confirm Replace dialog Fixed problem where \*.* was required on a target directory on FileCopy/FileMove functions (Oops See 5.0N) 5.0L Sept 26, 1994 Fixed MenuChange function Added DiskSize function Added \\machine\share capability to DiskFree and DiskSize functions WinBatch 32 for Intel PCs available 5.0M Oct 3, 1994 Fixed TimeDiffSecs function Fixed DDERequest memory leak problem Started adding this fixes.txt file 5.0N Oct 10 1994 Fixed memory leak on Dialog() function when CTL3DV2 was used. New n3Logout function in Novell3 extender Really fixed the \*.* problem. Previous fix only copied the first file. Modified the DiskFree, DiskSize, and FileSize functions to return a floating point answer if the result is larger than about 2 Gigabytes Fixed Novell 3 Extenders (DLL10G) n3Map fixed to work with ODI drivers n3GetMapped n3MemberSet n3MemberDel 5.0P Oct 19 1994 Fixed FileSize for 32bit versions to return the proper answer Fixed a bug in StrIndex where a @backscan on a one character string would provide an incorrect answer. Fixed problem in CopyMove confirm dialog - Cancel works now. Fixed problem in CopyMove dialog - missing source file error caught before dialog. Fixed problem where Dialog function dialog boxes used BUTTON_FACE color instead of LTGRAY color. Fixed Novell 4 Extenders (DLL10H) n4Map (improved) n4GetMapped n4MemberSet n4MemberDel Novell DLL's updated from the Novell 11/93 release to the 2/94 release WinBatch 32 for Dec Alpha and MIPS now available. Actually, its almost pointless to watch the Winbatch version number, as nearly all the fixes appear in the Dll, which has its own version numbering scheme. Henceforth, we will be tracking the DLL version number. The WinBatch VersionDll() function will return the DLL version. This is already built into the SYSINFO.WBT file. DLL 2.1ebc Oct 26 First showing up in WinBatch 5.0Q User pointed out problems in the sin and cos routines. Problem traced to what appear to be singularity-type problems in the Microsoft runtime cos and sin routines. The Dll now checks for the bad numbers, and if it is in the range where the runtime routines fail, it stuffs in an appropriate answer. Fix installed in the 16 bit version only, as the 32 bit versions do not seem to have this problem in the runtimes. Fixed a nit in the dialog editor where, when it was requested to display a script, would do so in a dialog box with a "(Unlicensed)" in the title. Fix a parser problem where an error occurred when the first part of a variable name matched a function name provided by the calling exe program. This problem first showed up in using a "Dialog1" name for a dialog in the Dialog Editor. Fixed a SendKey to DOS bug where stuff like {UP} did not work when the NumLock was set. Fixed by turning off NumLock when sending keystrokes to DOS. DLL 2.1fbc Fixed look of Dialog boxes (back to white) when CTL3DV2.DLL is not installed on system. Fixed >very insignificant< problem where if a user did an AddExtender for the same DLL twice (or more) only one instance of the DLL was freed when the WBT file shut down. Fixed problem in 32 bit version for Windows'95 where default directory was not set properly in =C: environment variable. This problem caused wildcarded filenames to be improperly resolved into real filenames. Fixed problem in 16 bit version where DirRemove always returned a true, whether or not the directory was deleted. If the directory is not deleted, it now returns a suppressable, 1030 error. DLL 2.2abf First showing up in WB 5.1A Because of a data structure change to support more binary buffers (5 was coded, 10 was documented) the main dll renamed to WBDBFxxx.dll Fixed TimeDiffSecs (again). If the first date was smaller than the second date, the answer could be incorrect. Fixed a problem in FileAppend where the following code would not work properly. FileAppend("AAA.*","BBB.TXT") The DLL now does better checking. SendKey slowed down a minor tad to help other applications out. 32Bit versions will try harder to locate the WIL DLL on startup. The compiler time check of various DLLS has been removed because of assorted problems. We'll just roll the DLL name instead when incompatibilities arise. The DLL appears to be extremely stable, and the bug fixes implemented lately tend to be minor (see above) A buglet where an ItemInsert on a null string installed a leading delimiter before the inserted item - leading to a list with two items, the first being null, and the second being the desired item - was fixed. When ItemInsert'ing into a null list, no leading delimiter is stuffed in. A problem with PlayWaveForm where it was not checking the [Sounds] section of the WIN.INI file for all possible cases has been fixed. Fixed a problem with FileCopy/FileMove, where the target was ".." and it was a root directory. DirExist now returns TRUE for hidden and system directories. It also uses an improved method (hopefully) of checking for root directories and directories with relative paths (eg, "..\TEMP"). Changed FileExist to return a value of '2' if the specified file exists but is currently open by another application in "read-deny" mode. Most of the other file manipulation functions (except FileOpen) will cause a sharing violation if they try to access such a file. Fixed problems handling file and directory names containing high ANSI characters (>127). Fixed a problem that occurred if, inside a FOR loop, the user changed the increment variable to a string. Fixed an intermittent problem with performing comparisons of negative floating point numbers. FileFullName now correctly expands "dot" directories ("." and "..") in the path name. Fixed a problem processing lines such as "Gosub %param1%" inside conditional structures, when param1 was undefined. (32-bit version) Fixed some incompatabilities with Windows 95: FileAppend FileMove MsgTextGet WinActivate (where the specified parent window had a modal child window displayed -- focus was going to the parent window instead of to the child window) Fixed a problem with accessing the DLL if it was located in the parent directory and ".." was on the path. FileCopy, FileMove, and FileAppend now check for sufficient free disk space before performing the requested operation, and return an error if there is insufficient space, as follows: NetWare 3 extender 12012 First showing up in WB 5.1A New functions: n3ServerList(request) Returns name of connected server(s) n3FileAttrGet(filename) Returns NetWare file attributes n3FileAttrSet(filename, attribs, mode) Sets NetWare file attributes NetWare 4 extender 14007 First showing up in WB 5.1A Changed functions: n4memberGet(group, user) n4memberSet(group, user) n4memberDel(group, user) these functions no longer take a 'server' parameter (they change the groups on all servers) New functions: n4ServerList(request) Returns name of connected servers(s) n4FileAttrGet(filename) Returns NetWare file attributes n4FileAttrSet(filename, attribs, mode) Sets NetWare file attributes WB 5.1C April 18, 1995 Fixed problem with compiler and compiled WBT's causing a sharing violation if the DLL was on a network and not marked read-only. Fixed problem with compiler and compiled WBT's not finding the DLL if it was located in the Windows or Windows System directory. Fixed problem with large compiled WBT's being unable to extract the WIL DLL when run on a disk >= 4 gigabytes in size. In WILX.DLL extender -- fixed problem with xDriveReady sometimes causing a GP fault. DLL 2.2abg First showing up in WB 5.1C Added two new string constants: @CR and @LF Fixed bug in BinaryIndex where it wouldn't find the last character in the buffer. WB 5.1D July 18, 1995 WinBatch compiler: for new projects, compiler will use settings (type, icon, and extenders) from the last project. DLL 2.2abh First showing up in WB 5.1D ************************************************************************** IMPORTANT: File delimiters ************************************************************************** In order to support long file names in Windows NT and Windows 95, which can contain embedded spaces, we have changed the default file delimiter, used to delimit lists of files and directories, to a TAB in the 32-bit version of WIL. In the 16-bit version of WIL, the default delimiter has not changed, and remains a space. Note that this is the "default" file delimiter. We have added the ability to change the file delimiter to a character of your own choosing, using the new IntControl 29. If you are using the 32-bit version of WIL, and want to make the file delimiter a space for compatability with existing scripts, you can place the following line at the beginning of each of your scripts: IntControl(29, " ", 0, 0, 0) Conversely, if you want to standardize on a TAB delimiter, you can use: IntControl(29, @TAB, 0, 0, 0) Apostrophes (') and back quotes (`) are no longer treated as special characters to delimit file names containing spaces. They are now treated as ordinary characters in a file name. ---------------------------- Functions which are affected ---------------------------- The most important functions affected by this change are: DirItemize DiskScan FileItemize which now return lists delimited by the current file delimiter character. The following functions, which take file or directory lists as input parameters, now expect the lists to be delimited by the current file delimiter character. However, they now also accept lists delimited with a TAB or a vertical bar ("|", which may be easier to code in a WIL script): DirItemize DirRemove DiskFree FileAppend FileAttrSet FileCopy FileDelete FileItemize FileMove FileRename FileSize FileTimeSet FileTimeTouch Note that DiskFree will continue to accept space-delimited lists as input. ************************************************************************** New IntControl: IntControl(29, delimiter, 0, 0, 0) Changes the default file delimiter. The first parameter is the new file delimiter you want to use, and must be a single character. The return value of the function is the previous file delimiter character. If you specify an empty string ("") as the first parameter, the function will return the current file delimiter character but the file delimiter will not be changed. Added option to WinMetrics: WinMetrics(-4) will return the Windows platform: 0 = Other 1 = Windows 2 = Windows for Workgroups 3 = Win32s 4 = Windows NT 5 = Windows 95 In StrSub, you can now specify a length of -1, which will extract the rest of the string. In TimeWait, you can now specify "00:00:00" for the date, which will wait for the next occurrence of the specified time (ie, today or tomorrow). Added support for 3-D Dialog's in Windows NT, if CTL3D32.DLL is present in the SYSTEM32 directory. Fixed TimeAdd so that it doesn't trim out leading zeros in each field. The Wallpaper function now obeys the tile parameter in Windows 95. Improved handling of colors in Dialog function. Added 3D effect to radio buttons and checkboxes in Dialog function. Fixed problem where if an error occurred in a called WBT, control would go to the "Cancel" label in the calling program. In Dialog and DialogBox, you can now really use IntControl(4) to allow the dialog to be closed without selecting a file, even if there is an edit box associated with a file listbox. If you press a pushbutton after changing the file mask in an edit box, the listbox will be updated with the new mask. But if you press a pushbutton without changing the file mask, the dialog will close (and will return a file name of "NOFILESELECTED"). Fixed problem where string variables were not converted properly to integers at the beginning of a "For" loop. Fixed problem where lines that should have been ignored (eg, if they followed a Break statement) could cause errors if they contained invalid syntax. If the second parameter of an IntControl(12) statement is "" or "0", any previously-set exit message will now be cleared. Also, you can now specify a message beginning with "0". Fixed problem processing "If" statements with a blank string to the left of the equals sign. Fixed a problem in the 32-bit version where the Dialog function would return an invalid file name (garbage characters) if no file was selected. Improved IsKeyDown processing (especially under Windows 95). Improved Ctrl-Break checking (especially under Windows 95). Made WinWaitClose steal less processor time in the 32-bit version. WB 5.1E Aug 3, 1995 In the 32-bit version of WinBatch, it is now possible to run WinBatch files whose names contain spaces, by delimiting the file name with double quotes on the WinBatch command line. For example: WBAT32I "Sample Program.WBT" param1 param2 CallExt now handles file names containing spaces, in 32-bit version. 32-bit version of WinBatch will now run WBT's with file names longer than 64 characters. INI settings have been moved from WWW-PROD.INI to the registry, under key: HKEY_LOCAL_MACHINE\SOFTWARE\Wilson WindowWare\Settings\WWW-PROD DLL 2.2abj First showing up in WB 5.1E For functions which take a partial window name, you can now specify a tilde (~) as the first character of the window name, which will match any window containing the specified string anywhere in its title (ie, not necessarily at the beginning of the title). For example, "~Notepad" will match a window title of "(Untitled) - Notepad" and a window title of "My Notepad Application", as well as a window title of "Notepad - (Untitled)". This should prove especially useful under Windows 95. A '~' at the end of the specified window name indicates (as before) that the name must match the window title through to the end of the title. So, "~Notepad~" will match a window title of "Notepad" and a window title of "(Untitled) - Notepad", but will not match a window title of "Notepad - (Untitled)". New function: WinIdGet(partial-winname). Returns a unique "Window ID" (pseudo-handle) for the specified window. New functions to manipulate Windows 95 shortcut link files (Windows 95 only): ShortcutEdit(linkname, pathname, params, workdir, showmode) Modifies the specified shortcut file. showmode = @NORMAL, @ZOOMED, or @ICON ShortcutExtra(linkname, description, hotkey, iconpath, iconindex) Sets additional information for the specified shortcut file. iconindex = 0=based index of desired icon in "iconpath" ShortcutInfo(linkname) Returns information on the specified shortcut file (TAB-delimited): path, params, workdir, showmode, desc, hotkey, iconpath, iconindex ShortcutMake(linkname, pathname, params, workdir, showmode) Creates a shortcut for the specified filename. showmode = @NORMAL, @ZOOMED, or @ICON In 32-bit version, Run... commands now support file and directory names containing spaces. In 32-bit version, Run... commands no longer support the undocumented method of running a program with a non-standard extension (eg, "SSSTARS.SCR") by replacing the period (.) in the file name with an asterisk (*). However, this is no longer necessary, as the Run... commands in the 32-bit version can now run such programs directly. The 32-bit bit version is now able to run Windows 95 shortcut files under Windows 95, using any of the Run... functions. The "Run" mode specified in the shortcut file (ie: "Normal window", "Minimized", or "Maximized") will always be obeyed, any command-line parameters specified in the shortcut's "Target" field will override any parameters passed by the Run... function, and a working directory specified in the shortcut's "Start in" field will override a working directory parameter in RunShell. New directory attribute functions: DirAttrGet(dirname) Gets directory attributes (like FileAttrGet) DirAttrSet(dir-list, settings) Sets directory attributes (like FileAttrSet) FileAttrGet and FileAttrSet now return an error if a directory name is specified. Use the new DirAttrGet and DirAttrSet instead. New functions (32-bit version only -- the 16-bit version will just return the passed file name): FileNameLong(filename) Returns the long version of a filename. FileNameShort(filename) Returns the short (ie, 8.3) version of a filename. New IntControl (32-bit, Windows NT only): IntControl(30, "sourcefile", "destination", 0, 0) Performs a delayed file move. The file is not actually moved until the operating system is restarted. New registry functions (32-bit version only): RegApp(progname, path) Creates registration entries for a program under "App Paths". RegDelValue(handle, subkey-string) Removes a named value for the specified subkey from the registry. In 32-bit version, PlayMidi function now support file and directory names containing spaces. New function (32-bit version only): InstallFile(filename, targname, default-targdir, delete-old, flags) Installs and uncompresses file. New function (menu-based implementations only): CurrFilePath() Returns the full path+filename of the currently-selected file. Like CurrentFile, but returns a full pathname. New IntControl (32-bit, Windows 95 only): IntControl(31, 0, 0, 0, 0) Returns a tab-delimited list of WinId's for all open Explorer windows. IntControl(67) and IntControl(68) now work in Windows 95. DosVersion now returns correct values in Windows 95. Added new request #'s to WinResources for 32-bit version. The existing request #'s (0-4) will still work, but are not useful on 32-bit platforms. It is not possible to determine free system resources in the 32-bit version. Fixed problem with Dialog and DialogBox returning "NOFILESELECTED" even if a file was selected, if IntControl(4) was set. INI settings have been moved from WWW-PROD.INI to the registry, under key: HKEY_LOCAL_MACHINE\SOFTWARE\Wilson WindowWare\Settings\WWW-PROD

WinBatch version 95B

WB 95B Sept 7, 1995 New Box functions: BoxButtonDraw(BoxID, button ID, "text", "rect") BoxButtonKill(BoxID, button ID) BoxButtonStat(BoxID, button ID) BoxCaption(BoxID, caption) BoxColor(BoxID, "color", wash color) BoxDataClear(BoxID, "tag") BoxDataTag(BoxID, "tag") BoxDestroy(BoxID) BoxDrawCircle(BoxID, "rect", style) BoxDrawLine(BoxID, "rect") BoxDrawRect(BoxID, "rect", style) BoxDrawText(BoxID, "rect", "text", erase flag, alignment) BoxesUp("rect", show mode) BoxMapMode(BoxID, map mode) BoxNew(BoxID, "rect", style) BoxPen(BoxID, "color", width) BoxTextColor(BoxID, "color") BoxTextFont(BoxID, "name", size, style, family) BoxUpdates(BoxID, update flag) The 32-bit WinBatch compiler now allows you to specify an icon for the EXE being compiled. DLL 2.2abk First showing up in WB 95B In the 32-bit version, the Run... functions will look in the registry under "App Paths" for the location of the specified program, if you do not specify a path for it. In the 32-bit version, the Run... functions will look in the registry under "App Paths" for a "Path" setting for the specified program, and, if found, will prepend it to the "PATH" environment variable before running the program. In the 32-bit version, the following functions now work, but only with 32-bit applications: AppExist AppWaitClose WinExeName In the 32-bit version, AppExist and AppWaitClose are not able to detect the existence of 16-bit DOS or Windows applications, and WinExeName will return the string "(16-bit application)". BinaryPeekStr, BinaryPokeStr, and BinaryStrCnt now check for (and reject) negative parameters. RunWait now gives up some processor time while it's waiting. New function (32-bit version only): WinSysInfo() Returns a tab-delimited list of system configuration information. This function should be used instead of WinConfig in the 32-bit version. Additional request #'s for WinMetrics (32-bit version only). New mouse functions: MouseClick(click-type, modifiers) MouseClickBtn(win-name, child-win, button-text) MouseMove(x, y, win-name, child-win) Fixed problem where an invalid YmdHms string containing two consecutive colons could cause a GP Fault. In the 32-bit version, AppExist and AppWaitClose will now wait several seconds for the specified application to appear. Fixed problem in menu-based WIL applications where tabs in menu item descriptions would be displayed as non-printable "black-box" characters. Added new request #'s to MouseInfo. In the 32-bit version, IconReplace now supports 32-bit EXE files. The replacement icon must be the exact same size as the original icon. New IntControl: IntControl(32, address, "data type", 0, 0) Returns the contents of the memory location specified by "address". Fixed WinMetrics(-1) with 32-bit graphics cards. It was returning -1 for these; it now returns 2,147,483,647.

WinBatch version 95C

WB 95C Oct 10, 1995 New function: BoxButtonWait() Waits for any button in any box to be pressed. Fixed problem with WinBatch locking up when minimizing a WinBatch box that was displaying width-justified text. DLL 2.2abl First showing up in WB 95C Fixed problem with DirExist returning @FALSE for a UNC which was a root directory share on another machine (eg, "\\SERVER\C"). DirMake will now create multi-level directories (eg, "C:\ABC\DEF\GHI"). New functions: BinaryIndexNc(handle, offset, string, direction) Like BinaryIndex, but case-insensitive. WinItemNameId() Returns a list of top-level window names and their "Window ID's", in the form: "window1-name|window1-ID|window2-name|window2-ID|..." In the 32-bit version, Delay and TimeDelay functions now accept floating point numbers: eg, Delay(0.5). New function: ShellExecute(file-name, params, directory, display mode, operation) Performs a ShellExecute. New function (32-bit version only): RegQueryItem(handle, subkey) Returns a tab-delimited list of named data items for the specified subkey. New IntControl: IntControl(33, p1, 0, 0, 0) Controls whether a listbox control in a dialog box allows multiple items to be selected. P1 Meaning -- ------- 0 Single selection 1 Multiple selection (default) Improved registry functions in 32-bit version: RegSetValue, RegQueryValue, and RegDelValue: 1. SEE NOTE BELOW!! Can now specify a named value of [Default] to indicate the primary value for the key (shown in the Registry Editor as "(Default)"); eg: RegSetValue(mykey, "[Default]", "some data") (*** The above feature was subsequently removed in version 96C ***) 2. Can now specify a subkey string containing a named value; eg: RegSetValue(mykey, "MySubKey[MyItem]", "some data"), or, RegSetValue(mykey, "MySubKey\[MyItem]", "some data") Fixed WaitForKey in the 32-bit version. In the 32-bit version, you can now use the Run... functions to "run" data files (eg, Run("win.ini", "")). FileItemize and DirItemize now handle names containing spaces. In 32-bit version, fixed problem with 3D dialogs not being used under Windows NT.

WinBatch version 95D

WB 95D Nov 1, 1995 Compiler now optimizes WBT's by removing comment lines and whitespace. OLE automation (ObjectOpen and ObjectClose functions) now supported in 32-bit version. When a custom icon is specified, the 32-bit compiler now installs it as the icon that is displayed in the Win95 Explorer window, as well as the icon that is shown in the task bar. Fixed a problem with some of the Box functions, where a color or font that was specified in a definition-type command (such as BoxTextColor) would be used for an output-type command (such as BoxDrawText) that preceded it in the command stack, instead of the default color or font being used. DLL 2.2abl First showing up in WB 95D New registry functions (32-bit version only): RegQueryBin(handle, subkey) Retrieves a binary value from the registry. RegQueryDword(handle, subkey) Retrieves a DWORD value from the registry. RegSetBin(handle, subkey, value) Sets a binary value in the registry. RegSetDword(handle, subkey, value) Sets a DWORD value in the registry. New date/time functions: TimeJulToYmd(julian-date) Converts the specified Julian date value to a date in YmdHms format. Hms will always be "00:00:00". TimeSubtract(YmdHms1, YmdHms2) Subtracts YmdHms2 from YmdHms1. YmdHms2 can not be larger than YmdHms1. New IntControl's: IntControl(34, p1, 0, 0, 0) Returns the error message string which corresponds to the specified WIL error. p1 = error number. IntControl(35, p1, 0, 0, 0) (32-bit version only) Adjusts SendKey delay. p1 = amount of time to delay between each keypress, in milliseconds (1000 milliseconds = 1 second). Returns previous delay setting. The default delay (in the 32-bit version) is 25. Specify a larger number to slow SendKey down, or a smaller number to speed it up (0 = no delay). IntControl(36, p1, p2, 0, 0) (32-bit version only) Waits until an application is waiting for user input. p1 = window name associated with application p2 = timeout, in milliseconds (-1 = no timeout) In dialog boxes, if you create an EDITBOX field with a variable name that begins with "PW_", it will be treated as a password field (ie, asterisks will be echoed instead of the actual characters that the user types). In dialog boxes, file listboxes now use long file names in the 32-bit version under Windows 95. In the DiskScan function, request numbers 8 (CD_ROM) and 16 (RamDisk) are now supported in the 16-bit version. In 32-bit version, added 3D effects to dialog listboxes and edit controls under Windows 95. SendMenusTo now accepts a Window ID for the window name parameter. In 32-bit version, fixed a problem using the Run[] commands to launch a Windows 95 shortcut file. InstallFile function now supported in 16-bit version. NetWare 3 extender 12013 First showing up in WB 95D Fixed a problem with n3GetMapped, if the specified server name was also the partial name of another server (eg, if you specified "\\SERVER1" and you also had a server named "\\SERVER10"). n3FileAttrGet and n3FileAttrSet can now be used to get and set directory attributes. NetWare 4 extender 14010 First showing up in WB 95D Fixed n4Detach function; it now does a full detach, and it now returns @FALSE if it is unable to detach from the monitored connection (ie, from the primary or login server). Fixed a problem with n4GetMapped, if the specified server name was also the partial name of another server (eg, if you specified "\\SERVER1" and you also had a server named "\\SERVER10"). n4FileAttrGet and n4FileAttrSet can now be used to get and set directory attributes.

WinBatch version 95E

WB 95E Nov 2, 1995 DLL 2.2abm First showing up in WB 95E In 16-bit version, fixed a problem with DirMake creating a directory name containing high ANSI characters (>127).

WinBatch version 96A

WB 96A Jan 1, 1996 WinBatch for PowerPC now available. New IntControl: IntControl(1000, p1, 0, 0, 0) Sets the exit code returned by WinBatch. Default exit code = 0. Returns previous value. Fixed the "Help" button in the WinBatch compiler. In the BoxColor function, the gradient effect (wash color) now works with video drivers > 256 colors. DLL 2.3abm First showing up in WB 96A New function: DiskInfo(drive-letter, request#) Returns information on the specified disk drive. New IntControl's: IntControl(37, p1, p2, p3, 0) Replaces the specified icon in an EXE file. Note: This IntControl is subject to change in future versions. IntControl(39, p1, 0, 0, 0) Sets the file sharing mode for file reads. This affects the FileOpen("READ") and BinaryRead functions. Returns previous setting. IntControl(40, p1, 0, 0, 0) Sets the file sharing mode for file writes. New return code for WinMetrics(-3): 4 = PowerPC32 In 32-bit version, fixed a problem using DirName with directory names containing spaces or commas. Fixed problem with TimeJulToYmd with years >= 2000. FileWrite now returns an error if the write failed. In 16-bit version, fixed problem with DiskScan causing a GP fault on systems with Stacker compression software installed. In 32-bit version, the following functions are now a little more well-behaved in giving up processor time: RunWait (and RunShell with the "@WAIT" parameter), AppWaitClose, and Delay/TimeDelay. Fixed a problem with the Dialog function, where if you defined an EDITBOX control after a FILELISTBOX control, the file listbox would revert to a filespec of "*.*". In 32-bit version, fixed a prooblem with the Dialog function, where if you had a filespec other than "*.*", it would not show subdirectories in the file list. In 32-bit version, added some code to the ClipGet and ClipPut functions to try to avoid "Clipboard owned by another app" error messages. Fixed problem with TimeWait, when specifying a date of "00:00:00" and a time that was earlier than the current time. In 32-bit version, added a 25-millisecond delay between keystrokes sent using the SendKey function. This can be adjusted using IntControl(35). Fixed problem with PlayWaveForm in 32-bit version. Windows 32 extender 10004 netDirDialog no longer returns an error if user presses "Cancel". Dialog Editor 96A Fixed the "Help" menu.

WinBatch version 96B

WB 96B Feb 12, 1996 In the 16-bit version, fixed a problem where doing a BoxDestroy immediately after resizing a box window caused a GPF. Fixed a resource leak problem with BoxColor when using gradient effects. DLL 2.3bbm First showing up in WB 96B New binary functions: BinaryHashRec(buffer, recsize, keyoffset, keysize, keyval) Returns a pointer to a record in a binary buffer, using a hashing algorithm. BinaryIncr(buffer, offset) BinaryIncr2(buffer, offset) BinaryIncr4(buffer, offset) BinaryIncrFlt(buffer, offset) These functions are equivalent to doing a BinaryPeek[...], incrementing the extracted value by 1, and then doing a BinaryPoke[...] to store the new value. They return the new value. BinaryPeek2(buffer, offset) BinaryPeek4(buffer, offset) BinaryPeekFlt(buffer, offset) These functions are like BinaryPeek, but they extract 2, 4, or 8 bytes (respectively) beginning at "offset" BinaryPoke2(buffer, offset, value) BinaryPoke4(buffer, offset, value) BinaryPokeFlt(buffer, offset, value) These functions are like BinaryPoke, but they store the specified "value" in 2, 4, or 8 bytes (respectively) beginning at "offset". BinarySort(buffer, recsize, keyoffset, keysize, flags) Sorts records in a binary buffer. The buffer is sorted in place. Change to BinaryIndex and BinaryIndexNc: You can now specify a blank string ("") for the "string" parameter, in which case the function will return the offset of the first non-NULL character found, starting at "offset". Fixed BinaryIndexNC BinaryPoke now correctly returns the previous value, as documented. In the 32-bit version, KeyToggleSet no longer returns an error (however, it is still subject to the limitations described in the documentation). In the 16-bit version, fixed DirAttrSet. The following string functions: StrIndex StrScan StrSub no longer return an error for illegal bounds conditions. Instead, StrIndex/StrScan now return a 0, and StrSub returns a blank string.

WinBatch version 96C

WB 96C Mar 22, 1996 FileMenu now works in Windows NT 4.0. PopMenu now works in Windows NT 4.0. Fixed problem where BoxButtonDraw didn't change the text of an existing button, or of a button which had previously existed but had been removed with BoxButtonKill. DLL 2.3cbm First showing up in WB 96C In 32-bit version, the following functions now work in Windows NT 4.0: ShortcutEdit ShortcutExtra ShortcutInfo ShortcutMake In 32-bit version, the Run... functions can now be used to launch shortcut files in Windows NT 4.0. In 32-bit version, added 3D effects to Windows NT 4.0. In 32-bit version, fixed problem with licensing dialog in Windows NT 4.0. In 32-bit version, the following registry functions: RegSetValue RegQueryValue RegDelValue no longer treat a named value of [Default] as indicating the primary value for a key (and, therefore, it is now possible to access a value which is actually named "Default"). In 32-bit version, fixed problem with international language strings not being used. New registry functions (32-bit version only): RegQueryExpSz(handle, subkey) Retrieves a REG_EXPAND_SZ value from the registry. RegQueryMulSz(handle, subkey, delimiter) Retrieves a REG_MULTI_SZ value from the registry. RegSetExpSz(handle, subkey, value) Sets a REG_EXPAND_SZ value in the registry. RegSetMulSz(handle, subkey, value, delimiter) Sets a REG_MULTI_SZ value in the registry. In 32-bit version, fixed problem with RegQuery... functions when there was a backslash between the subkey string and a named value, eg: RegQueryValue(mykey, "MySubKey[MyItem]", "some data") -- this worked RegQueryValue(mykey, "MySubKey\[MyItem]", "some data") -- this didn't RegQuery, RegQueryBin, and RegSetBin can now handle longer strings (up to available WIL string space). In 32-bit version, fixed problem with OLE string parameters. In 32-bit version, fixed problem with RegQueryBin with certain values. In 32-bit version, fixed problem with RegSetDword with large values. Fixed problem with TimeSubtract, where the result could have a day of "00" (eg, "96:04:00" instead of "96:03:31"). In 16-bit version, fixed WinItemNameId. Fixed problem with BinaryHashRec crashing if there was only one record in the buffer. NetWare 3 extender 12014 First showing up in WB 96C Fixed n3FileAttrGet and n3FileAttrSet. n3FileAttrGet and n3FileAttrSet no longer support directories (use new functions n3DirAttrGet and n3DirAttrSet instead). New functions: n3DirAttrGet(dirname) n3DirAttrSet(dirname, attribs, mode) n3MapDir(net-path, local-name) n3MapRoot(net-path, local-name) With n3Map[..], it is no longer necessary to add a trailing backslash when mapping to the root of a volume. New functions: n3CapturePrt(s:server-name, s:queue-name, i:port-number, s:flags) Captures a local printer port to a Netware printer queue. n3CaptureEnd(i:port-number) Ends a printer capture. n3GetUserId(s:server-name, s:user-name, i:format) Returns the object ID corresponding to the specified user name. n3ChgPassword(s:server-name, s:user-name, s:old-password, s:new-password) Changes a user's password. n3GetNetAddr(s:server, i:flags) Returns the internetwork address of the current workstation. n3ServerInfo(s:server, i:request) Returns information on the specified Netware server. n3UserGroups(s:server, s:username) Lists groups to which the specified user belongs. Added new request #4 to n3ServerList: NetWare 4 extender 14011 First showing up in WB 96C Fixed n4FileAttrGet and n4FileAttrSet. n4FileAttrGet and n4FileAttrSet no longer support directories (use new functions n4DirAttrGet and n4DirAttrSet instead). New functions: n4DirAttrGet(dirname) Same as n4FileAttrGet, but for directory attributes. n4DirAttrSet(dirname, attribs, mode) Same as n4FileAttrSet, but for directory attributes. n4MapDir(net-path, local-name) Like n4Map, but performs a regular (non-root) map. n4MapRoot(net-path, local-name) Identical to n4Map. With n4Map[..], it is no longer necessary to add a trailing backslash when mapping to the root of a volume. New functions: n4CapturePrt(s:server-name, s:queue-name, i:port-number, s:flags) Captures a local printer port to a Netware printer queue. n4CaptureEnd(i:port-number) Ends a printer capture. n4GetUserId(s:server-name, s:user-name, i:format) Returns the object ID corresponding to the specified user name. n4ChgPassword(s:server-name, s:user-name, s:old-password, s:new-password) Changes a user's password. n4GetNetAddr(s:server, i:flags) Returns the internetwork address of the current workstation. n4ServerInfo(s:server, i:request) Returns information on the specified Netware server. n4UserGroups(s:server, s:username) Lists groups to which the specified user belongs. Added new request # to n4ServerList: 4 = all known servers (TAB-delimited list) Windows 32 extender 10005 netGetCon now accepts printer ports higher than LPT3 (up to LPT9).

WinBatch version 96D

WB 96D June 26, 1996 Fixed problem with PopMenu, when generating a file name based on an application whose class name contained characters that were not valid file name characters. PopMenu now strips off such characters when generating the file name (eg, class name of "Edit:App" becomes "EditApp.mnw"). Fixed problem with PopMenu, where it would occasionally fail to launch the editor when editing/creating a menu file. In the 16-bit version, WinBatch now does not try to load CTL3DV2.DLL at startup unless the DLL is located in the Windows System directory. Compiler now searches path for extender DLL's, if they are not found in the compiler directory, when compiling a large EXE. Fixed problem with FileMenu locking up in some cases if the user rapidly clicked twice on a menu. Fixed problem with BoxDrawText with "alignment" = 32 (adjust font), where sometimes the displayed font was too large. Added two new alignment flags to BoxDrawText: 64 Right-justify text by adding space between words 128 Clip (truncate) text if it doesn't fit within specified rectangle In FileMenu, fixed a problem with the status bar descriptions under Windows NT 4.0. DLL 2.3dbm First showing up in WB 96D New functions: RegEntryType(i:handle, s:subkey) Returns the type of data for the specified subkey. In the 16-bit version, the return value will always be 1. RegQueryEx(i:handle, s:subkey, s:delimiter, i:type) Retrieves a value from the registry. In the 16-bit version, "type" must be 1. RegSetEx(i:handle, s:subkey, s:value, s:delimiter, i:type) Sets a value in the registry. FileVerInfo(s:filename, s:language-key, s:resource-string) Returns a version resource string from a binary file. WinWaitExist(s:partial-winname, i:timeout) Waits for a top-level window to exist. Returns @TRUE if the window appeared; @FALSE if it didn't. WinWaitChild(s:partial-parent-winname, s:partial-child-winname, i:timeout) Waits for a child window to exist. New IntControl's: IntControl(41, p1, 0, 0, 0) Controls YmdHms format returned by time functions. IntControl(42, p1, 0, 0, 0) Get pointer to a binary buffer. Fixed problem with RegQueryItem, where only one item was being returned. In the 16-bit version, fixed a problem with WinMetrics(-4) returning 0 under Windows for Workgroups if a secondary network (such as Netware) was installed. FileSize no longer returns an error if a wildcard file mask is specified which does not match any files; it now returns 0. All functions which take a YmdHms string as a parameter will now accept a string in the format "YYYY:MM:DD:HH:MM:SS" (ie, containing a 4-digit year). Fixed problem with time functions which return a YmdHms string (such as TimeAdd) with years >= 2000. Fixed problem with Delay function where the current year was >= 2000. Changed TimeJulianDay so that it treats 2-digit years in the input string as falling within the range 1950-2049 (eg, "96:04:01" is April 1, 1996). This is consistent with the behavior of the other time functions. Previously, TimeJulianDay was not adjusting the year, so that "96:04:01" would be treated as April 1, 0096. To retain the old behavior, you can specify a full 4-digit year (eg, "0096:04:01"). TimeJulianDay now correctly calculates julian dates for leap years that are evenly divisible by 400 (such as 2000). AddExtender and DllCall/DllLoad now also look for the specified DLL in the directory where the WIL Interpreter application is located. In the 32-bit version, SendKey (and SendKeysTo and SendKeysChild) now attempt to wait until the active application is ready to accept input before sending each keystroke. This can be disabled with IntControl 43 (see "DLL 2.3ebm" section, below). Fixed problem with RegQueryBin truncating long values. In the 16-bit version, fixed problem with FileAppend where the target was a UNC. Fixed memory allocation problem with WinWaitClose. The 32-bit version can now process batch and menu files which were saved by Notepad as Unicode text files. It may be able to handle Unicode text files created with other editors as well, as long as the first character in the file is a hexadecimal FFFE or FEFF. In the 32-bit version, the Dialog and DialogBox functions now properly set the current working directory when the user selects a file from a listbox. Fixed problem where an error that occurred in a CALL'ed script would not cancel the calling program. In the 32-bit version, fixed problem with FileCopy, FileMove, and FileAppend causing a crash if the specified source file did not exist and the specified target was a UNC. When AddExtender fails with an error 3437, it now displays a message box with some idea of what the problem may be, or with a Windows error code. NetWare 3 extender 12015 First showing up in WB 96D Fixed problem with n3ChgPassword. NOTE: Added "old-password" parameter to n3ChgPassword (changed from 96C). NetWare 4 extender 14012 First showing up in WB 96D Fixed problem with n4ChgPassword, when using bindery emulation. In the 32-bit version, fixed problem with Unicode initialization errors when using the Netware NT client. Windows 32 extender 10007 First showing up in WB 96D New functions: netResources(s:net-resource, i:scope, i:type, i:usage) Itemizes network resources.

WinBatch version 96E

WB 96E June 27, 1996 New IntControl: IntControl(1001, p1, 0, 0, 0) (32-bit only) Set service process status. For window class names beginning with "Afx", PopMenu now bases the menu name upon the application's module name instead of the class name. DLL 2.3ebm First showing up in WB 96E New IntControl: IntControl(43, p1, 0, 0, 0) (32-bit only) Enable/disable "WaitForInputIdle".

WinBatch version 96F

WB 96F Oct 18, 1996 In BoxTextFont, expanded the "pitch & family" parameter to now be "pitch & family & character-set": The character set flags will not override the typeface specified by the font "name" parameter. If you would rather specify a character set than a specific typeface, specify a blank string ("") for font "name". Note: If you wish to use a Kanji (Japanese) font, you must specify the SHIFTJIS_CHARSET flag (32768). New IntControls: IntControl(1002, p1, 0, 0, 0) Sets icon display state. IntControl(1003, p1, 0, 0, 0) Prevents WinBatch icon from being opened. IntControl(1004, 0, 0, 0, 0) Returns the file name of the current WinBatch program. Fixed a problem with BoxButtonWait returning erroneously when the Enter or Escape key was pressed. Fixed a problem where FileMenu was getting added twice to the menus of shortcut files. This occurred if a user removed the "IsShortcut" value from the "lnkfile" key in the registry. Fixed a problem with excessive repainting in the Box functions. The compiler can now be used to compile an encoded or encrypted WBT to an EXE file. If you try to compile a source WBT which is already encoded or encrypted to a target type which is an encoded or encrypted WBT, no processing will be done on the file and the target will be identical to the source. In other words, you cannot use the compiler to re-encode or re-encrypt a WBT, or convert an encoded WBT to an encrypted WBT (or vice versa). DLL 2.3fbn First showing up in WB 96F New functions: FindWindow(s:class-name) Returns the window title matching a specified class name. RegConnect(s:computer-name, i:handle) (32-bit only) Connects to a predefined registry handle on another computer. RegQueryKeys(i:handle) Returns a tab-delimited list of subkey names under a specified key. StrFixLeft(base-string, pad-string, length) Pads or truncates the left side of a string to a fixed length using bytes. StrFixCharsL(base-string, pad-string, length) Pads or truncates the left side of a string to a fixed length using characters. BinaryOleType(i:bin-handle, i:type, i:reserved-1, i:reserved-2, i:reserved-3) Specifies how a binary buffer will be used by OLE functions. DiskVolInfo(root-path, request#) (32-bit only) Returns information on a file system volume. Yields(i:count) Provides time for other windows to do processing. RegLoadHive(i:handle, s:subkey, s:filename) (32-bit only) Loads a hive into a registry subkey. RegUnloadHive(i:handle, s:subkey) (32-bit only) Unloads a hive from the registry. StrIndexNc(s:string, s:sub-string, i:start, i:direction) Searches a string for a sub-string, ignoring case. New IntControls: IntControl(44, p1, 0, 0, 0) Returns the class name for specified window handle. IntControl(45, p1, 0, 0, 0) (32-bit only) Enable/disable "SendKey speedup" in DOS programs in Windows NT. IntControl(46, p1, 0, 0, 0) (32-bit only) Set window retry timeout. IntControl(47, p1, 0, 0, 0) Closes another WinBatch program. IntControl(48, p1, 0, 0, 0) Closes a DOS program. IntControl(49, p1, 0, 0, 0) Add system menus to popup windows. IntControl(50, p1, 0, 0, 0) Controls whether "Go to web page" button is added to error boxes. IntControl(51, p1, 0, 0, 0) (32-bit only) Specifies flags for CreateProcess. Fixed problem with RegDelValue under Windows NT. In the 32-bit version, fixed problem with Ctrl-Break not working during a RunWait. In the 32-bit version, FileCopy can now copy files to COM and LPT ports (the 16-bit version has always been able to do this). Increased the maximum number of extender entries from 100 to 200. In the 32-bit version of FileVerInfo, if you specify a blank string for "language-key", it will first try to look up the item under the language key "040904E4" (U.S. English w/ Windows Multilingual character set). If that fails, it will then try the key "040904B0" (U.S. English w/ Unicode character set). FileVerInfo now returns a blank string ("") if the specified item was not found, instead of returning an error. Fixed problem passing the number -2147483648 as a string parameter to functions. In the 32-bit version, fixed FileExist so that it actually returns a value of 2 (as documented) if the file is open by another application. It was returning a 1. Fixed problem with the Random() function crashing if a negative number was specified. Added new request #'s for WinMetrics: -6 pixels per horizontal dialog unit (rounded to an integer) -5 pixels per vertical dialog unit (rounded to an integer) Fixed problem with Debug displaying a return value of 0 for the last command in a script, if there was more than one blank line at the end of the script file. Fixed "Opening parenthesis missing" error when using a variable name such as 'max_users', where the portion of the variable name which preceded the underscore (ie, 'max') was the same as the name of a WIL function. In 32-bit version, fixed problem with Wallpaper() function in Windows NT 4.0. In 32-bit version, fixed problem with Display() function not timing out in some unusual cases. If you do an Exit from a called script, it will now really exit the program instead of returning to the calling script. In 32-bit version, you can now specify a blank section name for IniItemizePvt, but the specified INI file name must be a real file, not a "virtual" file that has been mapped to the registry. In 16-bit version, fixed a problem with WinMetrics(-4) returning 0 under Windows 3.1 if a network (such as Netware) was installed. In 32-bit version, changed NetInfo: NetInfo(0) will always return the string "WINNT", regardless of the operating system. This is consistent with previous behavior. NetInfo(1) will now depend on the operating system: Under Windows NT, NetInfo(1) will return a list of installed network provider ID's, delimited with the standard file delimiter (by default, a tab). Fixed problem with Display() function causing a "DlgPointLookup Failure" if you put the Display() in a loop and held down the spacebar. In 32-bit version, improved the problem of SendKey (and SendKeysTo and SendKeysChild) sending keystrokes very slowly to DOS programs in Windows NT. The speedup seems more noticeable in NT 4.0, although there should be some improvement in NT 3.51 as well. If this new "SendKey speedup" mode causes problems, it can be disabled with the new IntControl(45). Fixed problem with using WaitForKey twice in a row to wait for the same key, where the second WaitForKey returned immediately and didn't wait. In 32-bit version, fixed problem with PlayWaveForm not working if a keyword was specified (eg, "SystemStart") instead of a filename. In 32-bit version, fixed problem with StrCmp, StrCmpi, and BinarySort, when comparing or sorting two strings which were the same except for a hyphen or apostrophe (eg, "coop" and "co-op"). StrCmp and StrCmpi would, in some cases, return 1 instead of -1 (and vice versa), and BinarySort would sort the two strings improperly. In Dialog function, fixed problem with radio buttons having text descriptions longer than 60 characters always being selected by default. In 32-bit version, changed the way the Run[..] functions launch data files: When launching data files, the Run[..] functions now retrieve the command-line parameters from the registry, as well as the application name. For example, if the command line associated with .WBT files is: "C:\Program Files\WinBatch\System\WinBatch.Exe" "%1" %2 (note the quote marks), and you use the WIL function: Run("Test Script.Wbt", "Alpha Beta") then the actual command that will be executed is: "C:\Program Files\WinBatch\System\WinBatch.Exe" "Test Script.Wbt" Alpha The quote marks from the command line (as specified in the registry) are preserved. %1 gets replaced with the name of the data file. %2 gets replaced with the first parameter from the Run function ('Alpha'), if any. If there were a %3 specified in the command line, it would have been replaced with the second parameter from the Run function ('Beta'), if any, but since there was no %3 specified the 'Beta' parameter was stripped off. If the command line specified in the registry does not contain a %1, the Run[..] functions assume that the (only) parameter to be passed to the application is the name of the data file, with quote marks around it. KeyToggleGet and KeyToggleSet now work properly in the 32-bit version. Sounds now defaults to @OFF in the 32-bit version. Fixed a problem sending Alt-key combinations and other extended keystrokes to a small number of unusual DOS programs, particularly the DOS EDIT.COM. NetWare 3 extender 12016 First showing up in WB 96F (Note: the internal version number is mistakenly set as 12015) New function: n3CaptureGet(i:port-number) Returns the name of the print queue associated with a printer capture. Fixed problem with n3ServerList(request #'s 1 and 2) returning a blank string or garbage characters in the WWN3Z32I.DLL version. In the 32-bit version, fixed problem with n3CaptureEnd returning 0 and not ending the capture. NetWare 4 extender 14014 First showing up in WB 96F New functions: n4CaptureGet(i:port-number) Returns the name of the print queue associated with a printer capture. n4ObjectList(s:context, s:parent, s:class, s:mask) Lists objects in a Directory Services tree. n4ObjectInfo(s:context, s:object, i:request) Returns information on the specified object. n4ObjectProps(s:context, s:object, s:attribute) Returns properties of the specified object. n4NameConvert(s:context, s:object, i:format) Converts an object name to a different format. In the 32-bit version, fixed problem with n4CaptureEnd returning 0 and not ending the capture. Fixed problem with n4MemberGet erroneously returning @FALSE in some cases. Fixed problem with n4ServerList(4) only returning the names of servers that were located in the current context. Windows 32 extender 11000 First showing up in WB 96F Split the Windows 32 extender (WWNET32I.DLL) into separate extenders for Windows 95 (WWW9532I.DLL) and Windows NT (WWWNT32I.DLL). The existing net[..] functions have been renamed to w95[..] and wnt[..], respectively: Old Windows 32 New Windows 95 New Windows NT -------------- -------------- -------------- netAddDrive w95AddDrive wntAddDrive netAddPrinter w95AddPrinter wntAddPrinter netCancelCon w95CancelCon wntCancelCon netDirDialog w95DirDialog wntDirDialog netGetCon w95GetCon wntGetCon netGetUser w95GetUser wntGetUser netResources w95Resources wntResources netVersion w95Version wntVersion For backwards compatability, we are continuing to distribute an extender DLL named WWNET32I.DLL which supports the existing net[..] functions. However, this DLL is a "wrapper" or "shell" which calls the appropriate platform-specific extender DLL (ie, WWW9532I.DLL or WWWNT32I.DLL). Therefore, one of these two DLL's (depending on the operating system being used) will need to be available (either in the current directory, in the same directory as WWNET32I.DLL, or in a directory on the path). Windows 95 extender 11000 First showing up in WB 96F New functions: w95ShareAdd(s:server-name, s:resource, s:share-name, i:share-type, i:flags) Shares a resource. w95ShareSet(s:server-name, s:share-name, s:comment, s:full-password, s:read-password) Sets additional share information for a resource. w95ShareDel(s:server-name, s:share-name) Un-shares a resource. w95AccessAdd(s:server-name, s:resource, s:user/group name, i:access-rights, i:flags) Adds or updates an access (permission) record for a resource. w95AccessDel(s:server-name, s:resource, s:user/group name) Removes an access (permission) record from a resource. w95ListGroups(s:server) Lists all global user groups in an NT domain. w95MemberGet(s:server, s:group, s:user) Determines if user is a member of a global group in an NT domain. w95MemberSet(s:server, s:group, s:user) Adds user to a global group in an NT domain. w95MemberDel(s:server, s:group, s:user) Removes user from a global group in an NT domain. w95MemberGrps(s:server, s:user) Lists all global groups in an NT domain to which a user belongs. w95MemberList(s:server, s:group) Lists all members of a global group in an NT domain. Windows NT extender 11000 First showing up in WB 96F New functions: wntShareAdd(s:server-name, s:resource, s:share-name, i:share-type, i:max-users) Shares a resource. wntShareSet(s:server-name, s:resource/share-name, i:share-type, s:comment, s:location) Sets additional share information for a resource. wntShareDel(s:server-name, s:resource/share-name, i:share-type) Un-shares a resource. wntAccessAdd(s:server-name, s:resource/share-name, s:user/group name, i:object-type, s:access-string) Adds or updates access (permission) records for a resource. wntAccessDel(s:server-name, s:resource/share-name, s:user/group name, i:object-type) Removes access (permission) records from a resource. wntAccessGet(s:server-name, s:resource/share-name, s:user/group name, i:object-type) Returns access (permission) records for a resource. wntListGroups(s:server, i:group-type) Lists all user groups on a server or domain. wntMemberGet(s:server, s:group, s:user, i:group-type) Determines if user is a member of a group. wntMemberSet(s:server, s:group, s:user, i:group-type) Adds user to a group. wntMemberDel(s:server, s:group, s:user, i:group-type) Removes user from a group. wntMemberGrps(s:server, s:user, i:group-type, i:flags) Lists all groups to which a user belongs. wntMemberList(s:server, s:group, i:group-type) Lists all members of a user group. wntResources2(s:net-resource, i:scope, i:type, i:usage, s:provider) Itemizes network resources. wntServiceAt(s:server, s:domain, i:server-type, s:service-name, i:flags) Lists all servers in a domain which contain a specified service. wntChgPswd(s:server/domain, s:user, s:old-pass, s:new-pass) Changes a user's password. Windows 3.1 (Basic) extender 15003 First showing up in WB 96F w3AddCon and w3GetCon now accept printer ports higher than LPT3 (up to LPT9). Windows for Workgroups (MultiNet) extender 16002 First showing up in WB 96F wnAddCon and wnGetCon now accept printer ports higher than LPT3 (up to LPT9). All functions which change the active sub-network now restore it afterwards. This fixes a problem with using NetInfo after one of the extender functions. WILX extender 11105 First showing up in WB 96F In the 32-bit version, changed xMemCompact: In Windows 95, this function is not supported and will return 0. In Windows NT, this function has been fixed to use the appropriate Win32 system calls. Since there's no distinction between local and global memory in NT, it doesn't make any difference whether you specify a 'type' of 0 or 1.

WinBatch version 96G

WB 96G Oct 21, 1996 DLL 2.3gbn First showing up in WB 96G Fixed string memory leak when comparing "floating point string" variables, eg: x = "1.25" If x != 0 Then y = 1 FileVerInfo now returns the string "NONE" if no version information is available for the specified file (previously, it returned an error). Windows NT extender 11001 First showing up in WB 96G Fixed problem with wntAccessAdd, when accessing registry keys. Windows 3.1 (Basic) extender 15004 First showing up in WB 96G Fixed problem with the extender not loading due to a "wrong platform" error.

WinBatch version 96H

WB 96H Nov 4, 1996 In compiler, fixed a problem creating an EXE if the 'TEMP' environment variable pointed to an invalid directory. DLL 2.3hbn First showing up in WB 96H You can now specify partial child window names beginning with a tilde (~) (see "DLL 2.2abj" section, above). In Debug mode, a couple of status strings were not being displayed when appropriate: "*** Debug Initialized ***" and "IF DO==>FALSE".

WinBatch version 96J

WB 96J Nov 5, 1996 Fixed problem with BoxDestroy not removing buttons. DLL 2.3jbn First showing up in WB 96J In 32-bit version, fixed problem with network licensing. Fixed problem parsing constant names which contain underscores (eg, "@ATTR_RO") (this bug first appeared in 2.3fbn). Improved MouseClick function. Double-clicks should now work better (there was a problem with some applications). In the 32-bit version, improved the method of emulating other types of clicks, especially when using modifiers such as @SHIFT and @CTRL. Fixed problem with SendMenusTo with double-byte character sets. In the Dialog function, fixed problem where the dialog would be centered on the screen if you specified a small number (less than 20 or so) for the Y (vertical) coordinate. In 32-bit version, improved the reliability of the DiskFree and DiskSize functions with drives larger than 2 gigabytes, under Windows 95 OEM Service Release 2 or higher. Under earlier versions of Windows 95, these functions may not return accurate results. Under NT, there is no problem. Windows NT extender 11002 First showing up in WB 96J New functions: wntOwnerGet(s:server-name, i:reg-key, s:resource-name, i:object-type, i:flag) Returns the owner of an object. wntOwnerSet(s:server-name, i:reg-key, s:resource-name, i:object-type, s:user/group name) Takes ownership of an object. NetWare 3 extender 12017 First showing up in WB 96J n3MsgSend now returns @FALSE if the specified user is not logged in, and returns an error if an invalid user name is specified. NetWare 4 extender 14015 First showing up in WB 96J Fixed problem with n4CaptureGet returning an incorrect name in some cases. Changed n4CaptureGet to return an abbreviated name relative to the current context (eg, "Printer1.Print") instead of a canonical name (eg, "Printer1.Print.Sales"). n4MsgSend now returns @FALSE if the specified user is not logged in, and returns an error if an invalid user name is specified.

WinBatch version 96K

WB 96K Dec 9, 1996 Fixed problem (introduced in 96J) with large EXE's failing to extract the embedded DLL's if launched from a UNC (with a "Disk space lookup" error). DLL 2.3kbn First showing up in WB 96K Fixed problem (introduced in 96J) with FileCopy, FileMove, and FileAppend failing if the target was a UNC (with an "Insufficient free space" error). Fixed problem with DirExist returning @FALSE for a top-level UNC (eg, "\\FredsPC\C").

WinBatch version 96M

WB 96M Dec 12, 1996 DLL 2.3mbn First showing up in WB 96M In 32-bit version, fixed problem with SendKey causing a system crash under NT 4.0 when sending keystrokess to two different windows and switching back and forth rapidly between them. NetWare 3 extender 12018 First showing up in WB 96M Fixed problem with n3GetMapped truncating the server name parameter after 14 characters (instead of 16). NetWare 4 extender 14016 First showing up in WB 96M Fixed problem with n4GetMapped truncating the server name parameter after 14 characters (instead of 16).

WinBatch version 97A

WB 97A Jun 12, 1997 New IntControl's: IntControl(1005, p1, 0, 0, 0) Gets or starts shutdown script mode. IntControl 1004 now returns a full path for compiled WinBatch EXE's. In 32-bit version, fixed problem with compiler where large (standalone) compiled EXE's run from a floppy drive were extracting the DLL to the floppy drive instead of to the Windows directory. Improved the internal version information in the executables and DLL's. Increased the amount of memory available for strings from 32000 bytes to 65500 bytes. DLL 2.4abp First showing up in WB 97A New functions: RegExistKey(handle, subkey-string) Checks whether a registry key exists. RegExistValue(handle, subkey-string) (32-bit only) Checks whether a value for a registry key exists. StrIndexWild(string, pattern, start) Finds wildcarded text within a larger string. StrLenWild(string, pattern, start) Returns the length of wildcarded text within a larger string. StrSubWild(string, pattern, start) Extracts a substring matching wildcarded text from within a larger string. ClipGetEx(format) Returns the contents of the Windows clipboard in a specified format. WinItemizeEx(s:partial-winname, i:multiple, i:hidden) Returns the full name of window(s) matching a partial window name. Changed DateTime/TimeDate and FileTimeGet to return a Day/Night code (eg, AM or PM) of from 0 to 4 characters (depending on what is set in the user's current International/Regional settings), instead of a fixed 2-character string, in order to support double-byte character sets. Therefore, the length of the string returned by DateTime/TimeDate will now vary from 22 to 26 characters long, and the length of the string returned by FileTimeGet will now vary from 15 to 19 characters long, instead of being a fixed length. In the ItemExtract function, you can now specify -1 for "index" to return the last item in the list. In the Environment() function, the maximum value length has been increased from 256 bytes to 1280 bytes. It will return a blank string ("") for environment variables whose values are longer than 1280 bytes. FileSize no longer returns 0 if one of the specified files does not exist. FileDelete and DirRemove no longer return an error if one of the specified files or directories does not exist. In 32-bit version under international (non-US) versions of Windows NT, fixed problem with licensee names containing certain extended characters (eg, Kanji). In 32-bit version, the Run[..] commands now display a more informative error message on failure. In 32-bit version under Windows 95 and Windows NT 4.0, dialog boxes created with the Dialog command now use the default GUI font instead of the system font. In 32-bit version, fixed problem with functions that test for file existence when the full path and filename was longer than 128 characters. Fixed problem with BinaryIndex (and BinaryIndexNc) returning the offset past the end of the buffer (instead of 0) if the search string was blank and no non-NULL characters were found. Fixed problem with BinarySort causing random crashes if the key type was set to @WORD1 or @WORD2. Added a parameter to IntControl(50). P2 can now specify the URL of the web page to be launched when the user clicks on the "Go to Tech Support Web Page" button. If p2 is "" or 0, no change is made to URL that is currently set. The default is: IntControl(50, 1, "http://techsupt.winbatch.com/", 0, 0) Fixed a problem with OLE calls crashing if the called function returned a NULL pointer; they now return a blank string in this case. In 32-bit version, added a tiny delay to WinPlaceGet and WinPlaceSet, to give newly-repositioned windows a chance to "settle down" before retrieving their coordinates, making the returned values more reliable. Fixed problem with IsNumber and IsFloat returning TRUE for some high ASCII characters. Windows 95 extender 11001 First showing up in WB 97A New function: w95FileClose(s:server-name, s:file-pathname) Close all network connections to a file. w95ServiceAt(s:server, s:domain, i:server-type, s:service-name, i:flags) Lists all servers in a domain which contain a specified service. w95ShareInfo(s:server-name, s:share-name, i:request) Returns information about a shared resource. w95UserInfo(i:request) Returns information about the currently logged-on user. Windows NT extender 11003 First showing up in WB 97A New functions: wntFileClose(s:server-name, s:file-pathname) Close all network connections to a file. wntAccessList(s:server-name, s:resource/share-name, i:object-type, i:flags) Returns list of users who have access (permission) records for a resource. wntShareInfo(s:server-name, s:resource/share-name, i:share-type, i:request) Returns information about a shared resource. wntGroupInfo(s:server-name, s:group, s:group-type, i:request) Returns information about a group. wntUserInfo(i:request) Returns information about the currently logged-on user. wntSvcStart(s:server, s:service-name, i:flags, s:params, s:delimiter) Starts a service. wntSvcControl(s:server, s:service-name, i:flags, i:control-code) Stops or controls a service. wntSvcStatus(s:server, s:service-name, i:flags, i:request) Changed wntResources2 to ignore 'net-resource' and 'provider' unless 'scope' is 2. This avoids an "invalid parameter" error from Windows. NetWare 3 extender 12019 First showing up in WB 97A n3CapturePrt was truncating the queue name at 47 characters; it now accepts queue names up to 65 characters long (the maximum length in Netware). NetWare 4 extender 14017 First showing up in WB 97A New functions: n4LogoutTree(s:context, s:tree) Logs out of Directory Services. n4UserGroupEx(s:server-name, s:user-name, s:context) Returns a list of groups to which the specified user belongs, in the specified context. n4GetContext(i:request) Returns the current user's default context or tree. WILX extender 11106 First showing up in WB 97A New function: xEjectMedia(s:drive) (32-bit version only) Ejects removable media from a device.

WinBatch version 97B

WB 97B Jun 23, 1997 DLL 2.4bbp First showing up in WB 97B In the Run... commands in the 32-bit version, fixed a problem with not looking up the application path in the registry if the "program-name" parameter contained any path information.

WinBatch version 97C

WB 97C Jun 26, 1997 DLL 2.4cbp First showing up in WB 97C New function: ShortcutDir(s:name) (32-bit only) New IntControl: IntControl(52, p1, 0, 0, 0) (32-bit only) Set dialog font. Fixed problem with OLE calls crashing if they returned a NULL sub-object. They now return 0. Eg: App = ObjectOpen("Excel.Application") Sheet = App.ActiveSheet ; ** returns 0, because there is no worksheet Fixed problem with dialog boxes created with the Dialog function, where if you typed a file mask into a editbox associated with a filelistbox, there would be garbage characters at the end of the file mask. Fixed problem with BinaryIndex and BinaryIndex searching for characters with ASCII values >= 128. IntControl(5) now works in the 32-bit version. Before, it had no effect, and hidden and system files were always included. The default is now to exclude hidden and system files, as documented. Windows 95 extender 11002 First showing up in WB 97C New function: w95IsNTServer(s:server-name) Determines whether a computer is an NT server (or workstation). Fixed problem with w95UserInfo crashing if RADMIN32.DLL was not available.

WinBatch version 97D

WB 97D Aug 21, 1997 In 32-bit version, fixed (hopefully) intermittent problem with FileMenu crashing, notably when the files in the Explorer directory window changed. In 16-bit version, fixed problem with the WinBatch box window stealing the input focus from an application window on top of WinBatch. Fixed probblem with the compiler not finding the OLE DLL if the DLL was located in the compiler directory but was not on the path. DLL 2.4dbp First showing up in WB 97D Fixed problem with the FileCopy and FileMove commands, if the overwrite warning option was specified and the file already existed. In the "Confirm File Replace" dialog that was displayed, the "Use Newer All" and "Use Older All" buttons did not work properly. Dialog Editor 97D First showing up in WB 97D In 32-bit version under Windows 95 and Windows NT 4.0, can now select GUI or system font (via "Edit" menu items). Defaults to GUI font, like the WIL Dialog() command does. Windows NT extender 11004 First showing up in WB 97D Increased the maximum length of the server, resource, and username parameters in the wntAccess[..] and wntOwner[..] functions. NetWare 3 extender 12020 First showing up in WB 97D In the n3MsgSend and n3MsgSendAll functions, increased the maximum length of the message string from 57 characters to 254 characters, when using NetWare client version 3.11 or later. NetWare 4 extender 14018 First showing up in WB 97D In the n3MsgSend and n3MsgSendAll functions, increased the maximum length of the message string from 57 characters to 254 characters.

WinBatch version 98A

WB 98A Jun 15, 1998 WinBatch compiler now accepts a single file name as a command-line parameter (such as via drag-and-drop). WinBatch compiler no longer converts output file name to lower case. WinBatch compiler now removes end-of-line comments as well as entire comment lines when optimizing WBT's. Added the ability to embed external files when running or compiling a WinBatch script, by using the new "#include" pre-processor directive. The syntax is: #include "filename" DLL 2.5abq First showing up in WB 98A New functions: BinaryCompare(handle1, offset1, handle2, offset2, count) Compares portions of two binary buffers. BinaryReadEx(handle, binary-offset, filename, file-offset, count) Reads a portion of a file into a binary buffer. BinaryWriteEx(handle, binary-offset, filename, file-offset, count) Writes a portion of a binary buffer to a file. BinaryAnd(target-handle, target-offset, source-handle, source-offset, count) Performs a bitwise AND on portions of two binary buffers. BinaryOr(target-handle, target-offset, source-handle, source-offset, count) Performs a bitwise OR on portions of two binary buffers. BinaryXor(target-handle, target-offset, source-handle, source-offset, count) Performs a bitwise XOR (exclusive OR) on portions of two binary buffers. BinaryConvert(handle, source-type, target-type, code-page, flags) Converts a binary buffer. This function can be used to perform the following types of conversions: 8-bit <-> Unicode Multibyte <-> Unicode ANSI <-> OEM -> Uppercase -> Lowercase BinaryClipGet(handle, format) Reads the contents of the Windows clipboard into a binary buffer. BinaryClipPut(handle, format) Writes a binary buffer to the Windows clipboard. FileTimeGetEx(filename, time-field) (32-bit only) Gets extended time information for a file or directory. FileTimeSetEx(file-list, YmdHms, time-field) (32-bit only) Sets extended time information for one or more files. ObjectAccess(app.objname, create-flag) Opens or creates an OLE 2.0 Automation object. DirSize(s:dir-name, i:flags) Finds the total size of a directory. AskDirectory(prompt, browse-root, start-dir, confirm-prompt, flags) (32-bit, Win95/NT40 only) Displays a directory browse dialog box, and returns the selected directory name. New IntControls: IntControl(53, p1, 0, 0, 0) Set line terminator type for FileWrite. IntControl(54, p1, p2, 0, 0) Keep window on top. IntControl(56, p1, 0, 0, 0) Terminate an application. IntControl(57, p1, 0, 0, 0) (32-bit, Windows 95 only) Disable/enable system keys. IntControl(58, p1, 0, 0, 0) (32-bit only) Set system time. IntControl(59, p1, p2, 0, 0) Sends a WM_WININICHANGE or WM_SETTINGCHANGE message. IntControl(60, p1, p2, 0, 0) Sends a WM_DEVMODECHANGE message. IntControl(61, p1, 0, 0, 0) (32-bit only) Sets WinActivate() method. IntControl(62, p1, 0, 0, 0) (32-bit only) Sets dialog activation method. The date string returned by the TimeDate function now includes a 4-digit year, if this was configured via Control Panel. In 32-bit version under Windows NT, RegDeleteKey now deletes a key even if it has subkeys (under Windows 95 it has always done this). Added additional special characters to the SendKey (and SendKeysTo and SendKeysChild) functions: Key SendKey equivalent --- ------------------ 0 on numeric keypad {NUMPAD0} 1 on numeric keypad {NUMPAD1} 2 on numeric keypad {NUMPAD2} 3 on numeric keypad {NUMPAD3} 4 on numeric keypad {NUMPAD4} 5 on numeric keypad {NUMPAD5} 6 on numeric keypad {NUMPAD6} 7 on numeric keypad {NUMPAD7} 8 on numeric keypad {NUMPAD8} 9 on numeric keypad {NUMPAD9} * on numeric keypad {NUMPAD*} + on numeric keypad {NUMPAD+} - on numeric keypad {NUMPAD-} . on numeric keypad {NUMPAD.} / on numeric keypad {NUMPAD/} Enter on numeric keypad {NUMPAD~} (32-bit only) In 32-bit version, the Run[..] commands can now be used to launch a shortcut to a non-executable, such as a document or a directory. However, the "Wait" option is ignored in this case. Fixed problem with TimeSubtract failing if the result was less than 1 year. If the "length" parameter of StrSub is past the end of the string, it now extracts to the end of the string, instead of returning a blank string. Changed FileRead to treat line feeds as line terminators, instead of carriage returns. This means that FileRead now supports both DOS files (which have CR/LF terminators) and UNIX files (which have LF terminators). Fixed problem with IntControl(5) in the 32-bit version. In the Dialog function, ampersands ("&") are no longer being converted to underscores in static text and varying text fields. Added parameter to IntControl(49): IntControl(49, p1, p2, 0, 0) p2 = specifies the value that a dialog box (created using the "Dialog" function) will return if the user closes the dialog without pressing one of the pushbuttons in the dialog (eg, by pressing , or by clicking on the "Close" icon in the title bar). The default is 1. If a dialog returns 0, processing will be transferred to the label in the script marked ":Cancel" (if any). IntControl(40) now correctly sets the share mode used when opening a file in "APPEND" mode with FileWrite(previously, it was only affecting files opened in "WRITE" mode). Fixed problem with input focus being lost when a dialog (created using the "Dialog" function) was minimized and restored. In 32-bit version, fixed problem prepending the path specified in the registry under "App Paths" when launching a program, if the existing path was more than 300 characters long. In 32-bit version, FileTimeGet no longer updates the file's last-access time. SendKey (and SendKeysTo and SendKeysChild) now turns caps lock off while sending keystrokes (and restores the previous state when it is done). This fixes a problem that was occurring when caps lock was on, and a shifted key combination was specified [eg, SendKey("+a")], resulting in a lower-case character being sent. Although this was faithfully duplicating the behavior of typing keystrokes manually ("reverse caps lock"), the intended behavior is for SendKey to ignore the caps lock state, and to therefore behave consistently whether caps lock is on or off. In 32-bit version under Windows 95, fixed problem using KeyToggleSet twice in a row. Fixed bug in StrIndexWild that could cause program to hang. Improved parameter handling for OLE functions: Fixed string memory leak with OLE functions. The following functions, which return a date string in YmdHms format, now return a 4-digit year by default. This can be changed using IntControl(41): FileYmdHms TimeAdd TimeJulToYmd TimeSubtract TimeYmdHms Under Windows 98 and NT 5.0, fixed problem with WinActivate and SendKeysTo not working, and problem with WIL dialogs not being activated. By default, an alternate window activation method will be used under these operating systems, which can be modified with IntControl(61) and IntControl(62). Under Windows 98 and NT 5.0, messages boxes are now brought to the foreground, but they will not be activated. DiskScan no longer adds a trailing delimiter to the returned list. DiskFree and DiskSize now accept lists with a trailing delimiter. In the "overwrite warning" dialog in FileCopy and FileMove, if the file name is too long to be displayed in its entirety, the beginning and end of the name are now displayed, instead of the name simply being truncated. In 32-bit version, the Wallpaper() function now supports the Active Desktop wallpaper in Internet Explorer 4.0. Fixed problem with StrIndexWild returning 0 if an asterisk ("*") in the wildcard pattern matched 0 characters in the string. In 32-bit version, improved the way FileFullName handles relative path names, when the current directory is a UNC (network share). The following functions no longer return a delimiter at the end of the list: DirItemize FileItemize IntControl(31) ItemInsert ItemRemove ItemSort NetInfo WinItemize WinItemChild WinItemNameId Functions which take a date/time string in YmdHms format now return an error if "24" is specified as the hour. Windows 95 extender 11003 First showing up in WB 98A The following functions have been renamed and moved to the new Windows 95/RADMIN (remote administration for Windows NT) extender. The existing functions will continue to work in this version, but may be removed or modified in future versions. Note that some of the parameters in the new DLL have been changed (specifically, a "group-type" parameter has been added to the w95ListGroups and w95Member[..] functions). Refer to the help file for the new extender for further information. Old name New name ------------- ------------- w95ListGroups w9xListGroups w95MemberDel w9xMemberDel w95MemberGet w9xMemberGet w95MemberGrps w9xMemberGrps w95MemberList w9xMemberList w95MemberSet w9xMemberSet w95ServiceAt w9xServiceAt w95UserInfo w9xUserInfo New functions: w95ServerType(s:server-name) Returns a server's platform. w95ServiceInf(s:server-name) Returns a server's type. w95ShareAdd now creates persistent shares (ie, they do not disappear when you reboot). In 32-bit version, IntControl(68) (shut down computer) now does a power-off, if supported by the computer. Windows NT extender 11005 First showing up in WB 98A New functions: wntUserProps(s:server-name, s:user-name, i:request) Returns information about a network user. wntServerList(s:server-name, s:domain-name, i:server-type) Lists servers in a domain. wntUserAdd(s:server-name) Adds a user account. wntUserAddDat(s:element, s/i:value) Sets parameter information for wntUserAdd. wntUserDel(server-name, user-name) Deletes a user account. wntServerType(s:server-name) Returns a server's platform. wntServiceInf(s:server-name) Returns a server's type. wntUserGetDat(s:server-name, s:user-name, s:element) Returns parameter information for a user account. wntUserSetDat(s:server-name, s:user-name, s:element, s/i:value) Modifies parameter information for a user account. wntUserRename(s:server-name, s:old-username, s:new-username) Renames a user account. In wntAccessAdd and wntAccessDel, added additional values for "object-type": 301 directory in an NTFS partition, and all its subdirectories 302 directory in an NTFS partition, and all files in the directory 303 directory in an NTFS partition, and all its subdirectories, and all files in the directory and all its subdirectories 401 registry key, and all its subkeys wntFileClose now closes all connections to a file, instead of just the first one. It also now returns the number of connections which existed (and were closed) for the specified file. wntChgPswd can now be used to specify a new password without knowing the old password, if you are a member of the Administrators or Account Operators local group. To do this, specify "*UNKNOWN*" as the old password. In this case, the "user" parameter must specify an actual user name (ie, it cannot be a blank string). NetWare 4 extender 14019 First showing up in WB 98A New function: n4SetContext(s:context, s:tree) Changes the current user's default context and/or tree. n4ObjectProps now supports integer values, and some (but not all) other non-string value types. Unsupported types will now be returned as blank strings ("").

WinBatch version 98B

WB 98B Jun 24, 1998 In 32-bit version, the compiler now allows you to specify a tech support URL (web page) to be used if an error occurs in the script (under "Settings"). This can be overridden using IntControl(50). In 32-bit version, the compiler now allows you to specify version information strings to be embedded in the EXE (under "Version Info"). The compiler now creates a configuration file for each source file you compile. It will be placed in the same directory as the source file, and will have the same base name with an extension of ".CMP". For example, if you compile "C:\UTIL\TEST.WBT", it will create a configuration file named "C:\UTIL\TEST.CMP". The compiler now allows you to specify additional files to be embedded in a large EXE (under "Other files"). The compiler no longer supports automatic batch mode. If you run it with command-line parameters, it will bring up the interactive interface with the specified source file and output type pre-selected. The ".DAT" file format for extenders to be embedded by the compiler has changed. The new format is a text file with the first line being the description of the file, and one or more additional lines listing files to be embedded. The files may contain a full path; if a file doesn't have path information, the compiler will look for it first in the compiler directory, then on the path. For example: Novell NetWare 4.x wwn4z32i.dll wwn4z16i.dll For backwards compatability, the second line of the .DAT file may contain a list of files, delimited by commas. In 32-bit version, the compiler now supports embedded file names longer than 16 characters, and no longer converts embedded file names to upper case. In 32-bit version, the compiler now has an option to have the script run hidden (under "Settings"). Changed BoxNew so that if you create a new box which covers or overlaps an existing box, the most recently created box will be on top. DLL 2.5bbq First showing up in WB 98B New functions: BinaryTagInit(i:buffer, s:start-tag, s:end-tag) Initializes a binary tag operation. BinaryTagFind(s:tag-struct) Finds the next binary tag. BinaryTagExtr(s:tag-struct, i:flags) Returns the text between the last-returned pair of binary tags. BinaryTagRepl(s:tag-struct, s:new-string) Replaces a binary tag with text. BinaryIndexEx(handle, offset, string, direction, i:match-case) Searches a buffer for a string. ItemSortNc(list, delimiter) Sorts a list, ignoring case. In 32-bit version of FileVerInfo, if you specify a blank string for "language-key", it will try to look up the item under the following language keys, in the specified order: In 32-bit version, changed method for converting floating point numbers to strings. The new method should produce fewer anomolies, but in some cases the results will be slightly different than the previous method. Fixed problem with BinaryPokeStr letting you store a string that was one byte larger than the size of the buffer. Fixed problem with BinaryIndex and BinaryIndexNc failing if the string was found at the very end of the text in the buffer (ie, right before the EOD). WinActivate no longer resets a window's "stay-on-top" attribute. Fixed a problem in dialog boxes, where pressing the "Enter" key would sometimes select the "OK' button instead of the highlighted pushbutton. Fixed a problem with OLE calls causing a 3130 error if they were supposed to return an object handle, but the function call failed (ie, returned 0), and the return value was not assigned to a WIL variable in the script. The built-in variables "param1" through "param9" are now correctly undefined for parameters which are not passed, when making multiple Call's. Added 2 additional activation methods to IntControl(61) and IntControl(62): P1 Method to use -- ------------- 3 Change foreground lock timeout. 4 Attach to the input thread of the foreground window. Changed the default method in Windows 98 and NT 5.0 to "3". AskDirectory now handles "start-dir" having a trailing backslash. NetWare 3 extender 12022 First showing up in WB 98B New functions: n3FileTimeGet(s:filename, i:time-field) Gets Netware time information for a file. n3DirTimeGet(s:dirname, i:time-field) Gets Netware time information for a directory. NetWare 4 extender 14020 First showing up in WB 98B n4FileTimeGet(s:filename, i:time-field) Gets Netware time information for a file. n4DirTimeGet(s:dirname, i:time-field) Gets Netware time information for a directory. Fixed problem with n4MemberSet not completely adding the user to the group. Fixed problem with n4MemberDel deleting all members in the specified group.

WinBatch version 98C

WB 98C Sep 18, 1998 New IntControl: IntControl(1007, p1, p2, p3, p4) (32-bit only) (Requires Windows 95+ or NT 4.0+) Add/remove/check tray icon. Fixed problem with compiler displaying an "Uninitialized variable" error if certain options were chosen, and there was no "LastSource=" setting in the compiler section of WWW-PROD.INI (which would have been the case if this was the first time the compiler was run). The #include directive will now also look for the specified file (if it does not contain path information) in the same directory as the script file being run or compiled Fixed problem with the compiler always using ".EXE" as the extension when reloading previous configurations, even when the output was a .WBC file. DLL 2.5cbq First showing up in WB 98C New Functions: FileCopyAttr(source-list, destination, warning, s:attributes) Copies files, and sets file attributes. FileMoveAttr(source-list, destination, warning, s:attributes) Moves files, and sets file attributes. TimeDiff(s:time-value-1, s:time-value-2) Returns the difference between two points in time. New IntControls: IntControl(63, p1, p2, p3, p4) Sets coordinates for AskFileText and AskItemList windows. IntControl(64, 0, 0, 0, 0) (32-bit only) Gets the exit code returned by the last program run. The windows displayed by AskFileText and AskItemList can now be resized by the user. In 32-bit version, the "Tile" parameter of the Wallpaper() function has a new option: 2 = Stretch This is available in Windows 98, and in Windows 95 with "Plus" installed. Fixed a problem in dialog boxes, where pressing a hotkey corresponding to the "OK" button (ie, the pushbutton with a value of 1) would select the highlighted pushbutton instead, if the highlighted pushbutton was the first control in the dialog and the focus had not previously been switched away from it. In 32-bit version, fixed problems with floating point to string conversions. Fixed problem (again) with TimeSubtract, where the result could have a day of "00" (eg, "96:04:00" instead of "96:03:31"). The existing documentation is not clear on the purpose or usage of the TimeSubtract function. TimeSubtract is designed to subtract a time-difference from a time-value: TimeSubtract(s:time-value, s:time-difference) "time-value" is a valid date-time string, in YmdHms format. "time-difference" is an amount of time to be subtracted from "time-value", in YmdHms format. The result is a time string in YmdHms format. Examples: ; Subtract 1 day from 9/1/98 (at midnight) TimeSubtract("1998:09:01:00:00:00", "00:00:01:00:00:00") ; Subtract 48 hours from the current time TimeSubtract(TimeYmdHms(), "00:00:00:48:00:00") TimeSubtract is NOT designed to determine the difference between two points in time. For that, use TimeDiffDays, TimeDiffSecs, or the new TimeDiff function (above). Adjusted the way TimeAdd and TimeSubtract deal with cases where you are adding or subtracting a certain number of months, and the result would be an invalid date. For example: TimeAdd("1998:08:31:00:00:00", "00:01:00:00:00:00") Here, you are asking to add one month to August 31, but there are only 30 days in September and therefore there is no September 31. In previous versions, the result would have been October 1 (ie, there are 31 days in August, so add 31 days). In this new version, it will no longer wrap the month add/subtract operation past the end of a month, so the result will now be September 30. Similarly, in this example: TimeSubtract("1998:10:31:00:00:00", "00:01:01:00:00:00") which subtracts one month and one day from October 31, the result will now be September 29, not September 30. That is to say, it first subtracts the month(s), adjusts the result to the last day of the month if necessary, and then subtracts the day(s) (and hours, minutes, seconds). In 32-bit version, added an additional option to IntControl(28): 2 = GUI font (Windows 95+ and NT 4.0+ only) Note that this option applies to AskLine (and AskPassword), as well as to AskFileText and AskItemList. BinaryClipGet now stops reading clipboard data at the first NULL character for text format types (1, 7, and 13). BinaryClipPut now adds a NULL terminator to the data being written to the clipboard for text format types (1, 7, and 13). Windows NT extender 11006 First showing up in WB 98C New functions: wntRasUserGet(s:server-name, s:user-name, i:request) Gets RAS information for a user. wntRasUserSet(s:server-name, s:user-name, i:privilege, s:phone-number) Sets RAS information for a user. wntRunAsUser(s:domain/server, s:user-name, s:password, i:login-type, i:flags) Run as a different user.

WinBatch version 98D

WB 98D Sep 29, 1998 PopMenu now puts double-quotes around the menu file name when launching the editor. PopMenu now attempts to return the focus to the previously-active window after executing a menu item. DLL 2.6dbr First showing up in WB 98D New functions: DebugTrace(i:mode, s:log-file) Outputs debug information to a file. WinItemProcID(i:process-id, i:flags, i:return-type) Returns a list of windows for the specified process. You can now obtain the process ID of an application that is launched with the RunShell function by specifying @GETPROCID as the "waitflag". This is the same as specifying @NOWAIT, except that on success the function will return the process ID of the application that was launched. This process ID can be used with the WinItemProcID function (see above). The process ID may be a negative number. If you use RunShell to launch a shortcut to a special (non-executable) shortcut (eg, a dial-up networking item), a process ID cannot be obtained. Instead, a 1 will be returned to indicate success. In all cases, a return value of 0 indicates failure. Fixed problem with TimeDiff returning a negative number for the month field, in certain cases. The date string returned by the FileTimeGet function now includes a 4-digit year, if this was configured via Control Panel. In 32-bit version, fixed problem assigning string properties to OLE objects (they weren't being properly converted to Unicode, so looked like gibberish). Fixed problem with NetInfo(1) missing some installed clients under Windows 95, in unusual cases. Fixed problem with BinaryIndexEx returning 0 instead of -1, if the string being searched for would extend beyond the limits of the binary buffer. Windows NT extender 11007 First showing up in WB 98D New function: wntMemberLst2(server-name, group, group-type) Lists all members of a user group, with domains. Modified the format of the "acct_expires" element in wntUserAddDat, wntUserGetDat, and wntUserSetDat. Previously, this was set and returned as an integer representing the number of seconds since 1/1/70. It has now been changed to a string in "YYYY:MM:DD:hh:mm:ss" format. WILX extender 11107 First showing up in WB 98D Under Windows NT, xEjectMedia no longer returns an error or displays a "Drive not ready" message if the drive is empty.

WinBatch version 98E

WB 98E Nov 9, 1998 Fixed a problem with PopMenu not setting the focus to the previously-active window before executing a menu item.

WinBatch version 99A

WB 99A Jan 5, 1999 Added additional option for IntControl(1007): p1 Meaning -- ------- 3 Suspend script until user clicks on the tray icon This can be used at any point after a WinBatch script has already been placed in the tray (with p1 == 1). When the user clicks on the tray icon, it will return one of the click values as listed for p1 == 0. Fixed problem with PopMenu where, if you clicked on the tray icon but didn't select a menu item, the next few times you clicked on the tray icon the menu would come up and then immediately disappear. The compiler will now unconditionally extract embedded files (in the "Other files" category), whether or not they already exist. They will be extracted to the directory where the large EXE is located, or to the Windows directory if the EXE is being run from a floppy disk or CD-ROM. As before, extender DLL's will not be extracted if they already exist in the EXE directory or on the path. WinBatch can now run scripts larger than 64K. Compiler can now compile scripts larger than 64K. DLL 2.7abs First showing up in WB 99A New function: MouseCoords(s:win-name, s:child-win) Returns coordinates of the mouse within a window. Fixed a problem with several file functions, which occured if the current directory was a UNC of the form "\\SERVER\SHARE\DIR[\...]" (not just "\\SERVER\SHARE"), and the specified file name or wildcard did not contain path information. This could cause a "File not found" type of error. When a WIL script is manually terminated by the user (eg, by pressing Ctrl-Break), it now displays the line that was being processed. Added additional option to IntControl(62): P1 Method to use -- ------------- -2 Don't activate WIL dialog windows at all. Added new request # to MouseInfo: Req# Return value ---- ------------ 7 returns mouse coordinates relative to the bounding rectangle of the window under the cursor, in virtual (1000x1000) screen units. Fixed problem with some of the Binary[..] functions crashing (instead of returning an error) if an offset < 0 was specified. In 32-bit version, changed the way the following string sorting and comparison functions operate: BinarySort ItemSort ItemSortNc StrCmp StriCmp >, >=, <, and <= (operators) Previously, they were sorting (or comparing) strings on a character-by-character basis. They now perform a "word sort", which sorts strings based on their collation sequence. Hyphens and apostrophes are ignored, and all other non-alphanumeric characters are sorted before any alphanumeric character. Changed ItemSortNc so that, if the strings being sorted are the same on a case-insensitive basis, they will then be sorted on a case-sensitive basis. In 32-bit version, changed memory allocation for strings to be dynamic. This means that you should no longer receive an error 3096 ("Out of memory for strings"), unless Windows itself is completely out of memory (unlikely). In the Dialog function, ampersands ("&") are now once again being converted to underscores in static text and varying text fields. In 32-bit version, increased limit for FileItemize and DirItemize lists from 32K to 1MB. Fixed a problem with menu parsing if you had a third-level menu followed by a top-level menu. OLE functions now support in-process servers. Fixed a problem with MouseClick not sending the correct types of clicks. Fixed an intermittent OLE crash problem. OLE now supports properties with parameters. Windows NT extender 11008 First showing up in WB 99A New functions: wntUserExist(s:server-name, s:user-name) Determines whether a user exists. wntCurrUsers(s:server-name, s:flags) Lists users currently logged into a server. wntFileUsers(s:server-name, s:file-pathname) Lists network users who have a file open. wntAcctInfo(s:server-name, s:account-name, i:request) Returns information about a user account. wntGroupAdd(s:server-name, s:group-name, i:group-type, s:comment) Creates a user group. wntGetDrive(s:net-resource) Lists local drives mapped to a UNC. wntSvcCfgGet(s:server, s:service-name, i:flags, i:request) Gets a configuration parameter for a service. wntSvcCfgSet(s:server, s:service-name, i:flags, i:request, s/i:value) Changes a configuration parameter for a service. wntEventWrite(s:server-name, s:source-name, i:type/category, i:event-id, s:description) Writes an entry to an NT event log. New audit functions: wntAuditAdd(server-name, resource/share-name, user/group name, object-type, access-string) Adds audit records for a resource. wntAuditDel(server-name, resource/share-name, user/group name, object-type) Removes audit records from a resource. wntAuditGet(server-name, resource/share-name, user/group name, object-type) Returns audit records for a resource. wntAuditList(s:server-name, s:resource/share-name, i:object-type, i:flag) Returns list of users who have audit records for a resource. The following changes have been made to wntRunAsUser: After you use wntRunAsUser, any programs you launch via the Run[..] or ShellExecute commands will be run in the context of the impersonated user. In order for this to work, the currently logged-in user (not the user being impersonated) needs to have the following privileges set: Increase quotas Replace a process level token You can specify a user name of "" to end the impersonation. The "flag" parameter can contain one or more of the following values, combined using the bitwise OR ("|") operator: Flag Meaning ---- ------- 1 Allow new child processes to interact with the desktop Fixed wntChgPassword when specifying an old-password of "*UNKNOWN*". Functions which return a tab-delimited list no longer include a tab at the end of the list. Added new request to wntGroupInfo: Req Returns --- ------- 2 i:group's RID (relative identifier) This request is valid only with global groups. Added new "element" to wntUserGetDat: "user_id" (i): user's RID (relative identifier) Note: This element cannot be set using wntUserAddDat or wntUserSetDat. Added new "element" to wntUserGetDat and wntUserSetDat: "primary_group_id" (i): RID (relative ID) of the user's primary global group You can determine a group's RID using wntGroupInfo with request = 3. Note: This element cannot be set using wntUserAddDat. Windows 95 extender 11004 First showing up in WB 99A New functions: w95FileUsers(s:server-name, s:file-pathname) Lists network computers who have a file open. w95GetDrive(s:net-resource) Lists local drives mapped to a UNC. w95FileClose now closes all connections to a file, instead of just the first one. It also now returns the number of connections which existed (and were closed) for the specified file. Functions which return a tab-delimited list no longer include a tab at the end of the list. Windows 9x extender 11001 First showing up in WB 99A New function: w9xOwnerGet(s:server-name, i:reg-key, s:resource-name, i:object-type, i:flag) Returns the owner of an object. NetWare 4 extender 14021 First showing up in WB 99A New functions: n4GetUserName(s:context) Returns the name of the currently logged-in user. n4ObjGetVal(s:context, s:object, s:attribute) Returns values for an object attribute. n4ObjOptions(s:value-delim, s:field-delim, s:null-sub, i:flags, s:reserved) Specifies options for n4ObjGetVal. n4ObjectProps now handles all value types, except file streams. Distinguished names are now returned in abbreviated, typeless form. Binary strings are returned with any NULL's replaced by spaces. For complex structure types (ie, not a single string or integer), the most useful information from the structure is returned, in the best form possible. To get all the data from such value types, use n4ObjGetVal. Fixed a problem with n4NameConvert returning a typed name with format == 4. WILX extender 11108 First showing up in WB 99A Fixed xMessageBox so the message box will come the foreground in Windows 98 and NT 5.0.

WinBatch version 99B

WB 99B Jan 13, 1999 DLL 2.7bbs First showing up in WB 99B Call() function now handles WBC (encoded) and WBE (encrypted) files created with versions of the compiler prior to 99A.

WinBatch version 99C

WB 99C Jan 20, 1999 Fixed problem with large compiled EXE's giving a "DLL not found" error at runtime if they contained (exactly) 4 extender DLL's. Fixed problem with compiler causing an error when embedding "Other files" that were 0 bytes in size. DLL 2.7cbs First showing up in WB 99C Fixed problem with BinaryTag[..] functions not being able to handle binary buffers larger than 64K. Windows NT extender 11009 First showing up in WB 99C Fixed problem with DLL not loading on NT 3.51. Note: wntRunAsUser requires NT version 4.0 or higher. Fixed problem with DLL not loading if RASSAPI.DLL was not found. Note: wntRasUserGet and wntRasUserSet require RASSAPI.DLL. NetWare 3 extender 12023 First showing up in WB 99C New function: n3GetConnNum(s:server) Gets the connection number for the current workstation. NetWare 4 extender 14022 First showing up in WB 99C New function: n4GetConnNum(s:server) Gets the connection number for the current workstation.

WinBatch version 99D

WB 99D Feb 11, 1999 The compiler now automatically compresses the WinBatch script and any "Other files" when creating an EXE, and uncompresses them when the EXE is run. This will cause the compile to take a bit longer, and may add a slight delay at runtime (depending on the CPU speed and the size of the files involved), but it will almost always result in smaller compiled EXE's. DLL 2.8dbt First showing up in WB 99D New IntControl: IntControl(65, p1, 0, 0, 0) Sets maximum line length for FileRead. Fixed problem using the Call() function to call WBC files created with older versions of the compiler (pre-99A). Very small files worked, but files over a certain size caused a verification failure error message. FileDelete now returns a "File cannot be deleted" error instead of "File not found" if the specified file exists but cannot be deleted. Optimized FileRead by using buffered reads (for files only, not for pipes). The default buffer size is 4096 bytes, and this is also the maximum length of a line which can be read. This size can be changed using the new IntControl(65). Lines which are too long to be read will return an error (instead of being truncated, as in previous versions). If you do a BinaryTagFind followed by another BinaryTagFind, the second BinaryTagFind will now search for the next tag. Previously, you had to do a BinaryTagRepl before being able to search for the next tag. Fixed a problem with the wildcard string functions (StrIndexWild, StrLenWild, and StrSubWild) where the text would not match a pattern with trailing asterisks, eg: StrIndexWild("abc", "abc*", 1). DllCall no longer crashes if called with an insufficient number of parameters. Fixed a problem with OLE, where, if an OLE call returned a NULL OLE object which you assigned to a variable, and then tried to assign a new value to that variable, it would cause a "Bad OLE channel" error. In 32-bit version, added a 1-second delay after a successful WinWaitExist, WinWaitChild, and WinWaitClose. Windows NT extender 11010 First showing up in WB 99D Fixed problem where a wntUserExist which returned @FALSE could prevent subsequent NT extender function calls from working properly. NetWare 4 extender 14023 First showing up in WB 99D Fixed problem with object names being returned with relative names instead of canonical names in some cases.

WinBatch version 99E

WB 99E Apr 12, 1999 Fixed a problem with "#include" directives not working in executables compiled with WinBatch 99D. DLL 2.8ebt First showing up in WB 99E In 32-bit version, changed floating point to string conversions, so that results will now be returned in scientific format for numbers whose absolute values are < 0.0001. In 32-bit version, in the Decimals() function you can now specify these values for "places": Value Meaning ----- ------- -2 Use alternate method of converting to strings, with no trailing zeroes -3 Always use scientific format

WinBatch version 99F

WB 99F Apr 15, 1999 DLL 2.8fbt First showing up in WB 99F New IntControl: IntControl(70, p1, 0, 0, 0) (32-bit only) Set delay after WinWait[..] functions. In 32-bit version, changed floating point to string conversions again. If you have used the Decimals() function specifying a "places" value of 0 or higher, then results will no longer be returned in scientific format for numbers whose absolute values are < 0.0001. Also, if you have specified Decimals(0), then results will now be returned in scientific format for numbers whose absolute values are > 2147483647. DirRename was failing if the old and new names had drive letters that were the same letter but one was upper case and the other was lower case. In 32-bit version, there is a problem with IntControl(68) causing the computer to reboot if it does not support the power-off feature. We've added a new parameter to work around this: P2 Meaning -- ------- 0 Power-off if supported by the computer (*see note below*) 1 Don't attempt to power-off 2 Attempt to power-off in any case Note: We don't currently have a reliable method of determining if a computer supports the power-off feature, so 0 will attempt to do a power-off in any case. In 32-bit version, changed the delay after a successful WinWaitExist, WinWaitChild, and WinWaitClose, from 1 second to 1/2 second. This can be changed or disabled with the new IntControl(70), above. Windows NT extender 11011 First showing up in WB 99F Fixed a rare problem with the extender crashing when making the first call to any of the extender functions. In wntSvcCfgSet, for request #7, if you specify "ServiceStartName" with no password, the password will be set to a blank string (ie, same as "ServiceStartName|"). To specify a non-blank password, use the form "ServiceStartName|Password".

WinBatch version 99G

WB 99G May 7, 1999 DLL 2.8gbt First showing up in WB 99G In 32-bit version, under Windows 95/98, fixed a problem using BinaryConvert to convert a non-Unicode buffer to a Unicode buffer, while setting the flag to specify that it also be converted to uppercase or lowercase. The Unicode conversion was being performed properly, but the case conversion was not. Note that under Windows 95/98, it is still not possible to perform a case conversion of a Unicode buffer (ie, where "source-type" and "target-type" are both Unicode). This is not a problem under Windows NT. Improved DebugTrace, and fixed a problem with the last line in the script not being output to the log file. Fixed a problem with FileRead returning extra characters at the end of the last line in the file, if the last line did not end with a line feed. Increased the maximum number of extender entries from 200 to 500. Windows NT extender 11012 First showing up in WB 99G New functions: wntWtsUserGet(s:server-name, s:user-name, i:request) Gets user information from an NT Terminal Server. wntWtsUserSet(s:server-name, s:user-name, i:request, s/i:value) Modifies user information on an NT Terminal Server. In wntMemberGet, if "group-type" is @LOCALGROUP, then "user" can now be specified as either "user" or as "domain\user". Windows 95 extender 11005 First showing up in WB 99G w95GetUser will now attempt to repeatedly retry the operation for up to 30 seconds, or until a non-blank string can be returned, whichever comes first. This is to avoid the problem where a blank string is returned when used in a login script, and the user hasn't yet been fully logged in. Windows 9x extender 10002 First showing up in WB 99G New functions: w9xGroupAdd(s:server-name, s:group-name, i:group-type, s:comment) w9xGroupDel(s:server-name, s:group-name, i:group-type) w9xGroupInfo(s:server-name, s:group, i:group-type, i:request) w9xUserAdd(s:server-name) w9xUserAddDat(s:element, s/i:value) w9xUserDel(server-name, user-name) w9xUserExist(s:server-name, s:user-name) w9xUserGetDat(s:server-name, s:user-name, s:element) w9xUserList(s:server-name, i:account-type) w9xUserRename(s:server-name, s:old-username, s:new-username) w9xUserSetDat(s:server-name, s:user-name, s:element, s/i:value) Parameters and usage for all these functions are the same as in the corresponding wnt[..] functions in the Windows NT extender, with the restriction that "server-name" must specify an NT server (it can't be a blank string), and "group-type" (where applicable) must be @GLOBALGROUP. NetWare 4 extender 14024 First showing up in WB 99G New functions: n4FileUsers(s:server, s:filename) Lists network users who have a file open.

WinBatch version 99H

WB 99H Aug 17, 1999 Added new "style" to BoxDrawCircle and BoxDrawRect: 3 = transparent circle/rectangle with border. Fixed a problem with FileMenu sometimes adding duplicate copies of the menu items to the Explorer "File" menu. Compiler now supports Unicode WBT files. DLL 2.8hbt First showing up in WB 99H In 32-bit version, fixed WinParmGet(19). In FileVerInfo, if you specify blank strings for both "language-key" and "resource-string", it will now return a tab-delimited list of language keys for which version information is available in the specified file. There was a documentation error with IntControl's 66, 67, and 68. The "force" flag is "P2", not "P1". And with IntControl 68, the "power off" flag is "P3", not "P2". "P1" is not currently used in any of these three IntControl's, and should be set to 0. IntControl(32) now allows both reading from and writing to a memory location. The syntax has been expanded. Fixed a problem (introduced in WinBatch 99A) with OLE function calls erroneously returning an error 1257 "Type mismatch". In 32-bit version, fixed a problem with OLE functions adding an extra NULL to the end of passed string parameters. In 32-bit version, fixed a problem with KeyToggleSet sometimes not changing the CapsLock or ScrollLock indicator lights until the next keystroke. Fixed a problem with lines beginning with the word "to" causing a crash. IsKeyDown and MouseInfo(4) now properly handle swapped mouse buttons. Changed MouseInfo(4) to only look at the state of the buttons at the time the function was called, not at the asynchronous state. ItemCount now ignores a leading delimiter. WaitForKey now supports the following special keycodes: Keycode Meaning ------- ------- {INS} Insert {NUMPAD0} 0 on numeric keypad {NUMPAD1} 1 on numeric keypad {NUMPAD2} 2 on numeric keypad {NUMPAD3} 3 on numeric keypad {NUMPAD4} 4 on numeric keypad {NUMPAD5} 5 on numeric keypad {NUMPAD6} 6 on numeric keypad {NUMPAD7} 7 on numeric keypad {NUMPAD8} 8 on numeric keypad {NUMPAD9} 9 on numeric keypad {NUMPAD*} * on numeric keypad {NUMPAD+} + on numeric keypad {NUMPAD-} - on numeric keypad {NUMPAD.} . on numeric keypad {NUMPAD/} / on numeric keypad Note that NumLock must be on for the codes {NUMPAD0} through {NUMPAD9} to be generated. Also, it cannot distinguish between the two "Enter" keys on the keyboard (both will generate an {Enter} code). Fixed a problem with BinaryIndex searching for high-ASCII characters. Fixed a problem with FileVerInfo sometimes returning extraneous characters at the end of the version string, and possibly causing a "Tag Overwrite" error. Fixed problem running Unicode batch files and menus. Windows NT extender 11013 First showing up in WB 99H New functions: wntAcctPolGet(s:server-name, i:request) Gets account policy information for a server. wntPrivAdd(s:server-name, s:user/group name, s:privilege) Grants a privilege to a user or group. wntPrivDel(s:server-name, s:user/group name, s:privilege) Removes a privilege from a user or group. wntPrivGet(s:server-name, s:user/group name, s:privilege) Determines whether a user or group holds a privilege. wntPrivList(s:server-name, s:user/group name) Returns a list of priviliges granted to a user or group. Added new "elements" to wntUserGetDat: "password_age" (i): "priv" (s): "auth_flags" (i): "parms" (i): "units_per_week" (i): "usri3_bad_pw_count" (i): "num_logons" (i): "logon_server" (s): Added new request # to wntSvcStatus: 0 = Return @TRUE if the service exists, or @FALSE if it doesn't (other request #'s will return an error if the service doesn't exist). Changed wntAccessGet and wntAccessSet to open registry keys with only the necessary access permissions, instead of all requiring all access. Windows 9x extender 10003 First showing up in WB 99H New function: w9xFileUsers(s:server-name, s:file-pathname) Lists network users who have a file open. NetWare 4 extender 14025 First showing up in WB 99H New functions: n4ObjDelete(s:context, s:object) Deletes an NDS object. n4ObjRename(s:context, s:object, s:new-name, i:retain) Renames an NDS object. n4ObjMove(s:context, s:object, s:new-name, i:retain) Moves an NDS object. n4ObjSearch(s:context, s:object, s:class, s:parent, i:flags) Searches a region of the directory for an NDS object. n4ObjGetVal now supports stream values. Fixed a problem with n4GetContext returning a non-blank string if the user had logged into and then logged out of Directory Services befor the function was called. It now returns a blank string in that situation. Fixed a problem with n4UserGroups causing subsequent functions using the context to fail.

WinBatch version 99I

Shortlived release. Immediately moved onto 99J.

WinBatch version 99J

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

WinBatch version 99K

WB 99K Sept 30, 1999 New function: MousePlay(s:X-Y-coordinates, s:parent-window, s:child-window, i:buttons, f:delay) Performs full range of mouse associated activities. MousePlay allows you to perform the full range of mouse associated activities with a single function. New IntControl: IntControl(1008, p1, 0, 0, 0) Enables/disables Close command. Fixed a problem with BoxButtonWait, where you could use the arrow keys to move the focus past the last button, where the focus would get lost. A side effect is that the arrow keys can no longer be used to move between buttons; use the Tab key instead. Added support for OLE functions which return a NULL type (VT_NULL). They get returned as a blank string (""). Dialogs displayed by AskFileName are now centered on the screen. Fixed problem with ClipGet truncating text greater than 64K. DLL 2.9kbu First showing up in WB 99K New IntControl: IntControl(71, 0, 0, 0, 0) Dump WIL and extender function tables to the debug log file. Added new request # to MouseInfo: Req# Return value ---- ------------ 8 returns asynchronous status of mouse buttons, as a bitmask. This is like request #4, except #8 returns the asynchronous (current) state of the buttons, whereas #4 returns the state at the time the function was called. Added new flag to AskFileName: 2 = Open Style, allowing multiple files to be selected. The selected files will be returned as a delimited list. The combined file names selected cannot exceed 2048 characters, otherwise an error will occur. In the Dialog function, fixed problems related to having multiple checkboxes with the same variable name. The values were not being initialized or returned properly. If debug tracing is on (via "DebugTrace"), and a 3052 error occurs ("uninitialized variable or undefined function"), the WIL and extender function tables are automatically dumped to the debug log file. In 32-bit version, fixed a problem trying to convert out-of-bounds floating point numbers to strings. In 32-bit version, fixed a problem with WinWaitExist waiting 25% longer than the specified "timeout" value. Fixed an OLE problem accessing properties with parameters. Windows NT extender 11014 First showing up in WB 99K Added new request to wntGroupInfo: Req Returns --- ------- -1 @TRUE if group exists, @FALSE if it doesn't. Added new request to wntShareInfo: Req Returns --- ------- -1 @TRUE if share exists, @FALSE if it doesn't. Fixed a problem with wntSvcStatus() returning various positive values, instead of @TRUE. Fixed a problem using the wntAudit[..] functions with registry keys. NetWare 4 extender 14026 First showing up in WB 99K New function: n4SetContextG(s:context, s:tree) Changes the current user's global default context and/or tree. The documentation for n4SetContext was a bit confusing. That function affects only the current script, and the changes to the context and/or tree remain in effect only for the duration of the current script.

WinBatch version 99M

WB 99M Oct 26, 1999 If you use BoxButtonWait and press Enter without first selecting a button, it now sets the pressed button to be whichever button was highlighted, instead of setting it to button #1 as before. Fixed problem with "Terminate" menu command not working while waiting for a button to be pressed with BoxButtonWait. If PopMenu is unable to load one of its configured menu files (eg, because of a syntax error), it will now display its popup menu anyway. The compiler no longer automatically writes out a project configuration (.CMP) file for the most-recent project on startup. You can now specify a directory name as the first parameter to the compiler, in which case it will let you select from a list of project configuration (.CMP) files in that directory to be compiled in batch mode. Note that these .CMP files must contain a "Src=" setting in the [Main] section to identify the source file to be compiled, and this setting was not written by earlier versions of the compiler, but can be added manually. The source file must be located in the same directory as the .CMP file. Fixed problem launching a 0-byte compiled script. DLL 2.9mbu First showing up in WB 99M New function: BinaryReplace(i:bin-handle, s:search-string, s:replacement-string, i:match-case) Replaces strings in a binary buffer. \ FileExist now returns @FALSE if the file name contains any '/' characters. In 32-bit version, in BinaryWriteEx, you can now specify -1 for "count", in which case the file size will be truncated at "file-offset" (ie, "file-offset" will become the new file size, and any data beyond that point in the file will be lost), and nothing will be written to the file. Improved support for "#include" pre-processor directives in scripts processed by programs other than WinBatch (such as PopMenu). The "#include" pre-processor directive is no longer case-sensitive. BinaryRead and BinaryWrite (and BinaryReadEx and BinaryWriteEx) now return an error if they are unable to read or write the file. MouseInfo(8) now checks the state of the buttons at the time the function was called, as well as the asynchronous state. Changed the algorithm used by the Random() function. DllHwnd and DllHinst now retry the operation if the specified window isn't found, like the other window functions do. Fixed problem with KeyToggleGet returning an incorrect result if used in the same script following a KeyToggleSet. FileRead now strips out any NULL's from the file being read. IntControl(52) now also affects the font used by the Display function. Fixed problem with the text in a Display() window sometimes getting truncated. Floating point numbers less than 1 are no longer required to have a leading 0. Gosub and Goto lines containing unsubstituted %% signs no longer cause beeps.

WinBatch version 99N

WB 99N Nov 2, 1999 DLL 2.9mbu First showing up in WB 99N Fixed problem with AskFileName under NT 3.51. Note that under NT 3.51, if you specify a multiple-selection style dialog, any file or directory names containing spaces will be displayed in the dialog as short names, but all file names in the list returned by AskFileName will have long-form names. Changed the syntax for IntControl(71) to: IntControl(71, p1, p2, 0, 0) P1 Meaning -- ------- 1 Dump WIL and extender function tables to the debug log file. 2 Set flag to dump internal debug data for every keyword lookup (p2 = @ON or @OFF, to turn the flag on or off).

WinBatch version 99P

WB 99P Nov 9, 1999 DLL 2.9pbu First showing up in WB 99P Fixed problem with a period ('.'), not preceded or followed by a number, being treated as a floating point 0.

WinBatch version 2000A

WB 2000A Feb 24, 2000 Fixed problem in FileMenu with FileItemize("") and DirItemize("") sometimes returning a "function failed" error. BoxDrawCircle and BoxDrawRect no longer draw anything if all the coordinates are 0. FileMenu supports new FileItemPath("") function (see below under WIL DLL). DLL 3.0abv First showing up in WB 2000A New functions: FileItemPath(file-list) Returns a delimited list of file paths. ItemReplace(item, index, list, delimiter) Replaces an item in a list. AskTextBox(title, prompt, default, flags, reserved) Prompts the user for multiple lines of input. StrClean(s:source-string, s:characters, s:replacement, i:match-case, i:mode) Removes or replaces characters in a string. New IntControl: IntControl(38, p1, p2, 0, 0) (not really new, but previously undocumented) Sets quiet mode. "#include" directives can have leading whitespace (ie, they can be indented with spaces or tabs). Note that an "#include" directive appearing in a menu file MUST be indented at least 4 columns, just like all menu code must be. DirExist no longer returns true if the directory name is followed by "*.*". Fixed a problem with numeric strings containing an "e" incorrectly being treated as floating point numbers. For DebugTrace, you can now specify a mode of 2, in which case when a terminal error occurs, the error message and the WIL variable table will be dumped to the debug log file. This mode is entirely separate from DebugTrace(@ON) (ie, only one of the modes can be active at any time, and each mode has different types of output information, with no overlap). If you use IntControl(28) to specify a fixed pitch font for list boxes, a fixed pitch font will now also be used for ITEMBOX controls in dialogs. IntControl(56) can now terminate an application based on its module or file name as well as its window name. FileVerInfo can now return numeric version fields, by preceding the resource string name with a '#'. WaitForKey now supports punctuation keys. Improved speed of BinaryReplace. Fixed a problem with RegQueryMulSz crashing with NULL (blank) registry values. BinaryStrCount now returns an error if the specified end-offset is past the binary EOD. Windows NT extender 11015 First showing up in WB 2000A New functions: wntServerInfo(s:server-name, i:request) Returns information about a server. wntShareList(s:server-name, i:share-type, i:flags) Returns a list of shares on a server. wntShareUsers(s:server-name, s:share/computer-name, i:share-type, i:format, i:flags) Returns a list of users connected to a share or server. wntRemoteTime(s:server-name, i:format) Gets the time of day from a server. wntShutdown(s:computer-name, s:message, i:timeout, i:force, i:reboot) Shuts down (and optionally restarts) a computer. wntDomainSync(s:server-name, i:request) Synchronizes domain controllers. wntAcctPolSet(s:server-name, i:request, i:value) Sets account policy information for a server. Fixed a problem with wntFilesOpen possibly crashing. Changed the error message from "password too short" to "password is unacceptable", unless it's clear that the password really is too short (Windows returns a "password too short" error for various unrelated error conditions). This affects wntChgPswd, wntUserAdd, and wntUserSetDat. Fixed a problem with wntAcctInfo(1) returning a SID that only included the last subauthority, instead of all of them. Windows 95 extender 11007 First showing up in WB 2000A New functions: w95ServerInfo(s:server-name, i:request) Returns information about a server. w95ShareList(s:server-name, i:share-type, i:flags) Returns a list of shares on a server. w95ShareUsers(s:server-name, s:share/computer-name, i:share-type, i:format, i:flags) Returns a list of users connected to a share or server. Windows 9x extender 10004 First showing up in WB 2000A New functions: w9xGetDc(s:server-name, s:domain-name, i:flag) Returns the domain controller for a domain. w9xRemoteTime(s:server-name, i:format) Gets the time of day from a server.

WinBatch version 2000B

WB 2000B Mar 20, 2000 Compiler now sets the numeric FileVersion and ProductVersion fields to match the corresponding string fields. The strings should be specified as a series of up to four numeric fields, delimited by periods or commas or spaces (eg, "3.01" or "5,1,2,0" or "2000 1 2". Any missing or non-numeric fields will be converted to 0. If file specified by #include directory didn't exist, it was incorrectly returning an "unable to allocate memory" error. DLL 3.0bbv First showing up in WB 2000B New IntControls: IntControl(72, p1, 0, 0, 0) Sets Cancel handler. Fixed a problem (introduced in WinBatch 2000A) with WaitForKey not detecting some of the special keycodes. In 32-bit version, if you use IntControl(49) to add system menus to dialog boxes, the icon in the title bar will now be the application icon instead of a generic Windows icon. Fixed a problem with DirSize returning incorrect numbers for directories containg files larger than 4 gigabytes. Windows NT extender 11016 First showing up in WB 2000B New functions: wntSvcCreate(s:server, s:string-values, s:numeric-values, s:dependencies, s:reserved) Adds a service to the service control manager database. wntSvcDelete(s:server, s:service-name, i:flags) Marks a service for deletion from the service control manager database. wntGroupEdit(s:server-name, s:group, i:group-type, i:request, s/i:value) Modifies information about a group.

WinBatch version 2000C

WB 2000C May 3, 2000 Fixed a problem with the compiler sometimes setting the "Src" key in the project configuration (.CMP) file to the wrong source file name. Changed BoxButtonWait to be more responsive to window messages during the wait period. DLL 3.0cbv First showing up in WB 2000C New IntControl: IntControl(74, p1, 0, 0, 0) (32-bit only) Set idle wait after Run commands. Added new "function" to WinHelp (32-bit only): "HTML" Launches HH.EXE to view a topic in an HTML help (.CHM) file. "Keyword" specifies the topic to display, or "" to view the starting topic in the file. Example: WinHelp("iexplore.chm", "HTML", "web_collect_favorites.htm") Which is identical to: Run("HH.EXE", "iexplore.chm::/web_collect_favorites.htm") In AskTextBox, "default" is no longer truncated at 256 characters. Also, a horizontal scroll bar is added if "flag" number 1 is specified. Also, the cursor is now scrolled into view if "flag" number 2 is specified. WinMetrics(-5) and (-6) now return floating point values (they are no longer rounded to an integer). Added new request to IntControl(54): P2 Meaning -- ------- -1 Return window's current topmost state (@TRUE = topmost, @FALSE = not) In 32-bit version, you can now specify a negative number for TimeDelay, in which case the negative number will be treated as a positive number (eg, -5 will be treated as 5), and an alternate delay routine will be used. In NT, several functions may not have worked properly after using wntRunAsUser to impersonate a different user: IntControl(58) IntControl(67) IntControl(68) RegLoadHive RegUnloadHive Changed the internal routine used to create delays (eg, to wait for a window to appear or a program to finish), so that during the delay the WIL Interpreter is now more responsive to window messages. Windows NT extender 11017 First showing up in WB 2000C wntSvcCreate now prepends '.\' to the specified ServiceStartName, if it doesn't already contain a contain a '\' (unless it's "LocalSystem"). This matches the behavior of wntSvcCfgSet. NetWare 4 extender 14027 First showing up in WB 2000C n4UserGroups now returns a blank string ("") instead of an error if the specified user doesn't belong to any groups.

WinBatch version 2001A

WB 2001A Nov 20, 2000 BETA RELEASE

WinBatch version 2001B

WB 2001B Feb 27, 2001 16-bit version is no longer being developed (so no more references to "32-bit only"). Added additional option for IntControl(1007): IntControl 1004 now returns a full path for uncompiled WinBatch scripts. The extension for extender data files used by the compiler has been changed from ".DAT" to ".EXT". Fixed some problems with overlapping boxes Fixed some problems with button focus in boxes. DLL 3.2bcb First showing up in WB 2001B *** Important: The following changes alter (break) previous behavior *** In DiskFree and DiskSize, the items in "drive-list" can no longer be separated with spaces (in order to now support UNC's containing spaces). In ItemCount, trailing delimiters are now significant. This means that the comma-delimited list "a,b,c," has 4 items in it. In ItemInsert, trailing delimiters are now significant. This means that if you specify a blank item ("") and an offset of -1, a blank item will be added to the end of the list, even if the list already has a trailing delimiter. The following functions no longer add a trailing delimiter to the returned list (some of these are "legacy" functions that are no longer documented): AskFileText AskItemList ItemSelect RegQueryItem TextBox TextBoxSort TextSelect Changed the format of the string for OLE return types of VT_DECIMAL (this was previously undocumented). The new format is described below. FileExist now returns @FALSE if the file name contains any '/' characters (this change was actually made in WB 99M). 16-bit version is no longer being developed (so no more references to "32-bit only"). New -- user-defined functions! WIL now supports user-defined functions (UDF's). A UDF is defined as follows: #DefineFunction functname([param1, param2, ..., param16]) Return retval #EndFunction "#DefineFunction" and "#EndFunction" are the keywords indicating the beginning and end of the UDF. "functname" is a placeholder for the name of the function. The function name must begin with a letter, can contain letters, numbers, and underscores, and can be up to 30 characters long. You may not use a function name that is the same as the name of a WIL DLL function, but you may override a function name that's in an extender DLL. You may specify up to 16 optional parameters. "param1" - "param16" are placeholders for your actual variable names. These are the names of the variables that your UDF will receive when it is called. Between the "#DefineFunction" and "#EndFunction" keywords is the code that will get executed when the UDF is called. It may contain a Return command followed by a value (or an expression that evaluates to a value), in which case the UDF will end and return this value. If you specify a Return command without a value, the UDF will return 0. If a UDF does not contain a Return command, it will execute to the end of the UDF and return 0. An Exit command in a UDF will cause the entire script to end, not just the UDF. A UDF must be defined anywhere in a script, as long as it is defined prior to being used for the first time. A UDF may be defined or used in a separate script that is called with the Call command, as long as it is defined before it is used. You may not have nested UDF definitions (ie, each "#DefineFunction" must be followed by an "#EndFunction" as a pair). A UDF will not have access to any variables in the main WIL script, other than the variables passed as param1 - param16. Any variables set in a UDF will be destroyed when the UDF returns, other than the return value of the UDF. Any percent signs in the UDF code will be expanded at runtime (when the code is called), not at define time. You may return a file handle, binary buffer, OLE object, or array from a UDF using the Return command. However, if you create one of these types of objects in your UDF and do not return it using the Return command, you are responsible for freeing it before the UDF returns, using the appropriate WIL function (ie, FileClose, BinaryFree, ObjectClose, or Drop, respectively); otherwise, the object will become an "orphan" and will no longer be accessible and may not be automatically freed when the script exits. Example: ; Define three UDF's #DefineFunction Done() Message("All done", "Script processing is complete") #EndFunction #DefineFunction Square(number) Return (number * number) #EndFunction #DefineFunction AddListItem(list, newitem, delimiter) list = ItemInsert(newitem, -1, list, delimiter) list = ItemSort(list, delimiter) Return list #EndFunction ; Now use them list = "apples,bananas,peaches" list = AddListItem(list, "cherries", ",") Message("New list", list) Message("The square of 5 is", Square(5)) Done() New -- arrays! WIL now supports arrays. Arrays are created using the new ArrDimension function (see below). An array may have from 1 to 5 dimensions, and each dimension may contain up to 65,535 elements. Array elements are referenced with their subscripts enclosed in square brackets. If an array has more than one dimension, the subscripts are separated with commas. Eg: arrayvar[1] arrayvar[1, 1] arrayvar[0, 5, 2] Array subscripts are 0-based; ie, the first element in an array is array[0]. Array elements can contain any type of WIL value: string, integer, float, etc. You can have different types of values within an array. You may not pass an array as a parameter to a WIL function (except for functions which state they accept an array), or use it in any sort of operation. For example, the following are NOT legal: arrayvar = 5 ; NOT legal x = arrayvar ; NOT legal Message("Value is", arrayvar) ; NOT legal On the other hand, the following are all legal: arrayvar[0] = 5 x = arrayvar[0] Message("Value is", arrayvar[0]) You can pass arrays to user-defined functions, and you can return arrays with the Return command. When you pass an array name (ie, not an array element) as a parameter to a function, the array gets passed "by reference". That is, the function receives a pointer to the array, and is therefore able to make changes to it "in place". This is similar to passing a binary buffer handle to a function, where the function is then able to make wholesale changes to the binary buffer. In contrast, passing an array element (ie, with a subscript) to a function is like passing a regular string or integer parameter to a function -- it gets passed "by value". Ie, the function receives the value of the array element, but is not able to modify the array itself. By the same token, when you pass a string to a function like StrUpper: newstring = StrUpper(oldstring) The function does not modify the variable "oldstring" at all. If you want to modify the existing variable, you can assign to it the return value of the function, eg: mystring = StrUpper(mystring) array[2] = StrUpper(array[2]) New functions: ArrDimension(i:dim1 [, i:dim2 [, i:dim3 [, i:dim4 [, i:dim5]]]]) Creates an array. ArrInfo(a:array, i:request) Gets information about an array. ArrInitialize(a:array, i:value) Initializes an array. Arrayize(s:list, s:delimiter) Converts a delimited list to an array. RegOpenKeyEx(i:handle, s:subkey-string, s/i:mode, s:reserved-1, s:reserved-2) Opens a registry key with specified access rights. VarType(s:varname) Gets the type of a WIL variable. RegQueryStr(i:handle, s:subkey) Retrieves and expands a string value from the registry. FileSizeEx(s:file-list) Finds the total size of a group of files (including open files). FileCreateTemp(s:prefix) Creates a temporary file. ClipHasFormat(i:format) Determines if the clipboard contains a particular format. BinaryTagIndex(s:tag-struct, i:mode) Returns the offset of a binary tag in a buffer. BinaryTagLen(s:tag-struct, i:mode) Returns the length of a binary tag. BinaryXlate(i:data-buffer, i:table-buffer, i:mode) Converts a binary buffer using a translation table. New IntControls: IntControl(69, p1, p2, 0, 0) Suspends machine by shutting power down. IntControl(75, p1, 0, 0, 0) Gets last dialog coordinates. IntControl(76, p1, 0, 0, 0) Sets the computer name. IntControl(77, p1, 0, 0, 0) Gets internal operating parameters. IntControl(78, 0, 0, 0, 0) Frees all UDF's. Changed RegExistKey and RegQueryItem to work if the current user only has read access (not full access) to the specified key. IniItemize / IniItemizePvt no longer has a 32K limit on the size of the returned list. If you specify -1 for the X or Y coordinate of a Dialog, the corresponding coordinate (X or Y) from the most recently displayed dialog will be used. If there was no previous dialog, the dialog will be centered. The file name following an "#include" pre-processor directive no longer needs to be quote-delimited. Any of the following are now permitted: #include "filename" #include 'filename' #include `filename` #include filename If the file name is not delimited, it may not have any trailing whitespace. Can now pass an OLE object handle as a parameter to an OLE function. DirItemize wasn't returning directory names beginning with a period. Fixed problem with BinaryReplace giving a "Data to store would overrun binary buffer" error when replacing a NULL byte. In BinaryReadEx, if "file-offset" + "count" is larger than the file size, or if "count" is -1, "count" will be ignored and it will be treated as a request to read from "file-offset" to the end of the file. Debug and DebugTrace modes are now reset to @OFF before a Call command, and automatically set back to their previous states after the Call returns. You will need to put Debug and/or DebugTrace commands in the Call'ed script if you want it to be debugged. The Return command can now return a value, by specifying a value (or an expression that evaluates to a value) after the "Return" keyword. The value or expression may optionally be enclosed in parentheses. This feature can be used with the Call command, and with the new user-defined functions (see above). It does not affect the Gosub command. Examples: Return Return (10) Return "Okay" Return myvariable * 10 Return (ItemCount(list, @TAB)) A script run with the Call command can now return a value by using a Return command with a value (see above). If a Return command without a value is used, or the called script does not contain a Return command, the called script will return 0. Example: result = Call("other.wbt", "") ClipPut no longer has a 64K limit. Drop and DropWild can accept array names as parameters. IsDefined can accept an array name as a parameter. Fixed crash problem when doing an ObjectClose (or Drop, or variable reassignment) of an OLE object that was assigned to more than one variable name and had already been freed. OLE objects are now automatically attempted to be closed on shutdown. However, if you have a dependent OLE object open (eg, a document within an application), it may prevent the application from being closed. Fixed a problem where, if you assigned an OLE object handle to a second variable and then Drop'ed or reassigned the original variable, the OLE object would be closed and the second variable would therefore no longer refer to a valid OLE object. No longer receive an "unable to process include file" message when running an empty script file. Fixed problem with WallPaper function using tile and stretch options. DiskFree and DiskSize now support UNC's containing spaces (note that the items in "drive-list" can be UNC's corresponding to drives, as well as drive letters). Fixed a problem with AskFileName not bringing the window to the foreground. Fixed a problem with the BinaryTag[..] functions when the found text was larger than 64K. Directory functions now automatically return failure for directory names ending with two backslashes. Added new "select mode" to AskItemList and AskFileText: @extended to allow selection of multiple items by extending the selection with the mouse or shift key. AskItemList and AskFileText now support multiple selection up to 32,767 items (previous limit was 100 items). Added additional special characters to the SendKey (and SendKeysTo and SendKeysChild) functions. These may or may not work for any particular application or situation: Key SendKey equivalent --- ------------------ Ctrl-Break {CANCEL} Pause {PAUSE} OLE now supports return values of type VT_CURRENCY and VT_DECIMAL. They are returned as strings with prefixes: "#CURRENCY:value" (VT_CY) "#DECIMAL:value" (VT_DECIMAL) where 'value' is the decimal or currency value, converted to a string. You can also pass these types as parameters to an OLE function by prefacing the string with the appropriate prefix: Type Name Format ---- ---- ------ CY VT_CY CY:"#CURRENCY:value" DECIMAL VT_DECIMAL DECIMAL:"#DECIMAL:value" For FileOpen, increased the maximum number of open files from 5 to 128. For BinaryAlloc, increased the maximum number of current binary buffers from 10 to 128. WinActivChild has been renamed to WinActiveChild (the old name will continue to work). Added new request # to IntControl(71): P1 Meaning -- ------- 3 Dump WIL variable table to the debug log file. Added new request # to MouseInfo: Req# Return value ---- ------------ 9 WinID of top level parent window under mouse Added new flag to AskFileName: 3 for Save style, with no "Replace" confirmation. AskFileText no longer truncates lines at 254 characters. It now uses the line length set by IntControl(65) (4096 characters by default). AskFileText now treats line feeds as line terminators, instead of carriage returns. It therefore now supports both DOS files (which have CR/LF terminators) and UNIX files (which have LF terminators). Cleared up some confusion with AskDirectory by setting the edit field (if present) to a blank value, so the user will not try appending a subdirectory name to the text in the field. Any text entered in the edit field is treated as a subdirectory name under the selected directory. Also added a static text field showing the name of the selected directory. In BinaryWriteEx, if you specify -1 for "count", then "handle" and "binary-offset" are now ignored (there was previously a discrepency in the documentation about this). The following functions now return a file time of 1/1/1980 at 00:00:00 if the specified file has an invalid time field: FileTimeCode FileTimeGet FileTimeGetEx FileYmdHms The following file time get functions no longer round the seconds field of the file's time stamp to a multiple of 2 seconds, if a more accurate time format is supported by the operating system: FileTimeGet FileTimeGetEx FileYmdHms The file time compare routines in the following functions no longer round the seconds fields of the files' time stamps to a multiple of 2 seconds, if a more accurate time format is supported by the operating system. They now compare the full seconds and milliseconds fields of the time stamps: FileCompare FileCopy FileMove InstallFile Fixed a problem with DebugTrace where if you specified a filename that did not include a full path, and then changed directories while the script was running, a new debug file would be written in whatever the current directory was. Changed the output strings for FileTime and TimeDate to more correctly reflect the date and time format preferences set through Control Panel. This also affects the File Overwrite confirmation dialog displayed by FileCopy and FileMove. Changed the following error codes from fatal (3000-) to minor (1000-): Old New Error --- --- ----- 3210 1393 Cmd Extender: Out of memory to save result 3393 1394 AddExtender: Too many extenders added 3394 1395 AddExtender: Extender DLL not found 3395 1396 AddExtender: Not a valid extender 3396 1399 AddExtender: Extender table full 3437 1437 AddExtender: Extender DLL load failed Added an optional parameter to AddExtender: AddExtender(s:filename [, i:required-version]) "required-version" is the minimum acceptable version. If the version of the extender being loaded is less than "required-version", the AddExtender command will fail. The default value is 0 (ie, no required version). IntControl(73) now works with errors from extenders. Under Windows NT (and Windows 2000), AppExist and AppWaitClose now try to match the root + extension of "program-name", as well as just the root part, against any running application module names. So if you specify "program.exe", it will match either a module named "program.exe" or a module named "program". Now suppressing a Windows crash error that can occur when doing an ObjectClose on an object that has already been freed by another process. Fixed problem using ObjectOpen after AskFileName. Optimized StrFill. Fixed problem with "multi-type" WIL variables being passed to OLE functions (ie, integers or floating point numbers that had been converted to strings, or vice versa). If a variable has a floating point value, it will now be passed as a floating point value (even if it also has a string and/or integer value). If a variable has both an integer and string value, it will now be passed as an integer. Fixed a string memory leak when converting string variables to integers. Windows NT extender 32000 First showing up in WB 2001B New functions: wntLsaPolGet(s:server-name, s:class, i:element) Gets LSA (Local Security Authority) policy information. wntLsaPolSet(s:server-name, s:class, i:element, s/i:value) Sets LSA (Local Security Authority) policy information. wntUserSidChk(i:request, s:SID, i:reserved-1, i:reserved-2, i:reserved-3) Checks SID's in an access token. wntAccessAdd2(s:server-name, s:resource/share-name, s:user/group name, i:object-type, s:access-string) Adds or updates access (permission) records for a resource. wntAuditAdd2(server-name, resource/share-name, user/group name, object-type, access-string) Adds audit records for a resource. wntEventLog(s:server-name, s:text) Writes a "WBMSG" entry to the NT application event log. wntGroupRen(s:server-name, s:group, i:group-type, s:new-name) Renames a group. wntOwnerSet wasn't enabling the SE_RESTORE_NAME privilege to allow you to set ownership of an object to a different user. Fixed problem with wntUserAddDat("", "") not freeing some global memory. Fixed problem with wntUserAddDat possibly overwriting part of a different parameter value that had been previously set (with wntUserAddDat). Modified wntAccessAdd and wntAuditAdd to be more compatible with Windows 2000 machines (also see new wntAccessAdd2 and wntAuditAdd2 functions). Added new predefined access strings for Windows 2000. These are the same for files and directories: Access-string Meaning Specific equivalent -------------- -------------- ------------------- "Win2000:Full" Full Control "0:3:2032127" "Win2000:Modify" Modify "0:3:1245631" "Win2000:ReadExecute" Read & Execute "0:3:1179817" "Win2000:List" List "0:2:1179817" "Win2000:Read" Read "0:3:1179785" "Win2000:Write" Write "0:3:1048854" "Win2000:None" No Access "1:3:983551" wntAccessList now returns a sorted list with no duplicate items. wntAccess[..], wntAudit[..], and wntShare[..] functions specifying a printer may have returned an "Access Denied" error, because they were trying to open the printer with an excessive level of access requested (especially under Windows 2000). wntPrivAdd and wntPrivDel may have failed with an "Access Denied" error because they were trying to open the policy object with an excessive level of access requested. Fixed problem with wntMemberLst2 returning users with blank names in local groups (ie, just "domain\"). Changed wntServerInfo so that request #'s 1-4 can be called by any user. All other request #'s can can only be called by members of the Administrators or Account Operators local group, or those with Communication, Print, or Server operator group membership. Fixed a problem with wntMemberGrps that could have caused the script to hang if there were a very large number of groups that needed to be processed. Changed wntAccessAdd, wntAccessAdd2, wntAuditAdd, and wntAuditAdd2, so that if you specify one of the recursive object types (301, 302, 303, or 401) and the function is unable to modify one of the objects it attempts, it will skip that object and continue, and won't return an error. The function will return 0 if it was unable to modify an object. Fixed problem with wntRunAsUser with "allow interactive" flag set, where running an application could cause "abnormal termination" error. Added an additional flag to wntRunAsUser: Flag Meaning ---- ------- 2 Load user profile into HKEY_USERS\ Fixed problem with wntAcctPolGet and wntAcctPolSet, where request #3 was getting/setting the password age in seconds rather than days. The wntAccess[..] and wntAudit[..] functions have been improved to work better under Windows 2000. Windows 95 extender 32000 First showing up in WB 2001B Fixed a problem with the following enumeration-type functions that could have caused the script to hang if there were a very large number of items (files or shares) that needed to be processed: w95FileClose w95FileUsers w95ShareList w95ShareUsers Note that these functions are limited to using 64K buffers. If that is not sufficient to accomodate all items, some items will not be processed. Fixed a problem with w95AccessAdd and w95AccessDel not working with a remote machine. Windows 9x extender 32000 First showing up in WB 2001B Fixed a problem with w9xMemberGrps that could have caused the script to hang if there were a very large number of groups that needed to be processed. WILX extender 32000 First showing up in WB 2001B Removed xCursorSet (not useful in 32-bit versions of Windows). Removed xMemCompact (not useful in 32-bit versions of Windows). Fixed problem with xGetChildHwnd returning the wrong window handle if 'child-text' was blank. xBaseConvert now properly handles numbers beginning with a leading '-' or '+' sign.

WinBatch version 2001C

WB 2001C Mar 5, 2001 DLL 3.2ccb First showing up in WB 2001C Fixed a problem with the OK button in AskDirectory being disabled under Windows 2000. In OLE functions, fixed a problem handling VT_DATE values outside the range 1/1/1980 to 12/31/2099. RegQueryKeys no longer adds a tab to the end of the list. Windows NT extender 32001 First showing up in WB 2001C Fixed a problem with the wntAccess[..] and wntAudit[..] functions returning an Access Denied error. Fixed a problem with wntAccess[..] crashing when specifying a file in a FAT paartition.

WinBatch version 2001D

WB 2001D Mar 6, 2001 Windows NT extender 32002 First showing up in WB 2001D Fixed a problem with wntAccessList and wntAuditList adding a tab to the end of the list.

WinBatch version 2001E

WB 2001E Mar 8, 2001 DLL 3.2ecb First showing up in WB 2001E IniItemizePvt now supports itemizing the sections of Unicode INI files. Windows NT extender 32003 First showing up in WB 2001E Fixed a problem with wntAccessDel and wntAuditDel crashing if the only access record for the object was being deleted. Fixed a problem with the wntAccess[..] and wntAudit[..] functions creating ACL's with access records that were incorrectly sequenced.

WinBatch version 2001F

WB 2001F Mar 15, 2001 DLL 3.3fcc First showing up in WB 2001F In Windows 95/98, FILELISTBOX controls in dialogs no longer display files or directories marked as hidden or system, unless you first use IntControl(5) to enable that behavior. In Windows NT/2000, FILELISTBOX controls in dialogs now display files and directories marked as hidden or system, if you have first used IntControl(5) to enable that behavior. Fixed a problem with FILELISTBOX controls in dialogs not displaying directories beginning with a '.'.

WinBatch version 2001G

WB 2001G Mar 27, 2001 Fixed a problem with BoxButtonWait failing to wait if you had pressed the same button twice without calling BoxButtonStat in between. Fixed a problem with areas of the Box windows not getting repainted properly when the windows were resized. Fixed a problem with OLE objects becoming invalid after being passed as parameters to OLE methods or properties. In FileMenu, the functions FileItemize(""), FileItemPath(""), and DirItemize("") no longer add a trailing delimiter to the list. DLL 3.3gcc First showing up in WB 2001G Fixed a problem where the floating point number 0.0 was being displayed in scientific notation. Fixed a problem with IniItemizePvt returning an extra item with stray characters when itemizing sections in the file, if the file was over 32K. Fixed a problem with the parameter of a Return statement being validated even if the Return was in a conditional block that wasn't being executed. Fixed a problem with ItemInsert, ItemRemove, and ItemReplace removing blank items at the end of the list. Fixed a problem with ItemInsert inserting an item at the wrong position if it were being inserted between blank items at the end of the list. Fixed a problem with ItemReplace not replacing an item following a blank item at the end of the list. Fixed a problem with ItemSort removing blank items from the list. Windows NT extender 33001 First showing up in WB 2001G Fixed a problem with wntServerList hanging if the list of servers returned was larger than 64K. Windows 9x extender 33001 First showing up in WB 2001G Fixed a problem with w9xServerList hanging if the list of servers returned was larger than 64K.

WinBatch version 2001H

WB 2001H Apr 2, 2001 Fixed a problem with the compiler not being able to compile extenders into a large EXE (introduced in 2001G). Windows NT extender 33002 First showing up in WB 2001H The wntPriv[..] functions can now be used on a local workstation for domain accounts, by specifying the user/group name in the form "domain_name\account_name". Note that wntPrivAdd and wntPrivDel require administrator privileges on the local workstation. Fixed a problem with the wntShare[..] functions failing with "access denied" errors when the target object was a printer.

WinBatch version 2001J

WB 2001J May 25, 2001 New functions, only when running as a service: SvcSetAccept(i:codes) Specifies the control codes that the service will accept. SvcSetState(i:state) Updates the service control manager's status information for the service. SvcWaitForCmd(i:timeout) Waits or checks for receipt of a service control code. The compiler now properly handles "#include" directives with leading whitespace (ie, indented with spaces or tabs). The compiler now properly handles double byte characters in the customizable version strings. DLL 3.3jcc First showing up in WB 2001J New IntControl: IntControl(79, p1, p2, p3, 0) Causes a user-defined error. Fixed a problem with Arrayize crashing with large lists. In ItemLocate you can now specify a delimiter of "" to indicate a tab. Fixed a problem with Drop not returning a value. It now returns 1, as documented. Fixed a problem with AppExist no longer working after being called thousands of times. The Print command now ignores the "waitflag" parameter, as documented. Fixed a problem converting strings like "-.2", where a signed floating point decimal value did not have a 0 before the decimal point. Fixed a problem handling OLE object names longer than 30 characters where the variable name (the part before the '.') contained an underscore. ShortcutDir now supports registry strings of type REG_EXPAND_SZ. Increased the maximum number of open OLE objects from 20 to 128. Windows NT extender 33003 First showing up in WB 2001J New functions: wntAccessMod(server-name, resource, object-type, request, flags) wntAuditMod(server-name, resource, object-type, request, flags) wntMemberList() now accepts an optional parameter to allow members of local groups to be returned with domain and/or server information (as a prefix before the user/group name, e.g. "domain\user", "domain\global-group" or "server\user"). Improved support for managing permissions and auditing of printer objects (e.g. traditionally called "printers") and printer shares, and added new pre-defined access strings for printer objects and printer shares. wntMemberList now properly returns domain names and/or server names for standalone systems and workstations. wntAccess[..] and wntAudit[..] functions specifying a registry key may have returned an "Access Denied" error, because they were trying to open the key with an excessive level of access requested. Fixed a problem with the wntShare[..] functions, where specifying a printer name or printer share as "resource/share-name" didn't work properly. Windows 9x extender 33003 First showing up in WB 2001J Fixed a problem with the w9xShare[..] functions, where specifying a printer name or printer share as "resource/share-name" didn't work properly.

WinBatch version 2001K

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

WinBatch version 2001M

WB 2001M Aug 8, 2001 BoxesUp was returning positive values on success, other than @TRUE. DLL 3.3mcc First showing up in WB 2001M New function: DllLastError() Returns the most recent error returned by a DllCall to a Win32 API. Decimals() was not returning the previous setting. IntControl 56 could not be used to kill a service. BinaryPeekStr no longer returns an error if "offset" is within the binary buffer but "offset + maxsize" is past the end of the binary buffer. Statements such as "If x" and "While x", where 'x' is a floating point number that is too large or small to convert to an integer, no longer return an error. Fixed a problem with the Run[..] commands crashing with very long command lines. Fixed problem with Arrayize with large lists. IntControl 45 is now enabled for Windows 95/98/ME, which should result in faster SendKey and SendKeysTo to DOS windows on those platforms. This functionality is now the same on all Windows platforms. If the "SendKey speedup" causes a problem, you can turn it off with IntControl(45,0,0,0,0). In ArrInitialize, "value" may now be an integer, floating point, or string. Fixed problem with Debug and DebugTrace displaying an incorrect result on a line of the form "If ... Then Call(...)". Fixed problem with DebugTrace causing an "Unrecognised Request" error in WIL applications other than WinBatch. Windows NT extender 33005 First showing up in WB 2001M New function: wntSecurityGet(server-name, resource, object-type, request, flags) wntAccessMod and wntAuditMod now support registry keys (object type 400) on the local system. Improved the way the wntAccess[..] and wntAudit[..] functions handle registry key branches (object type 401), to solve "Access Denied" errors. wntAccessAdd2 and wntAuditAdd2 have been removed. Fixed problem accepting the group name "Everyone" as a parameter on non-English versions of Windows.

WinBatch version 2001N

WB 2001N Aug 31, 2001 Fixed a resource (handle) leak in SvcWaitForCmd. DLL 3.3ncc First showing up in WB 2001N BinaryPeekStr now returns a blank string instead of an error if "offset" is set to the binary EOD and "maxsize" is 0. Fixed a problem with DirSize crashing with excessively long (illegal) directory names. It now ignores (skips) invalid directory names. Fixed a problem with ShortcutInfo returning an invalid value for "hotkey" if the shortcut had a non-blank description and did not have a hotkey set. In ShortcutEdit, you can now specify "-1" for "target", "params", or "start-dir" to set NULL values. In ShortcutExtra, you can now specify "-1" for "description", "hotkey", or "icon-file" to set NULL values. In IntControl 34, if you specify -1 for "p1" it will return the string corresponding to the last extender error or user-defined error. New parameter type "huge number", used by several functions (below). This is a long decimal number string, which may represent a number too large to be converted to an integer. If the number is larger than 2147483647, it must be a string. Added an optional "format" parameter to DirSize, FileSize, and FileSizeEx: DirSize(dir-name, flags [, format]) FileSize(file-list [, format]) FileSizeEx(file-list [, format]) This controls the format in which the size is returned if it is too large to be returned as an integer. The default format, 0, is floating point. If you specify "format" of 1, the size will be returned as a huge number. BinaryReadEx and BinaryWriteEx now accept a huge number for "file-offset". In a Switch statement, a "Case" keyword followed by an invalid expression will now cause an error.

WinBatch version 2001P

WB 2001P Nov 30, 2001 DLL 3.4pcd First showing up in WB 2001P IsDefined and VarType now return -1 (instead of an error) if the specified name is a function name or other reserved word. New data types for BinaryOleType: 3 byte array (VT_UI1 | VT_ARRAY) 4 I1 pointer (VT_I1 | VT_BYREF) 5 I2 pointer (VT_I2 | VT_BYREF) 6 I4 pointer (VT_I4 | VT_BYREF) 7 UI1 pointer (VT_UI1 | VT_BYREF) 8 UI2 pointer (VT_UI2 | VT_BYREF) 9 UI4 pointer (VT_UI4 | VT_BYREF) Added support for OLE functions that return byte arrays (variant type = VT_UI1 | VT_ARRAY). In this case, the function will copy the data to a newly-allocated binary buffer of the required size, with the binary EOD properly set, and the return value will be the binary buffer handle. The user is responsible for freeing this binary buffer. BinaryReadEx was returning 1 instead of 0 for a 0-byte file. If the following clipboard functions are unable to open the clipboard, they will now retry for up to 30 seconds: BinaryClipGet BinaryClipPut ClipAppend ClipGet ClipGetEx ClipHasFormat ClipPut SnapShot Added support for OLE variant types VT_I1, VT_UI1, VT_UI2, and VT_UI4. Changed error 3385 ("DiskExist: Invalid Disk Argument") to 1385. Fixed a problem with BinaryReplace replacing text past the binary EOD. Fixed a problem with the following functions crashing if the space bar and Esc keys were pressed simultaneously: AskFileText AskItemList AskTextBox ItemSelect TextBox TextBoxSort TextSelect In FileVerInfo, if you specify a blank string for "language-key" it will now additionally try to look up the item under the language key "000004B0" (Neutral, Unicode). Added two optional parameters to ShortcutDir: ShortcutDir(s:name [, i:source [, i:add-slash]]) "source" specifies the location from which the information will be retrieved: source location ------ -------- 0 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders (default) 1 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders "add-slash": if @TRUE, a backslash will be appended to the returned string if it doesn't already have a trailing backslash. The default is @FALSE. Added a new request # to DirWindows: 2 = shared Windows directory on a multi-user system (Windows 2000 and XP only). On other versions of Windows, this will return the same value as request 0. Fixed a problem with the StrFix[..] functions with "length" > 64K. Changed the behavior of IconReplace and IntControl(37). Instead of replacing an individual icon image in an EXE file, they now replace multiple images in an icon group in an EXE file. An icon group is a set of one or more associated icon images, of different dimensions and color depths. An EXE file can contain multiple icon groups; an icon (.ICO) file contains a single icon group. The difference betwwen the two functions is that IconReplace will modify the first icon group in the EXE, while IntControl(37) lets you specify which icon group to modify. The "p3" parameter in IntControl(37) now specifies the ordinal position of the icon group to modify. In both cases, each icon image in the targeted icon group in the EXE file is compared with each icon image in the specified .ICO file, and if the .ICO file contains an icon image whose size (and dimensions and color depth) is the same as the targeted icon image in the EXE, then the targeted icon image in the EXE is replaced with the corresponding icon image from the .ICO file. If no suitable replacement icon is found in the .ICO file, then that particular icon image in the EXE is left unchanged. Windows NT extender 34005 First showing up in WB 2001P New function: wntLastErrMsg() Retrieves the error message text for an extender error. Fixed problem with wntShareAdd under non-English versions of WinNT/Win2K. wntAccessList and wntAuditList now strip off the domain "NT AUTHORITY\". Added a new optional flag parameter to wnt[Access|Audit][Add|Del|Get]. Added new flags to wnt[Access|Audit]List. Added a new request number (#2) to wntAcctInfo. Added a new optional flags parameter to wntAcctInfo. Changed wntOwnerSet so that if the 'account-name' parameter's value is an empty string [e.g. ""], then the current user's account-name will be used as the value for this parameter. Improved/corrected the way wntOwnerSet handles folder/file and registry key objects under Win2K. Changed the flags that are valid for wntOwnerGet. Added a new optional flags parameter to wntOwnerSet. Added a flag to enable the display of a progress dialog box for wnt[Access|Audit][Add|Del|Mod] and wntOwnerSet. wntOwnerSet can now perform recursive processing of an entire folder & file hierarchy or a branch of the registry, by specifying new object types 301, 302, 303 and 401. wntOwnerGet and wntOwnerSet now support printer objects [object-type = 200]. Improved the way wnt[Access|Audit][Add|Del|Mod] and wntOwnerSet handle excessively long path names for recursive file object types 301, 302, and 303. wntLsaPolGet and wntLsaPolSet now support named LSA Private Data Objects, using the new class name "PrivateData". Changed wnt[Access|Audit][Add|Del], wntAccessMod, and wntOwnerSet so that recursive operation failures that used to return an error 575 now return 0 instead. Fixed a problem with wntRunAsUser with flag 1 hanging under Windows XP. Fixed problem with DLL not loading on NT 3.51. For wntShutdown, you can now specify a "timeout" of -1 to indicate that a time delayed shutdown request should be aborted, provided that the time delay has not already expired.

WinBatch version 2002A

WB 2002A Dec 24, 2001 Added warning message to compiler when attempting to use an improper icon. Fixed problem in Winbatch Studio with new BinaryBuffer/Array views. DLL 3.5acd First showing up in WB 2002A

WinBatch version 2002B

WB 2002B Jan 22, 2001 New function: BoxBitmap(box ID, coordinates, filename, stretch-mode) Displays a bitmap in a WinBatch box. (s) "filename" specifies the name of a BMP file. (i) stretch-mode specifies the mode to use when resizing the bitmap, and can be one of the following: Value Name Meaning ----- ---- ------- 1 BLACKONWHITE Performs a Boolean AND operation using the color values for the eliminated and existing pixels. If the bitmap is a monochrome bitmap, this mode preserves black pixels at the expense of white pixels. 2 WHITEONBLACK Performs a Boolean OR operation using the color values for the eliminated and existing pixels. If the bitmap is a monochrome bitmap, this mode preserves white pixels at the expense of black pixels. 3 COLORONCOLOR Deletes the pixels. This mode deletes all eliminated lines of pixels without trying to preserve their information. 4 HALFTONE Maps pixels from the source rectangle into blocks of pixels in the destination rectangle. The average color over the destination block of pixels approximates the color of the source pixels. Supported on Windows NT/2000/XP only. The stretching mode defines how the system combines rows or columns of a bitmap with existing pixels. The BLACKONWHITE and WHITEONBLACK modes are typically used to preserve foreground pixels in monochrome bitmaps. The COLORONCOLOR mode is typically used to preserve color in color bitmaps. The HALFTONE mode is slower and requires more processing of the source image than the other three modes, but produces higher quality images. DLL 3.5bcd First showing up in WB 2002B New IntControl: IntControl(80, 0, 0, 0, 0) Waits until no keys on the keyboard are pressed. Returns 1. IgnoreInput is now supported on Windows 98/ME/2000/XP. It will return -1 if run on an unsupported platform. Also you can now specify a "flag" of -1 to query the current state. Fixed problem with ArrInitialize not freeing any previous string values in the array. Added additional special characters to the SendKey (and SendKeysTo and SendKeysChild) functions. These may or may not work for any particular application or situation: Key SendKey equivalent --- ------------------ Print Screen {PRTSC} Left Alt key, standalone {LALT} Right Alt key, standalone {RALT} Left Control key, standalone {LCONTROL} Right Control key, standalone {RCONTROL} Left Shift key, standalone {LSHIFT} Right Shift key, standalone {RSHIFT} Left Windows key, standalone {LWIN} Right Windows key, standalone {RWIN} Applications key, standalone {APPS} Left Alt key, combination {*LALT} Right Alt key, combination {*RALT} Left Control key, combination {*LCONTROL} Right Control key, combination {*RCONTROL} Left Shift key, combination {*LSHIFT} Right Shift key, combination {*RSHIFT} Left Windows key, combination {*LWIN} Right Windows key, combination {*RWIN} Applications key, combination {*APPS} "Standalone" means the key is pressed and then released. "Combination" means the key is held down while the following key is pressed. The left and right Alt, Control, and Shift keys can only be distinguished on Windows NT/2000/XP. On other platforms they are treated as plain Alt, Control, and Shift keys, respectively. The "Windows" and "Applications" keys are on the Microsoft Natural keyboaard. Fixed a problem with empty WIL scripts causing an error, especially under Windows XP. Added an optional "format" parameter to DiskFree and DiskSize: DiskFree(drive-list [, format]) DiskSize(drive-list [, format]) This controls the format in which the size is returned if it is too large to be returned as an integer. The default format, 0, is floating point. If you specify "format" of 1, the size will be returned as a huge number. Changed error 3385 ("DiskExist: Invalid Disk Argument") to 1385. Windows NT extender 35001 First showing up in WB 2002B New functions: wntPrivUsers(server-name, privilege[, output-format-flag]) This function accepts a privilege name as input and returns a list of account names [or SID strings] that have been granted that privilege. wntSvcList(server-name, service/group-name, flags) This function allows services to be listed. On Win2K [and newer] systems, it is possible to selectively list services based on the groups to which they belong, based on the service type, and based on the service status. On WinNT [and newer] systems it is possible to list services based on service types and service status. On WinNT [and newer] systems it is possible to list all services [by type and status] that are dependent on a specified service. The following functions can now accept SID strings in place of group names. They can also return SID strings in place of account names for either all SIDs or only for SIDs that cannot be resolved to account names: wntMemberDel wntMemberGet wntMemberGrps wntMemberList wntMemberSet wntGroupDel wntGroupEdit wntGroupInfo wntGroupRen wntListGroups wntPrivAdd wntPrivDel wntPrivGet wntPrivList wntRasUserGet wntRasUserSet wntUserDel wntUserExist wntUserGetDat wntUserList wntUserProps wtUserSetDat wntUserRename wntWtsUserGet wntWtsUserSet The following functions now accept 2 new object types, 500 and 501: wntAccessAdd wntAccessDel wntAccessGet wntAccessList wntAuditAdd wntAuditDel wntAuditGet wntAuditList Object type 500 is for window station objects and object type 501 is for desktop objects. It is now possible to manipulate the security settings on window stations and desktops. Currently there is no function to list/enumerate window stations and desktop on the system, so you have to already know the name of the window station &| desktop that you want to manipulate. The default window station associated the keyboard, monitor & mouse [e.g. the console window station] is "WinSta0". The default desktop on the console window station named "Default", and it is referred to as "WinSta0\Default". All desktop objects must have their corresponding window station name prefixed onto them so that the format of the name is "window-station\desktop". The functions wntSvcCfgGet() and wntSvcCfgSet() have been modified. On Win2K [and newer systems] they are now capable of getting & setting service descriptions and service failure recovery settings.

WinBatch version 2002E

WB 2002E Jul 5, 2002 If you use IntControl 1007 to add an icon to the system tray, and also use IntControl 12 to prevent the script from being terminated, attempting to terminate the script no longer removes the icon from the system tray. DLL 3.6ecg First showing up in WB 2002E New functions: SysParamInfo(i:request, s/i:value, i:ini-update) Gets or sets system informtion. This function is like WinParmGet and WinParmSet, but has support for many more parameter types. See WIL help file for documentation. ObjectCollectionOpen(i:object-handle) Initializes enumeration of an OLE collection object. "object-handle" specifies the handle of an OLE object that represents a collection of variants, and which supports enumeration via the IEnumVARIANT interface. This function returns an enumeration handle, which can be used by the ObjectCollectionNext function to return items in the collection, one at a time. When you have finished enumeration, use the ObjectCollectionClose function to release the enumeration handle. ObjectCollectionNext(i:enumeration-handle) Continues enumeration of an OLE collection object. "enumeration-handle" specifies an enumeration handle returned by ObjectCollectionOpen. Each time this function is called, it returns an OLE object handle representing the next item in the collection. When enumeration is complete, it returns 0 (ie, a NULL object handle). Example: objFSO = ObjectOpen("Scripting.FilesystemObject") objDrives = objFSO.Drives hEnum = ObjectCollectionOpen(objDrives) While 1 objDrive = ObjectCollectionNext(hEnum) If objDrive == 0 Then Break Message("", objDrive.Path) ObjectClose(objDrive) EndWhile ObjectCollectionClose(hEnum) ObjectClose(objDrives) ObjectClose(objFSO) ObjectCollectionClose(i:enumeration-handle) Ends enumeration of an OLE collection object. "enumeration-handle" specifies an enumeration handle returned by ObjectCollectionOpen. Returns 0. AskColor(s:default-color, s:reg-key, i:format) Displays a color selection dialog box, and returns the selected color. "default-color" specifies an RGB color value in the form "#RRGGBB", where "RR" is the red component in hex (00-FF), "GG" is the green component in hex (00-FF), and "BB" is the blue component in hex (00-FF). This will be the color initially selected in the dialog. You may specify "" for a default of gray. "reg-key" specifies the name of a user-defined registry key under "HKEY_CURRENT_USER\Software\Wilson WindowWare" where persistent state information will be stored. It will be created if it does not already exist. If "" is specified, persistent state information will not be stored. "format" specifies the format in which the selected color will be returned: Format Meaning ------ ------- 0 RGB color value in the form "#RRGGBB" (see above). 1 RGB color value in the form "R|G|B", where "R", "G", and "B" are the respective red, green, and blue components, in decimal. AskFont(i:type, i:flags, s:reg-key, i:format) Displays a font selection dialog box, and returns information on the selected font. "type" specifies the type of fonts to be listed, and can be one of the following values: Value Meaning ----- ------- 0 Screen fonts 1 Printer fonts 2 Both screen and printer fonts If "type" is 1 or 2, a default printer must be installed, otherwise an error will occur. "flags" restricts the fonts that are listed, and can be 0 or more of the following values combined with the bitwise OR ('|') operator: Value Meaning ----- ------- 1 List only script fonts (exclude OEM and Symbol character sets) 2 List only non-vector fonts 4 List only fixed-pitch fonts 8 List only fonts available on both the printer and the display 16 List only scalable fonts 32 List only TrueType fonts 64 List only horizontally oriented fonts If flag 8 is specified, "type" will automatically be set to 2. "reg-key" specifies the name of a user-defined registry key under "HKEY_CURRENT_USER\Software\Wilson WindowWare" where persistent state information will be stored. It will be created if it does not already exist. If "" is specified, persistent state information will not be stored. "format" specifies the format in which information about the selected font will be returned: Format Meaning ------ ------- 0 Tab-delimited string in the format: LogFont [@TAB] PointSize [@TAB] Color [@TAB] FontType "LogFont" is a vertical-bar delimited string containing font attributes. See the "SysParamInfo" function for a description of the LOGFONT format string. "PointSize" is the font size in 1/10 of a point. "Color" is the font color, as an RGB color value in the form "#RRGGBB". See the "AskColor" function for a description. "FontType" is a bitmask specifying the font type, consisting of one or more of the following values which can be extracted with the bitwise AND ('&') operator: Value Meaning ----- ------- 256 The font weight is bold 512 The italic font attribute is set 1024 The font weight is normal 8192 The font is a screen font 16384 The font is a printer font 32768 The font is simulated by the graphics device interface (GDI) New IntControl: IntControl(82, p1, 0, 0, 0) Sets seed for the Random() function. This IntControl sets the seed value used in subsequent calls to Random(). "P1" specifies a non-negative seed value. If "p1" == 1, it will re-initialize the random number generator. Otherwise, it will set the generator to a random starting point. Added support for user-defined functions (UDF's) with global variables, defined using the keywords #DefineSubroutine and #EndSubroutine: #DefineSubroutine functname([param1, param2, ..., param16]) <code> Return retval #EndSubroutine This is the same as a regular UDF, except that it will be able to access and change variables in the calling script, and any variables it sets will not be destroyed when it returns. Added a new request # to SnapShot: 5 = Take snapshot of entire virtual screen (Windows 98/Me/2000/XP only) On versions of Windows that do not support virtual screens, this will be treated the same as request 0. Added a new "method" to IntControl(61) and IntControl(62): p1 Method to use -- ------------- 5 Display invisible window, then attach to the input thread of the foreground window In Windows 2000 and XP, the default method for IntControl(61) is now 5, and the default method for IntControl(62) is now 4. Fixed problem with StrFill crashing if 0 was specified for "length". Fixed an obscure problem with OLE calls erroneously failing. AskFileName now returns an error if 'filetypes' contains an odd number of items. Fixed a syntax problem when embedding an OLE call (with parameters) as a parameter within another function. Fixed problems with Dialog variables not being set properly if you pressed cancel or closed the dialog using the Close button (or system menu item). Dialog names can now be up to 19 characters long (was previously 16). Fixed a problem with very large encoded scripts causing an "Encrypted/Encoded verification failed" error. In DiskVolInfo, if the "root-path" parameter does not end with a backslash (and is not "") then a backslash will automatically be appended. IniItemize / IniItemizePvt no longer has a 32K limit on the size of the returned list when itemizing section names or key names. When an OLE function returns a byte array and a binary buffer is allocated to store it, the buffer type is now automatically set to 103. Increased the maximum number of UDF's from 100 to 200. Extenders can now have more than 100 functions (supported starting at feature level 1003). In a DebugTrace log, tick count is now formatted as an unsigned integer. Fixed problem with trailing comments on an #EndFunction line. If an #include directive specifies a file with a relative path, the file will be looked for in the script directory before the current directory. Fixed problem with IconReplace and IntControl(37) not working with some EXE's (ones whose icon group resources were numbered instead of named). If IgnoreInput is enabled, it will be temporarily disabled during SendKey (and SendKeysTo and SendKeysChild) functions in Windows 98 and Windows ME. Fixed problem with WinActivate in Windows 2000 and XP. The cancel handler and error handler modes are now reset to their default settings during Call's and UDF's. Fixed a problem with the Random() function returning 0 too often. Can now assign an OLE object handle to a property. Fixed problem with IconReplace and IntControl(37) not working with some 16-bit EXE's. Note that with 16-bit EXE's, these functions operate on individual icon images and NOT icon groups (ie, the changes made in version 2002P do not apply to 16-bit EXE's). You may now re-assign an array variable. Fixed problem with FileExist and FileSizeEx handling open system files (like PAGEFILE.SYS). This will work only if a full path name is specified or the file is in the current directory. Fixed problem with the script crashing after a 3647 error ("Cannot create embedded arrays"). New data types for BinaryOleType: 10 R4 pointer (VT_R4 | VT_BYREF) 11 R8 pointer (VT_R8 | VT_BYREF) Fixed problem with Goto and GoSub not ignoring labels inside a #DefineSubroutine block. Fixed problem with ObjectCollectionNext crashing when given an invalid OLE object. Message text is now truncated to 20,000 characters in the following functions: AskYesNo IntControl(1) Message Pause Terminate ItemLocate will now successfully find a blank item ("") in a list. Windows NT extender 37000 First showing up in WB 2002E New function: wntAcctList(s:server-name, i:request [, i:output-format-flag]) Rapidly lists accounts on an NT/2K/XP system. "server-name" is the UNC name of the server on which the function will execute (eg, "\\MYSERVER"), or "" for the local computer. Note: to list accounts in a domain, specify a domain controller for that domain as "server-name". "request" specifies the types of accounts to return in a delimited list. You can specify 0 to include all account types, or specify one or more of the following flags, combined using the bitwise OR ('|') operator: Request # Meaning --------- ------- 1 Return user accounts. The results are similar to using wntUserList() with an account type of "2". 2 Return machine accounts. The results are similar to using wntUserList() with an account type of "48" [16 | 32]. Please note that inter-domain trust accounts cannot be returned with wntAcctList(), although they can be returned with wntUserList(). 3 Return group accounts. The results are similar to using wntListGroups() with a @GLOBALGROUP group type. Please note that local groups cannot be returned with wntAcctList(), although they can be returned with wntListGroups(). "output-format-flag" [optional parameter] controls the format of the account names that are returned. Flag Meaning ---- ------- 0 (default) Return actual account name. 1 Account names will have domain names prefixed on to them, except in cases where the domain name is "BUILTIN" or "NT AUTHORITY". 2 Account names will have domain names prefixed on to them in all cases. 4 SID values will be returned in place of account names. 32 Display a progress dialog when obtaining a large list of accounts. This allows the script to show its continuing progress even though the extender function has not yet returned control to the script. 64 Force a 1 second delay between updates to the progress dialog box. 256 Allows extended information to be returned along with an account name. The additional information will appear as pipe "|" delimited fields in a record, with each record in the list delimited by a TAB character. In the case of a user account, the record format would be: "user|comment|full_name|flags|RID" In the case of a machine account, the record format would be: "machine|comment|flags|RID" In the case of a [global] group account, the record format would be: "group|comment|RID" The flags are the account flags. Refer to wntUserGetDat() for information regarding the various flag bits and their meanings. The RID is the Relative Identifier for the account, and it uniquely identifies the account within the domain in which the account is located. The RID appears as the very last component in the account's SID vaue. Returns a tab-delimited list of account names. This function performs tasks similar to wntUserList() and wntListGroups(), but it uses a different Win32 API function to perform these tasks and the type of accounts and the format of the data returned by this function differs in some subtle ways as compared to the return values of wntUserList() and wntListGroups(). The reason that this function exists is that the Win32 API function used by this extender function to list accounts on NT/2K/XP systems is highly optimized to enumerate [user, machine, group] accounts very quickly even when there are 10's of thousands of accounts in a domain. Fixed problem with wntSvcCfgGet crashing. The following functions now accept 2 new object types, 600 and 601: wntAccessAdd wntAccessDel wntAccessGet wntAccessList wntAuditAdd wntAuditDel wntAuditGet wntAuditList Object type 600 is for service display names and object type 601 is for service key names. It is now possible to manipulate the security settings on NT services. Fixed problem with wntShareList hanging when specifying a server with more than 2044 shares. Fixed problem with wntServiceAt crashing when there are a very large number of servers. Added an optional "display-flags" parameter to wntServiceAt. Fixed problem with wntSvcList running in an infinite loop. Fixed a bug where any of the wntAccess*()/wntAudit*() functions could cause an access violation error if a progress dialog box was being displayed. Fixed a bug where the permissions of "Everyone" - "Full Control" could not be properly deleted from the root folder of a NTFS volume that had the default permissions on it that are applied when the volume is first formatted. Code in the extender that automatically fixes security descriptors that Win2K has corrupted on its own was not properly handling a situation where Win2K corrupts the security descriptor on the root folder in a manner different from how it corrupts the security descriptor on other folders. Let's just say that the code handles these problems properly now. The wntListGroups() and wntUserList() functions now have some new output-format-flag bit values that allow multiple fields of group/user information to be obtained all at once instead of having to list all groups/users and then call wntGroupInfo()/wntUserGetDat(), respectively. This should cut down on the time that is required to obtain lists of groups/users such that actual group/user names and their corresponding descriptions/full-names are obtained for presentation in a GUI dialog box control. The wntListGroups() and wntUserList() functions now have a new output-format-flag bit value that allows a progress dialog box to be displayed while the extender is gathering information. In situations where several thousands of group/user accounts are being enumerated, these extender functions can execute for very long periods of time leading the user to believe that the script has gotten "hung up". The progress dialog box is updated every second to indicate that the extender function is still alive and what group/user it has most recently enumerated. The wntUserList() and wntListGroups() functions have had their performance improved by re-writing the internal functions that manage delimited lists. This re-write of the list management functions results in a significant improvement in the efficiency of the memory allocation/copy/de-allocation tasks that are performed while building a delimited list. Fixed problem with wntLsaPolSet not properly handling an empty SID string value passed in for element #2 in the class "PrimaryDomain".

WinBatch version 2002F

WB 2002F Jul 10, 2002 DLL 3.7fcg First showing up in WB 2002F Added new request to IntControl(77): Request Meaning ------- ------- 62 tab-delimited list of OLE objects In Dialog function, increased item, dropdown, and file list box number of items capacity for WinNT/Win2k/XP machines.

WinBatch version 2002G

WB 2002G Jul 15, 2002 DLL 3.7gcg First showing up in WB 2002G Fixed problem with Random() function crashing on negative values. Fixed problem with variables beginning with high ASCII characters causing a crash. Changes to the Dialog function and related functions: Added code to work around Windows bug that caused hard crash when user pressed button accelerator keys that produced dialog termination. Added documentation for DialogControlSet/Get request code 13. (Change text color.) Changed DialgControlGet so that it reports the user's first edit to edit box part of drop down list control. (Windows does not report the content of the edit box as the selected item the first time the user changes the text: go figure.) Added workaround for WinXP bug that caused WB crash, if user cancels dialog from a Droplist change procedure event. Fixed bug in DialogControlState function that would not permit it to set the focus (request code 1) to a spinner control. Added new request-code to the dialogControlState function. New request returns the number of the control with the focus or 0, if no control has the focus.

WinBatch version 2002H

WB 2002H Aug 22, 2002 Fixed problem with some of the Box functions when in a Dialog callback. DLL 3.8hch First showing up in WB 2002H New functions: ObjectType(s:variant-type, s/i:value) Creates a WIL variable with a specific OLE variant type. "variant-type" can be one of the following: Variant-type Value to specify ------------ ---------------- "I1" A 1-byte character value "I2" A 2-byte integer value "I4" A 4-byte integer value "UI1" An unsigned 1-byte character "UI2" An unsigned 2-byte integer value "UI4" An unsigned 4-byte integer value "BOOL" A Boolean (True/False) value "CY" A currency value, specified as a string in the form "#CURRENCY:value" "DATE" A date/time value, specified as a string in Ymd or YmdHms format "DECIMAL" A decimal value, specified as a string in the form "#DECIMAL:value" "NULL" A blank string ("") Note that "variant-type" may optionally be preceded by the prefix "VT_", so for example you could specify either "BOOL" or "VT_BOOL". When an OLE method or property returns a value that is one of these supported variant types, WinBatch now retains the variant type for the returned variable, without having to use the ObjectType function. However, if you subsequently assign a new value to that variable using a regular WIL assignment operator, the variant type information will be lost. For example: visible = ExcelApp.Visible ExcelApp.Visible = visible The variable "visible" is returned as a VT_BOOL, and is still a VT_BOOL when it is passed back to the OLE object. But here: visible = ExcelApp.Visible visible = 0 ExcelApp.Visible = visible The assignment "visible = 0" causes "visible" to become an ordinary WIL integer, without a variant type. In that case, if you wanted it to be a VT_BOOL you would need to use ObjectType: visible = ObjectType("BOOL", 0) ExcelApp.Visible = visible Or simply: ExcelApp.Visible = ObjectType("BOOL", 0) ObjectTypeGet(s:varname) Gets the OLE variant type of a WIL variable. This function returns the "variant-type" string for the specified variable name, or "" if it does not have a variant type. See ObjectType for a list of possible "variant-type" strings. BinaryChecksum(i:handle, i:request) Returns the MD5 digest (fingerprint) or simple CRC of a binary buffer. "handle" specifies a binary buffer handle. "request" specifies the type of digest or CRC to generate, and can be one of the following values: Request Meaning Return string format (x = hex character) ------- ------- ---------------------------------------- 0 MD5 digest "xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx" 1 16-bit CRC "xxxx" 2 32-bit CRC "xxxxxxxx" Returns a hex-value string. New IntControl: IntControl(81, p1, 0, 0, 0) Sets seed for the Random() function. This is identical to IntControl 82. Improved WinPlace on multi-monitor systems, but it will only work properly if all monitors are the same resolution. In the Dialog function, the value of the WIL variable associated with a VARYTEXT control is no longer modified by the function. Fixed problem wih OLE objects being freed when used on a line like: If MyObject Fixed problem with BinaryStrCnt and high-ASCII characters. You can now pass a VT_NULL as a parameter to an OLE function as: NULL:"" When specifying a variant type for a parameter to an OLE function, you can now optionally precede the type with "VT_". For example, the following two lines may be used interchangeably: MyObject.Pause(BOOL:0) MyObject.Pause(VT_BOOL:0) Added new request to IntControl 77: Request Meaning ------- ------- 63 reference count of OLE object specified by P2 Changes to the Dialog function and related functions: Added "Number-Only" (64) style for edit controls. Added "Add-Item" (14) request code to DialogControlSet function. Allows addition of single item to File list, Item List and drop down List boxes. Added "Remove-Item" (15) request code to DialogControlSet function. Allows removal of single items from File List, Item List and Drop-down List boxes. Added "Disable Input" option code (1000) to DialogProcOptions function. When set, user input to dialog is ignored and title bar is "grayed" but dialog screen images are redrawn as needed. If DialogProcOptions' third parameter is set to 2 instead of one the "Wait" cursor is also displayed. "Snap-to-default-button" setting now respected on Windows NT 4.x, Windows 2000, and Windows XP machines. Added "Set-dialog-background" option code (1001) to DialogProcOptions function. Allows user to dynamically change dialog's background bitmap or color. Improved rendering of bitmaps on palette based display devices Dialog Editor 2002H First showing up in WB 2002H Bug Fix -"multiple radio buttons with same value" error message appear when the condition dose not exist. Added check to Dialog Editor that looks at the for dialog function's parameter value. Necessary because can cause the creation of WIL reserve words as dialog attribute variable names when prefixed to attribute names. Bug Fix - picture buttons did not always display the default bitmap when created. Bug Fix - Added File List Box counting (only one permitted) when templates saved to the clipboard. User now has option to save a dialog template with errors. Added "Number-Only" (64) style for edit controls. User menu choices for View->Grid and View->Bitmap menu items are now remembered between sessions. Also,view menu settings are respected when the dialog background is changed. Windows NT extender 38001 First showing up in WB 2002H In wntAccessMod and wntAuditMod, request #3 (re-enable ACL inheritance) was not properly stripping explicitly assigned ACEs from the ACL. NetWare 4 extender 38000 First showing up in WB 2002H Fixed problem with n4MemberDel and n4MemberSet with Novell eDirectory. n4MemberDel and n4MemberSet now remove/set the "Equivalent To Me" attribute.

WinBatch version 2002J

WB 2002J Dec 2, 2002 New IntControl: IntControl(1009, p1, 0, 0, 0) Gets name of current service. If the current script is running as a service, this function returns the name of the service. Otherwise it returns a blank string (""). "P1" specifies which name to return: P1 Meaning -- ------- 0 Returns the service name (the actual registry key name) 1 Returns the display name (the name shown in Control Panel) In the compiler, if you press Cancel in the Options dialog it no longer resets the target file name to have the same base name as the source file. DLL 3.9jci First showing up in WB 2002J New functions: ItemCountCsv(s:line, i:flags) Returns the number of items in a CSV line. This function is like ItemCount, but instead of a list it counts items in a CSV line. See ItemExtractCsv for more information. ItemExtractCsv(i:index, s:line, i:flags) Returns the selected item from a CSV line. "index" specifies the ordinal position of the item to be returned. "line" specifies a CSV line (see below). "flags" can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value Meaning ----- ------- 1 treat leading and trailing whitespace as significant This function is like ItemExtract, but instead of a list it extracts items from a CSV line. A CSV ("comma separated values") line consists of comma-delimited items. Items may optionally be enclosed in quotation marks (aka, "double quotes"). There are two cases where an item *must* be enclosed in quotation marks: (1) If the item contains a comma (2) If the item contains a quotation mark Here are some examples: 1,2,3,4,5 "January","February","March" "Doe, John",20 In order to embed a quotation mark in an item, you must replace it with two quotation marks (ie, add an extra quotation mark). For example, you would specify the item "My Fair Lady" (with quotes) as: """My Fair Lady""" Each quotation mark is doubled, and the entire item is enclosed in a set of quotation marks. Normally, whitespace outside of quoted strings is ignored. The following two lines would be considered identical: A,B,C A, B, C But if you specify a "flags" value of 1, then the whitespace will be considered part of the items. Whitespace *inside* a quoted string is always preserved, regardless of the "flags" value: " This line has spaces around it " Similarly, whitespace outside of a quoted string is always ignored. Ie, the following two lines are considered identical, regardless of the "flags" value "String 1","String 2","String 3" "String 1", "String 2", "String 3" The function returns the selected item, with any enclosing quotes removed, and any doubled quotation marks converted to normal quotation marks. Leading and trailing whitespace may be stripped out, as described above. New IntControl: IntControl(83, p1, 0, 0, 0) Specifies how OLE byte arrays will be handled. This specifies how to handle OLE methods and properties that return an array of bytes (VT_I1 or VT_UI1). P1 Meaning -- ------- 0 Return as WIL array (default) 1 Store in binary buffer 2 Return as string Returns previous setting. Fixed problem with WinPlace on multi-monitor systems when using the @NORESIZE and @ABOVEICONS constants. Labels for Goto and Gosub can now be up to 249 characters (they were restricted to 30 characters in version 2002H). When the Run[..] functions retrieve command-line parameters from the registry, they now support the %* token, which gets replaced by all remaining parameters. Added an optional parameter to AppExist and AppWaitClose: AppExist(s:program-name [, i:current-session-only]) AppWaitClose(s:program-name [, i:current-session-only]) If "current-session-only" is @TRUE, and the script is running in a Terminal Services environment, then the specified application will only match if it is running in the same session as the script. If "current-session-only" is @FALSE or omitted, then the specified application will match regardless of what session it is running in. Added a new parameter to IntControl 56: IntControl(56, p1, p2, p3, 0) p3 = "current-session-only" flag (applies only if p2 == 1). See AppExist for more information. The following functions now return an error if "delimiter" is more than a single character: Arrayize AskItemList ItemCount ItemExtract ItemInsert ItemLocate ItemRemove ItemReplace ItemSort In AskDirectory, fixed problem where "start-dir" specified a UNC. StrIndexWild now returns "start" instead of 0 if "pattern" is a blank string (unless "start" == 0, in which case it returns 1). Fixed problem with TimeDelay at Daylight Savings Time changeover. TimeDelay will now always wait at least the specified amount of time. Fixed problem with SysParamInfo returning an error if "ini-update" was 3. In MousePlay, added support for multiple monitors in Windows 2000 and Windows XP. Added support for OLE methods and properties that return arrays. The return values will be returned as a WIL array. Note that byte arrays are no longer converted to a binary buffer by default, as in previous versions, but this behavior can be changed with the new IntControl 83. OLE return types of VT_ERROR are now supported properly. They now return the SCODE associated with the error, instead of 0 as before. Changes to the Dialog function and related functions: Fixed bug in DialogControlSet function. Changes to MULTILINE control's text now appear immediately. Fixed bug in DialogControlGet function. Request code #13 (Get Text Color) now returns correct text color when control also has "DEFAULT" background specified. The function was returning "DEFAULT" for any text color when the control had the "DEFAULT" background. Removed limit on the size of individual items in ITEMLIST and DROPLISTBOX controls. Removed limit on the number of items that can be saved into a ITEMLIST control variable on dialog dismissal. Fixed bug in automatic sizing of DROPLISTBOX when control has a user selected font specified. Fixed bug in automatic tab-order reassignment when attempting to maintain GROUPBOX member control associations. Added 2 new callback request codes for the DialogProcOptions function. Callback code 12 produces a user defined dialog procedure callback when the dialog's user double-clicks an FILELISTBOX item and callback code 13 produces a callback when the dialog's user double-clicks an ITEMBOX item. Extended DialogControlSet/Get request code #10 functionality to MUILTLINEBOX controls so control can be scrolled from within a user defined dialog procedure. Dialog window now will minimize to the windows taskbar. IntControl(49, 1, 0, 0, 0) must be used to turn on system menus for this feature to take effect. Spinner controls no longer permit user to type or paste invalid text into control. Invalid text is text that contains characters other than decimal digits and sign (+,-) characters. As a side effect the control no longer considers the thousands separator (,) as valid text. Added <dialog-var>config varaible to dialog template. This variable controls how the dialog editor creates the "dialog" statement in the template. Added new "flat" (128) style to dialog push and picture buttons. Added support for embedded double quotes in control text attribute. Each double quote must be specified by placing two double quotes at the desired location of the double quote. Also the entire text attribute must be surrounded by single double quotes. "Snap-to-default-button" functionality is now supported on secondary monitors of multi-monitor desktops (Windows 2000 and Windows XP only) Fixed bug in that caused AskItemList function to fail when called from dialog procedure. Fixed crash bug that occurred when user dialog procedure returns a positive number in response to a DROPLISTBOX change event (Windows XP only.) Dialog Editor 2002J First showing up in WB 2002J Editor changed to display control text as it will appear when the dialog is displayed by the dialog function. Editor now respects beginning and ending double quotes in the controls text attribute. Editor changed to automatically add a second set of double quotes to template when the text attribute is specified containing double quotes. (User only needs to add one double quote in control property sheet.) Added checking for invalid values for SPINNER control's pre-selected item attribute to editor. Does not error but does substitute DEFAULT key word for invalid value. Added ability to move multiple controls simultaneously with either mouse or arrow keys. Added ability to select multiple controls simultaneously with keyboard by using the Control+tab key combination. Ok button now has default button style in Dialog Editor's default template.

WinBatch version 2002K

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

WinBatch version 2003A

WB 2003A Dec 23, 2002 DLL 4.0ada First showing up in WB 2003A New IntControl: IntControl(84, p1, 0, 0, 0) (Windows NT/2000/XP only) Itemize desktops, or windows on specified desktop. If "p1" is a blank string (""), this returns a tab-delimited list of desktops, or a blank string ("") if the function fails. If "p1" specifies a desktop name, this returns a tab-delimited list of "Window ID's" of all top-level windows on that desktop, or a blank string ("") if the function fails. Fixed problem with WinPlace using the @NORESIZE and @ABOVEICONS constants. Added an optional parameter to ItemCountCsv and ItemExtractCsv: ItemCountCsv(s:line, i:flags [, s:delimiter]) ItemExtractCsv(i:index, s:line, i:flags [, s:delimiter]) "delimiter" specifies a character used to separate values, instead of a comma. It can be any single character except a space, tab, null, or quotation mark (double quote). DirMake no longer returns an error if a root directory is specified. DirMake now returns an error if the specified directory has more than one consecutive slash (other than the two backslashes at the beginning of a UNC). Changes to the Dialog function and related functions: Fixed bug that causes the edit part of a Spinner control to remain visible when the control's state is changed to invisible via a call to DialogControlState. Changed error message associated with memory allocation errors. Dialogs can now be created without any controls (NumControls=000 will not cause error.) Fixed very rare system access violation error that occurred when displaying bitmaps. Dialog Editor 2003A First showing up in WB 2003A Editor now creates the 2 parameter version of the "Dialog" statement only when "Create dialog statement that WinBatch will ignore" is selected on the configuration page of the Dialog Attributes property sheet.

WinBatch version 2003B

WB 2003B Jan 8, 2003 Test Version

WinBatch version 2003C

WB 2003C Jan 10, 2003 DLL 4.0cda First showing up in WB 2003C IntControl's 39 and 40 were not properly handling p1 == 0. Fixed a memory leak problem in ObjectCollectionClose. There may now be a slight performance degradation in ObjectCollectionNext as a result. Dialog Editor 2003C First showing up in WB 2003C Fixed several problems with the "Dialog" statement generated when changes are made to the Dialog configuration.

WinBatch version 2003D

WB 2003D Feb 21, 2003 Redesigned compiler interface. DLL 4.0dda First showing up in WB 2003D New functions: BinaryIndexBin(i:handle, i:offset, s/i:item, i:direction, i:match-case) Searches a buffer for an item. "item" specifies the item to be searched for. It may be either a hex string indicating the bytes to search for (two hex characters per byte), or the handle of a binary buffer containing the bytes to search for. If "item" is a blank string or an empty binary buffer, "offset" will be returned. This function is like BinaryIndexEx, but can search for strings containing NULL bytes. See BinaryIndexEx for additional information. Returns the offset where the item was found, or -1 if not found. WinPlaceChild(x-ulc, y-ulc, x-brc, y-brc, partial-parent-winname, partial-child-winname) Places a child window. "partial-parent-winname" specifies the parent of the window to place. "partial-child-winname" specifies the child window to be placed. This function is like WinPlace, but places a child window. The coordinates are specified as virtual coordinates within the client area of the parent window, where the parent window is 1000 x 1000. See WinPlace for additional information (but you can't use @ABOVEICONS). Returns 1 on success. WinPositionChild(partial-parent-winname, partial-child-winname) Returns child window position. "partial-parent-winname" specifies the parent of the window. "partial-child-winname" specifies the child window. This function is like WinPosition, but returns coordinates for a child window. The coordinates are specified as virtual coordinates within the client area of the parent window, where the parent window is 1000 x 1000. See WinPosition for additional information. Returns (s) window coordinates, delimited by commas. Changed the way the internal path name expansion functions determine the current directory, and fixed a problem where the current directory was a UNC and a file or path name beginning with '\' was specified. This affects FileFullName and other file management functions. Fixed a problem that could occur if Gosub failed due to a missing label, but this error were trapped by a user-specified error handler routine, then there would be a missing Return statement and control would return to the wrong place in the script. Fixed a problem with ObJectType returning an error if "value" already had an OLE type. ArrDimension and Arrayize will now let you create a 0-dimension array. If AddExtender fails, the extender will now be unloaded. Changes to the Dialog function and related functions: Fixed bug that caused the default button boarder to not display after a dialog box was disabled and then enabled with the DialogProcOptions function request 1000. Fixed bug in DialogControlState function that caused a button to loose style 32 (default button) when the request code 3 (add style) was specified with style 32 and the button already had style 32. Fixed bug in DialogControlState function that caused a control to sometimes not become invisible when the control style was set to 1 (invisible) with request code 3 (add style). This problem usually occurred with the Calendar control when rapidly turning the style 1 (invisible) on and off. Fixed problem with multi-selection Itembox's incorrectly displaying an item with selection coloring when the item was not actually selected. This only occurred on Windows 2000/XP computers and was usually associated with the user selecting an item using alphanumeric keystrokes as apposed to mouse clicks or arrow keystrokes. The problem appears to stem from a defect in the Windows operating system but WinBatch was modified to compensate for the aberrant behavior. Spinner control's display window changed to right justified text. Fixed bug that caused a blank line to be added to the list part of a Droplistbox when the selection was cancelled using the DialogControlSet function with request code 6 (select item) and an empty string to clear the current selection in the control. Modified behavior of DialogControlSet request code 14 (add single item) to preserve the sort order of Droplistbox controls when the existing contents are in sort order. Fixed bug that caused an dialog procedure option 6 (file selection change) or 7 (item selection change) call to the user defined dialog procedure when a FILELISTBOX's or ITEMBOX's selection is changed programmatically using the DialogControlSet function with request code 6 (set selection). Dialog Editor 2003D First showing up in WB 2003D Change the key mnemonic associated with the "Text Color" edit control in the "Text Appearance" property page of the "Attribute" property sheet from "c" to "l". Fixed problem with editor not properly displaying a new background color when the user changed the existing background color for "Editbox", "Multilinebox" and "Droplistbox" controls. Windows NT extender 39001 First showing up in WB 2003D The wntGetCon() function was generating an error instead of simply returning an empty string [""] on WinXP when an LPTx: port was not currently connected to a network resource and did not currently exist as a physically present parallel printer port. This function now suppresses the error that is produced only on WinXP and returns an empty string [""] instead. The wntAccess*(), wntAudit*() and wntSecurity*() functions were plagued with some problems specific to Win2K/WinXP. These problems were caused by some security descriptor control flags that were not being properly reported by the low-level security Win32 API functions. Despite the fact that many of the high-level security Win32 API functions are horribly broken in many ways across many versions of the NT platform family, and even broken differently across different service packs, it was necessary to use one of them to retrieve the security information for NTFS folders & files in order to work around this particular bug. The end result of this is that managing NTFS permissions on Win2K & WinXP from a Win2K or WinXP system will now work OK even when the corrupted SD control flags are encountered. However, WinNT systems might not be able to manage NTFS permissions on a remote Win2K/WinXP system in certain situations; the error that the extender will generate in this situation is error #716. A new function, wntProfileInfo(), has been added. This function allows you get some profile related information on WinNT v4.0, Win2K and WinXP systems. A new function, wntProfileDel(), has been added. This function allows for profiles to be deleted from the system. A new function, wntDfsList(), has been added. This function allows for DFS shares to be listed in a domain [AD mode] or on a standalone DFS server. A new function, wntDfsGetInfo(), has been added. This function allows for detailed DFS share information to be obtained, including information about all of the storage targets associated with any particular DFS share.

WinBatch version 2003E

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

WinBatch version 2003F

WB 2003F Mar 4, 2003 DLL 4.0fda First showing up in WB 2003F New Functions: BinaryPeekHex(i:handle, i:offset, i:count) Extracts data from a binary buffer as a hex string. "count" specifies the number of bytes to read from the buffer. The return value is a hex string, containing 2 hex characters for each byte read from the buffer. BinaryPokeHex(i:handle, i:offset, i:hex-string) Writes data in hex string form into a binary buffer. "hex-string" is a hex string, containing 2 hex characters for each byte that will be written to the buffer. Returns the number of bytes written to the buffer. Fixed problem assigning an array to itself.

WinBatch version 2003G

WB 2003G Apr 23, 2003 WinBatch now returns one of the following exit codes to indicate a startup error: Code Meaning ---- ------- 255 StartServiceCtrlDispatcher failed (service) 254 RegisterServiceCtrlHandler failed (service) 253 expired beta version 252 beta copy -- user cancelled warning dialog 251 RegisterClass failed 250 CreateWindow failed 249 DLL(s) not found or created (compiled script) 248 Batch DLL initialization error 247 RegisterClass failed (entering shutdown mode) 246 CreateWindow failed (entering shutdown mode) DLL 4.0gda First showing up in WB 2003G New functions: ArrayFileGet(s:filename [, s:null-char [, i:extra-alloc]]) Converts a file to a one-dimension array. "null-char" specifies the character which NULL bytes in the file will be replaced with in the array. If omitted or a blank string (""), then NULL bytes will be removed. "extra-alloc" specifies the number of additional elements to add to the end of the array. If omitted, it will be 0. This function creates a one-dimension array and stores each line of the specified file as string elements in the array. Line 1 of the file is stored as array[0], and so on. The array may have up to 65,535 elements (lines in file + "extra-alloc"). By default, the maximum supported file line length is 4096. This can be increased using IntControl(65). Returns an array. ArrayFileGetCsv(s:filename, i:flags [, s:delimiter [, i:extra-rows [, i:extra-cols]]]) Converts a CSV file to a two-dimension array. "flags" can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value Meaning ----- ------- 1 treat leading and trailing whitespace as significant "delimiter" specifies the character used to separate values on each line of the file. It can be any single character except a space, tab, null, or quotation mark (double quote). If omitted, a comma will be used as the delimiter. "extra-rows" specifies the number of additional elements to add to the end of dimension 1 of the array. If omitted, it will be 0. "extra-cols" specifies the number of additional elements to add to the end of dimension 2 of the array. If omitted, it will be 0. This function creates a two-dimension array and stores each line of the specified CSV file as rows and columns in the array. The first item on line 1 of the file is stored as array[0, 0], the second item on line 1 of the file is stored as array[0, 1], the first item on line 2 of the file is stored as array[1, 0], and so on. By default, the maximum supported file line length is 4096. This can be increased using IntControl(65). The file may not contain any NULL characters. Returns an array. ArrayFilePut(s:filename, a:array [i:write-undef]) Writes a one-dimension array to a file. If "write-undef" is @TRUE, then uninitialized elements in the array will be written as blank lines in the file. If "write-undef" is @FALSE, then uninitialized elements will not be written. This function writes a one-dimension array to a file, one element per line. If "filename" exists, it will be overwritten. By default, each line in the file will be terminated with a CR/LF. This can be changed using IntControl(53). Returns the number of bytes written to the file. ArrayFilePutCsv(s:filename, a:array [, s:delimiter [, i:write-undef]]) Writes a two-dimension array to a file. "delimiter" specifies the character used to separate values on each line of the file. It can be any single character except a space, tab, null, or quotation mark (double quote). If omitted, a comma will be used as the delimiter. If "write-undef" is @TRUE, then uninitialized rows in the array (ie, rows with no initialized items) will be written as blank lines in the file. If "write-undef" is @FALSE, then uninitialized rows will not be written. By default, each line in the file will be terminated with a CR/LF. This can be changed using IntControl(53). Returns the number of bytes written to the file. FileGet(s:filename [, s:null-char]) Converts a file to a string variable. "null-char" may specify a 1-byte character which NULL bytes in the file will be replaced with in the string. If omitted or a blank string (""), then NULL bytes will be removed. Returns a string containing the file contents. FilePut(s:filename, s:string) Writes a string to a file. If "filename" exists, it will be overwritten. Returns the number of bytes written to the file. OLE object names can now be 30 characters long (was 29). OLE method and property names can now be 256 characters long (was 29). Fixed a problem with AskItemList crashing in some cases when more than 64K of data was returned from a multiple-selection listbox. Fixed a problem with DebugTrace(2) dumping the variable table when a UDF returned. In AppExist, AppWaitClose, and IntControl(56), changed the method used to handle the "current-session-only" flag. Note that if "current-session-only" is @TRUE, then "program-name" will be treated as a file name and not a module name. If "program-name" includes an extension, then it will have to match the filename of a running process in the current session. If "program-name" does not include an extension, then only the root parts of the file names will have to match. Any path information is ignored. ParseData no longer has a limit of 9 parameters. The tenth parameter now gets stored as "param10", etc. There is no longer a limit of 9 command-line parameters. The tenth parameter now gets stored as "param10", etc. Arrays created in a UDF are now freed automatically when the UDF returns. In RunWithLogon, you can now specify "." for "domain" in Windows 2000. Added new "flags" values to AskDirectory: Flag Meaning ---- ------- 4 Use the new user interface. Setting this flag provides the user with a larger dialog box that can be resized. The dialog box has several new capabilities including: drag and drop capability within the dialog box, reordering, shortcut menus, new folders, delete, and other shortcut menu commands. NOTE: This is supported only in Windows ME, Windows 2000, and Windows XP. In other versions of Windows, this flag is ignored. 8 Do not include the "New Folder" button in the browse dialog box. NOTE: This is supported only in Windows XP. In other versions of Windows, this flag is ignored. Selecting Cancel in a Debug dialog now ends the program even if it was in a called script. Changes to the Dialog function and related functions: Change how the dialog function accesses the Windows Common Control dynamic link library so that user of Windows NT 3.51 can install and run WinBatch. Fixed bug that caused floating point numbers to be incorrectly displayed by controls when the number was assigned to the control's associated variable before calling the "Dialog" function. Fixed bug that caused 3097 error on dialog exit when a dialog template contained a ITEMBOX control and "IntControl(33)" was called inside the dialog procedure to change from single to multi-select list boxes. Fixed problem with default button style (again). Default button style was being ignored and the first button on the dialog with any style set was getting the default designation. Added new "No Auto Height Resizing" (256) style for ITEMBOX and FILELISTBOX controls. The style turns off the automatic height adjustment that occurs to prevent the last visible item form being just partially displayed. Dialog Editor 2003G First showing up in WB 2003G Fixed bug that allowed controls from a previous template to appear in a new template loaded from a file. In order for this bug to occur the new template need to have an incorrect number of controls specified in the "NumControls" dialog variable and the new dialog needed to have the same dialog variable name as the previous dialog. Fixed bug that sometimes caused invalid values to be written to the Configuration line of dialog templates. Added new "No Auto Height Resizing" (256) style to ITEMBOX and FILELISTBOX control's style property pages. Windows NT extender 39002 First showing up in WB 2003G The wntShare*() functions have been updated to accept 2 new types of shares. It is now possible to add & delete IPC shares [share type = 3] and Special shares [share type = 2147483648]. Please note that when adding Special shares like "ADMIN$" it is necessary to specify an empty string as the resource name; WinNT/2K/XP will take care of associating the proper resource name with the special share name.

WinBatch version 2003H

WB 2003H May 8, 2003 Added compiler setting to enable large EXE's to extract files on removable drives. DLL 4.0hda First showing up in WB 2003H Fixed a problem with flag 4 in AskDirectory. "Line too long" errors can now be trapped with IntControl(73). In AppExist, AppWaitClose, and IntControl(56), fixed a problem using the "current-session-only" flag while specifying a "program-name" without an extension. Changes to the Dialog function and related functions: Added two new styles for VARYTEXT and STATICTEXT controls. The "Center Text" (512) style centers text in the control's rectangle. The "Right Text" (1024) style places the text flush with the right side of the control's rectangle. Dialog Editor 2003H First showing up in WB 2003H Fixed bug that allowed controls from a previous template to appear in a new template loaded from a file when a new dialog was created between loading the two templates from a file or the clipboard. Fixed bug that allowed controls to be expanded outside the bounding dialog when using the shift key in combination with the arrow keys. Improved tracking of "undo" modification so the "Save" toolbar button and menu option are not left enabled when all changes have been undone. Added control id number to the title of control's properties sheet. This is the number that uniquely identifies a control in a user's Dialog procedure. Added two new styles to VARYTEXT and STATICTEXT controls property pages. The "Center Text" (512) style centers text in the control's rectangle. The "Right Text" (1024) style places the text flush with the right side of the control's rectangle.

WinBatch version 2003J

WB 2003J Jun 30, 2003 Fixed IntControl(1009). DLL 4.2jdb First showing up in WB 2003J ParseData no longer has a limit of 256 characters for each parameter. Added an error check for a #DefineFunction (or #DefineSubroutine) without a matching #EndFunction (or #EndSubroutine). Fixed problem passing an array to a #DefineSubroutine where the UDF parameter name was the same as the existing array variable name. In the following functions, "delimiter" may not be a carriage return or line feed. It may now be a tab, in which case tabs will not be treated as whitespace: ArrayFileGetCsv ArrayFilePutCsv ItemCountCsv ItemExtractCsv In ItemRemove and ItemReplace, you can now specify -1 for "index" to represent the last item in the list. ArrayFilePutCsv now doubles any existing quote marks. Named parameters in OLE are no longer limited to 255 characters. Added an optional parameter to ArrayFilePutCsv: ArrayFilePutCsv(s:filename, a:array [, s:delimiter [, i:write-undef [, i:flags]]]) "flags" can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value Meaning ----- ------- 2 don't put quotes around the values being written, or double existing quotes Changes to the Dialog function and related functions: Fixed bug that prevented dialogs from being displayed on a secondary monitor of multi-monitor systems when the secondary monitor it to right or above the primary monitor. Added error checking that detects and declines to load any dialog template with an inverted dialog window rectangle. Dialog Editor 2003J First showing up in WB 2003J Added a warning message during the template loading processing that is displayed when an empty or inverted dialog window rectangle is detected. Removed restriction on a dialog window's origin (position) that did not permit coordinates of less than -1. Added detection of WIL operators and arrays in control variable names. An error message is generated if an attempt is made to add one of these characters to variable name using the "General" property page. If an offending character is found while loading a template from file or clipboard, a warning is displayed and the control is not used in the dialog. Standardized tab order of controls in and added missing accelerator keys to attribute property pages. Removed disabling of edit boxes and push buttons on the "Background" and "Text Appearance" property pages when the "Use Default ..." check box is checked. The check box is automatically unchecked when values are modified by the user. WinInfo 2.1a First showing up in WB 2003J Changed the way top-level windows are identified.

WinBatch version 2003K

WB 2003K Nov 19, 2003 In IntControl(1007), if "p1" == 3 (suspend script), then "p2" now specifies a timeout value in milliseconds after which the script will automatically continue. If "p2" == 0, there is no timeout. If a BoxDataClear error was suppressed, it could cause the program to hang. Fixed a problem with the compiler not handling nested "#include" directives properly. DLL 4.3kdc First showing up in WB 2003K New functions: BinaryBufInfo(i:handle, i:request) Returns information about a binary buffer. "handle" specifies a binary buffer handle. "request" specifies the type of information to return, and can be one of the following values: Request Returns ------- ------- -1 @TRUE if "handle" is a binary buffer, @FALSE otherwise. 0 buffer size 1 buffer memory address (same as IntControl(42)) 2 binary EOD (same as BinaryEodGet) Returns an integer value. FileBaseName(s:filename [, i:add-dot]) Returns the base part of a filename. "filename" specifies a full file name, which may include a path. "add-dot" specifies whether a dot should be appended to the returned string for file names which do not have an extension. @TRUE means append a dot, @FALSE means don't. If omitted, the default is @FALSE. This function returns the [root + extension] part of a filename. WaitForKeyEx(s:key-codes, f:timeout) Waits for a specific key to be pressed. "key-codes" is a tab-delimited list of keys to wait for. See WaitForKey for a list of keycodes. If "key-codes" is a blank string (""), the key codes from the most recent use of this function will be used again, which will save the overhead of re-parsing the string. "timeout" is the number of seconds to wait before returning. Specify 0 to have the function return immediately without waiting. Specify -1 for no timeout (ie, wait forever). This function is like WaitForKey, but lets you specify up to 100 keys to wait for, and allows for a timeout. If one of the specified keys is pressed before the timeout occurs, the function will return a value corresponding to the position in "key-codes" of the key that was pressed, where the first key in the list is 1. If none of the specified keys are pressed before the timeout occurs, the function will return 0. IntControl(87, p1, 0, 0, 0) Sets Execute recovery mode. This specifies what should happen if the Execute command causes an error. P1 Meaning -- ------- -1 Don't change (just return current setting) 0 Display a dialog with an option to continue or cancel (default) 1 Display a notification dialog and then continue automatically 2 Continue automatically without displaying any dialog Returns previous setting. Fixed problem with the "flags" parameter in ArrayFilePutCsv. Fixed problem with "For" statements where "initial-value" was a complex expression. Fixed problem with AskDirectory flag 4 not being ignored in Windows 95/98. Added new request to ArrInfo: Request Returns ------- ------- -1 @TRUE if "array" is an array, @FALSE otherwise. AskDirectory now resolves names typed in the edit box that begin with a '.' (but this does not work properly on older platforms such as Windows 95). Fixed a problem if an omitted OLE positional parameter was followed by a quoted string constant. OLE calls now return an error if the object pointer has become invalid. Added an optional parameter to Debug: Debug(i:mode [, s:init-string]) If "init-string" is specified, it is the string placed in the edit field of the Debug dialog when the dialog is initialized. MsgTextGet now accepts a Window ID for the window name parameter. WaitForKey now yields a bit more processor time. Added an optional parameter to WinWaitClose: WinWaitClose(s:partial-winname [, i:timeout]) "timeout" is the number of seconds to wait (maximum = 86400). Specify 0 to have the function return immediately without waiting. Specify -1 for no timeout (ie, wait forever). The default is -1. If the window doesn't exist, the function will return immediately in any case, and return @FALSE. If the window exists, the function will wait for it to close or until the timeout period has elapsed, whichever comes first, and return @TRUE. FileGet now supports Unicode files. Fixed a problem with the notification message set via IntControl(12) not working from within a UDF. FileTimeGetEx now strips off any trailing backslash in "filename". IntControl(22) now returns the actual value returned by the call to the SendMessage API. IntControl(23) now returns @TRUE on success and @FALSE on failure. When using IniItemizePvt to list section names in a file, and the specified file name doesn't contain path information, it no longer looks for the file in any directory other than the Windows directory. Changes to the Dialog function and related functions: The optional second parameter of the Dialog function now works properly if it's a string that represents an integer. Fixed bug that caused individual radio button control styles to be ignored when the buttons were group via a common control variable. All buttons were using the style of the button of the group with the lowest tab order number. Fixed bug that caused GP Fault on Windows 9x based machines when a PUSH BUTTON control was specified without text. Crash occurred when an ATL + "key" combination was pressed while a dialog had the input focus. Fixed bug that caused a PUSHBUTTON control's text to shift when the button's text contained an ampersand (&) and the button was disabled inside a User Defined Dialog procedure. Changed "DialogProcOption" option 9 (call User Defined Dialog procedure on calendar control data change) to call the user dialog procedure when an implicit date change occurs. Implicit data changes are performed by clicking one of the control's arrows or right clicking on the month or year. WinInfo 2.1b First showing up in WB 2003K Fixed language string localization problem. WILX extender 39001 First showing up in WB 2003K Fixed problem with xBaseConvert and xHex converting values equal to -2.

WinBatch version 2004A

WB 2004A Jan 9, 2004 DLL 4.4add First showing up in WB 2004A FileRead in buffered mode wasn't stripping Ctrl-Z characters, if present. The AskFileName dialog can now be resized in Windows 98/ME/2000/XP. When processing goes to a Cancel or Error handler routine, the WIL variable "wberrorhandlerfile" is now set to the name of the currently-executing script. Changes to the Dialog function and related functions: Fixed bug that prevented a User Defined Dialog Procedure from being called for dialogs with one or more DROPLISTBOX controls even though selection change calls were requested ("DialogProcOptions" request code 8). This problem occurred if the DROPLISTBOX control had the list only style(4) and a user selected a list item by pressing the keyboard key associated with the first character of the item. Add "DialogControlGet" option (16) which retrieves the control number of the radio button with the dot or zero (0) if no radio button of a group has the dot. Changed EDITBOX, MULTILINEBOX, SPINNER, and DROPLISTBOX controls to retain their user specified background color when disabled.

WinBatch version 2004B

WB 2004B May 19, 2004 Increased maximum variables from 1,000 to 2,000. The command-line parameter string passed to WinBatch is no longer truncated at 255 characters. Fixed a problem with BoxDrawText hanging with "alignment" mode 32. DLL 5.1bea First showing up in WB 2004B Revised the OLE interface. No longer uses a separate DLL for OLE calls. Among the many OLE improvements: There is no longer a fixed limit on the number of open OLE objects. You can now specify multi-level OLE objects, eg, App.Document.Title. You can now assign values to parameterized OLE properties, eg, App.Info("Author") = "John Doe". Added support for many more OLE types, including arrays. Changed the DLL name suffix from "34I" to "44I". New functions: CreateObject(s:object-name/proj-id [, s:remote-server]) GetObject([s:moniker/filename] [, s:proj-id/object-name]) ObjectCreate(s:object-name/proj-id [, s:remote-server]) ObjectGet([s:moniker/filename] [, s:proj-id/object-name]) FileAttrGetEx(s:filename) Gets file attributes (extended). The return value is a bitmask comprised of one or more of the following integer values, combined using the bitwise OR ('|') operator: Value Name Meaning ----- ---- ------- 1 READONLY The file or directory is read-only. Applications can read the file but cannot write to it or delete it. In the case of a directory, applications cannot delete it. 2 HIDDEN The file or directory is hidden. It is not included in an ordinary directory listing. 4 SYSTEM The file or directory is part of, or is used exclusively by, the operating system. 16 * DIRECTORY Identifies a directory. 32 ARCHIVE The file or directory is an archive file or directory. Applications use this attribute to mark files for backup or removal. 128 NORMAL The file or directory has no other attributes set. This attribute is valid only if used alone. 256 TEMPORARY The file is being used for temporary storage. File systems avoid writing data back to mass storage if sufficient cache memory is available, because often the application deletes the temporary file shortly after the handle is closed. In that case, the system can entirely avoid writing the data. Otherwise, the data will be written after the handle is closed. 512 * SPARSE_FILE The file is a sparse file. 1024 * REPARSE_POINT The file or directory has an associated reparse point. 2048 * COMPRESSED The file or directory is compressed. For a file, this means that all of the data in the file is compressed. For a directory, this means that compression is the default for newly created files and subdirectories. 4096 OFFLINE The data of the file is not immediately available. This attribute indicates that the file data has been physically moved to offline storage. This attribute is used by Remote Storage, the hierarchical storage management software. Applications should not arbitrarily change this attribute. 8192 NOT_CONTENT_INDEXED The file will not be indexed by the content indexing service. 16384 * ENCRYPTED The file or directory is encrypted. For a file, this means that all data streams in the file are encrypted. For a directory, this means that encryption is the default for newly created files and subdirectories. The values with an asterisk next to them cannot be set using FileAttrSetEx. FileAttrSetEx(s:file-list, i:attributes, i:mode) Sets file attributes (extended). "attributes" specifies the attributes to apply to the specified file(s). See FileAttrGetEx for information on the attribute values (and note that values with an asterisk next to them cannot be set using FileAttrSetEx). "mode" specifies the method by which "attributes" are applied to the specified file(s), and can be one of the following: 0 "attributes" replaces the existing file attributes 1 "attributes" are added to the existing file attributes -1 "attributes" are removed from the existing file attributes Returns @TRUE on success, or @FALSE if unable to change the attributes on any of the specified files. DirAttrGetEx(s:dirname) Gets directory attributes (extended). This function is like FileAttrGetEx, but operates on directories instead of files. DirAttrSetEx(s:dir-list, i:attributes, i:mode) Sets directory attributes (extended). This function is like FileAttrSetEx, but operates on directories instead of files. StrCnt(s:string, s:sub-string, i:start-pos, i:end-pos, i:flags) Counts the occurrences of a substring within a string. "string" specifies the main string. "sub-string" specifies the substring to search for within "string". "start-pos" specifies the position in "string" at which to begin searching, or -1 to indicate the end of the string. The first character of the string is at position 1. "end-pos" specifies the position in "string" at which to end searching, or -1 to indicate the end of the string. The first character of the string is at position 1. Note that if the string begins at or before "end-pos" and continues past "end-pos", it will be counted. "flags" can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value Meaning ----- ------- 1 match case Returns the number of occurrences. SoundVolume(i:level) Sets the speaker volume. "level" specifies the volume level, from 0 (min) to 100 (max), or -1 to return the current volume level without changing it. Returns the previous volume level. RegQueryQword(i:handle, s:subkey-string) Returns QWORD value at subkey position. The value is returned as a space-delimited string of hex bytes, beginning with the low byte of the QWORD. RegSetQword(i:handle, s:subkey-string, s:value) Sets a QWORD value in the Registration Database. The value is specified as a space-delimited string of hex bytes, beginning with the low byte of the QWORD. Returns 1. DllCallCdecl(dllname, returntype:epname [,paramtype:parameter ...] ) Calls an external DLL using the Cdecl calling convention. This function is the same as DllCall, except it calls DLL functions using the Cdecl calling convention, rather than the StdCall calling convention which most Win32 DLL's use. BinaryAllocArray(a:array) Converts an array to a binary buffer. This replaces part of the functionality of (obsolete) IntControl(83). Returns a binary buffer handle. FileInfoToArray(s:file-list [, i:flags]) Returns information on a set of files, as an array. "file-list" specifies a list of filenames, which may be wildcarded. "flags" can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value Meaning ----- ------- 1 Return file sizes as huge numbers. This is a long decimal number string, which may represent a number too large to be converted to an integer. 2 Return file names with full paths This function creates and returns a 2-dimension array. There are [n + 1] rows in the array, where 'n' is the number of files that were returned. Each row has 7 columns. The first row (row 0) is a header containing summary information. Each subsequent row contains information about one returned file. The columns are as follows: Header row: Column Value ------ ----- 0 number of files returned 1 total size of files returned 2-6 (unused, set to 0) Other rows: Column Value ------ ----- 0 file name 1 file size 2 file last modified time, in YmdHms format 3 file last accessed time, in YmdHms format 4 file created time, in YmdHms format 5 file attribute string in the form "RASH" (see FileAttrGet) 6 file attribute bitmask (see FileAttrGetEx) DirInfoToArray(s:dir-list [, i:flags]) Returns information on a set of directories, as an array. "dir-list" specifies a set of sub-directory names, which may be wildcarded. This function is like FileInfoToArray, but returns information on directories instead of files. See FileInfoToArray for more information. Note that all sizes (column 1) for directories will be 0. ObjectConstantsGet(r:object) Creates a Constants object. (r) object reference: COM object reference. Returns: (r) constants reference: Constants object reference. Use this function to create a constants object for a COM Automation object: adoApp = ObjectCreate("ADODB.Connection") adoConst = ObjectConstantsGet(adoApp) The function will produce an error, if the supplied parameter is not a COM object or is a COM object that does not have any associated constants. A constants object is a special WIL language construct that allow you to access the constant values associated with a COM object by name. You access values by using the constants.name syntax where constants is the name of the variable holding this function’s return and name is the name of constant whose value you wish to use. For instance, if the constants object from the example above is used, then conVal = adoConst.adBSTR assigns the value of the constant adBSTR to the variable conVal. In this case, the constant adBSTR has the value eight(8), so after the assignment the variable conVal will hold the number 8. You can use the constants.name syntax anywhere you would use a literal. This includes using it as an object method parameter, as the right-hand-side of an object property assignment, and in relational and arithmetic expressions. You cannot, however, assign a new value to an individual constant name. They are in effect read-only. NOTE: This function may have an impact on the performance of you scripts. Some COM objects have thousands of constants and you may experience a small delay while the function collects the constants’ names and values. ObjectConstToArray(r:constants) Creates an array of Constants object names and values. (r) constants: Constants object reference. Returns: (a) constants array: Two dimensional array of constants names and values. ObjectConstToArray creates an array that contains the textual names and numeric values of a constants object: adoApp = ObjectCreate("ADODB.Connection") adoConst = ObjectConstantsGet(adoApp) aConstants = ObjectConstToArray(adoConst) This function can be used during the script writing process to examine the contents of a constants object obtained using the ObjectConstantsGet function. Note: Refer to the ObjectContantsGet documentation for details about constants object. The returned array has two dimensions. There is one row for each constant and two columns for each row. The first column contains the string name of a constant and the second column contains the value of the constant. The name is the same one used following the dot (.) in the constants.name syntax and the value is the same one returned by constants.name. In addition, row zero column zero of the array contains the number of constants stored in the array. Using the example above, the number of constants is obtained with: nNumberOfConstants = aConstants[0,0] The name of the first constant stored in the array is accessed with: sName = aConstants[1,0] And the first value is accessed with: nValue = aConstants[1,1] New structure operator: ForEach Object handles are now represented as variants instead of integers. This affects the following functions which take object handles as parameters: ObjectClose ObjectCollectionClose ObjectCollectionNext ObjectCollectionOpen ObjectType IntControl(77, 61) is now obsolete, and will return -1. There is no longer a limit of 65,535 elements per array dimension. Arrays can now contain at least 10 million total elements, although this may be constrained by available memory. The current limit is actually more than 100 million elements, but this is subject to reduction in future versions. Changed the default internal file buffer size, which controls the maximum supported file line length for the following functions: ArrayFileGet ArrayFileGetCsv AskFileText FileRead By default, the allocated buffer size will be between 4K and 32K according to a "smart size" method, based on the file size. As before, you can change the default buffer size using IntControl(65). IntControl(65) is revised as follows: P1 Meaning -- ------- -1 Don't change (just return current setting) -2 Smart size (default) 0 Don't buffer file reads - max line length limited by generic buffer (currently 1280 bytes) ## Any other positive value specifies the actual buffer size IntControl(83) is now obsolete. See BinaryAllocArray. Increased the maximum number of UDF's from 200 to 512. Attempting to redefine an existing UDF will no longer count against the maximum allowed. The second definition will be silently ignored. Changed IntControl(76) to work properly under Windows 2000/XP. Fixed a problem with BinaryStrCnt where "start-offset" and "end-offset" were the same. Also note that if the string begins at or before "end-offset" and continues past "end-offset", it will be counted. Added support for new "type" to RegQueryEx and RegSetEx: Value Meaning ----- ------- 11 (REG_QWORD) 64-bit number DllCall now supports 'double' (64-bit floating point value) as a return type and parameter type. Added new "flags" value to AskDirectory (maybe just temporary/experimental): Flag Meaning ---- ------- 16 Suppress "drive not ready" errors FileDelete was returning an error if the specified partial file name existed in another directory on the path. There is no longer a 1 MB limit for the size of the list returned by DirItemize, FileItemize, or FileItemPath. The following functions were returning a blank string instead of a 0 in huge number mode: DirSize DiskSize FileSize FileSizeEx When processing goes to a Cancel or Error handler routine, the WIL variable "wberrortextstring" is now set to the description of the WIL error, and "wberroradditionalinfo" is set to the additional error information, if any. When a minor error is suppressed with ErrorMode(@OFF), the following WIL variables are now automatically set: Variable Type Meaning -------- ---- ------- wberrorhandlerline string error line (ie, line in script that caused error) wberrorhandleroffset integer offset into script of error line, in bytes wberrorhandlerassignment string variable being assigned on error line, or "" if none wberrorhandlerfile string name of the currently-executing script wberrortextstring string description of the error wberroradditionalinfo string additional error information, if any Increased the maximum command line length for Run-type functions to 8192 bytes. Changes to the Dialog function and related functions: Added work around for WinXP bug that caused WB crash, if a script is canceled from a DROPLIST change procedure event associated with a DROPLIST control with the "List Only" style. If a Dialog callback returns a non-integer value, it will be converted to an integer if possible.

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 2004D

WB 2004D Jun 18, 2004 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. DLL 5.2deb First showing up in WB 2004D When processing goes to a Cancel or Error handler routine, the WIL variable "wberrorinsegment" is now set to the name of the currently-executing UDF, or a blank string ("") if not in a UDF. When processing goes to a Cancel or Error handler routine, the WIL array variable "wberrorarray" is now created with the following elements: wberrorarray[0] = LastError() wberrorarray[1] = wberrorhandlerline wberrorarray[2] = wberrorhandleroffset wberrorarray[3] = wberrorhandlerassignment wberrorarray[4] = wberrorhandlerfile wberrorarray[5] = wberrortextstring wberrorarray[6] = wberroradditionalinfo wberrorarray[7] = wberrorinsegment When processing goes to a Cancel or Error handler routine after an extender error or a user-defined error, "wberrortextstring" is now set to a more specific value. Fixed crash bug that resulted from returning a very large BSTR Variant from a user defined function after the Variant had been assigned to a local UDF variable. User defined subroutines were not affected by this bug. Improved detection of misplaced Continue and Break statements. Fixed a problem with FileInfoToArray and DirInfoToArray, where the 100th file would be missing from the output list, and there would be an extra entry at the end of the list. WILX extender 39004 First showing up in WB 2004D New function: xEnumStreams(s:filename, i:flags) (Windows NT/2000/XP only) Enumerates named streams in a file. "filename" specifies the name of a file which may contain streams. "flags" can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value Meaning ----- ------- 1 Return stream sizes as huge numbers. This is a long decimal number string, which may represent a number too large to be converted to an integer. This function creates and returns a 2-dimension array. There are [n] rows in the array, where 'n' is the number of named streams in the file. Each row has 4 columns. Each row contains information about one returned stream. The columns are as follows: Column Value ------ ----- 0 stream name 1 stream size 2 stream type -- one of the following values: Value Meaning ----- ------- 1 Standard data 2 Extended attribute data 3 Security descriptor data 4 Alternative data streams 5 Hard link information 6 Property data 7 Objects identifiers 8 Reparse points 9 Sparse file 3 stream attributes -- zero or more of the following values: Value Meaning ----- ------- 1 Stream contains data that is modified when read 2 Stream contains security data

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 2004F

WB 2004F Jul 29, 2004 In IntControl(1007), if "p1" == 3 (suspend script), it now resets the "clicked" state to 0 right before the function returns. DLL 5.4fed First showing up in WB 2004F If IgnoreInput is enabled, it will be temporarily disabled when using SendKey (and SendKeysTo and SendKeysChild) to send an Alt key combination in Windows 2000 and XP. Changes to the Dialog function and related functions: Fixed a problem with Dialog callback crashing when returning a string that could not be converted to an integer. Fixed bug that caused the User Defined Dialog Procedure's return value to be ignored when the procedure was returning from processing DROPLIST change event. The return value was instead always set to 0.

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 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 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 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 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 2005F

WB 2005F Dec 6, 2005 Fixed formatting errors in the WinBatch/hlp file. DLL 5.9fei First showing up in WB 2005F PipeClientSendRecvData was returning a blank string ("") instead of "*TIMER*" if no data was placed in the pipe before "read-timeout" elapsed. Changes to the Dialog function and related functions: PICTURE controls now displays dialog background color when the specified bitmap file cannot be found. Changes to OLE support: Fixed problem with error reporting when a COM event source passes an invalid VARIANT as a parameter. Added handling of non-standard event parameter types that the regular Windows APIs cannot process. Fixed rarely occurring memory leak caused by COM method parameters with more than one level of indirection.

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