List of Fixes and Improvements
WinBatch versions 5.0H through 97D
Keywords: fixes improvements new releases features
************************************************************************** IMPORTANT NOTICE: In the 32-bit version, the following functions, which in earlier versions returned space-delimited lists of items: DirItemize DiskScan FileItemize now return tab-delimited lists. This can be changed using IntControl(29). See "DLL 2.2abh" section below for more information. -------------------------------------------------------------------------- In the 32-bit version, the following functions work only with 32-bit apps: AppExist AppWaitClose WinExeName See "DLL 2.2abk" section below for more information. ************************************************************************** WinBatch/WIL DLL fixes. Dates indicate disk drop into manufacturing. Actual ship is often a week or two later. 5.0H Sept 1, 1994 Initial public release 5.0J Sept 10, 1994 Network Extender fixes 5.0K Sept 19, 1994 Fixed "Use Older / Use Newer" swap in Confirm Replace dialog Fixed problem where \*.* was required on a target directory on FileCopy/FileMove functions (Oops See 5.0N) 5.0L Sept 26, 1994 Fixed MenuChange function Added DiskSize function Added \\machine\share capability to DiskFree and DiskSize functions WinBatch 32 for Intel PCs available 5.0M Oct 3, 1994 Fixed TimeDiffSecs function Fixed DDERequest memory leak problem Started adding this fixes.txt file 5.0N Oct 10 1994 Fixed memory leak on Dialog() function when CTL3DV2 was used. New n3Logout function in Novell3 extender Really fixed the \*.* problem. Previous fix only copied the first file. Modified the DiskFree, DiskSize, and FileSize functions to return a floating point answer if the result is larger than about 2 Gigabytes Fixed Novell 3 Extenders (DLL10G) n3Map fixed to work with ODI drivers n3GetMapped n3MemberSet n3MemberDel 5.0P Oct 19 1994 Fixed FileSize for 32bit versions to return the proper answer Fixed a bug in StrIndex where a @backscan on a one character string would provide an incorrect answer. Fixed problem in CopyMove confirm dialog - Cancel works now. Fixed problem in CopyMove dialog - missing source file error caught before dialog. Fixed problem where Dialog function dialog boxes used BUTTON_FACE color instead of LTGRAY color. Fixed Novell 4 Extenders (DLL10H) n4Map (improved) n4GetMapped n4MemberSet n4MemberDel Novell DLL's updated from the Novell 11/93 release to the 2/94 release WinBatch 32 for Dec Alpha and MIPS now available. Actually, its almost pointless to watch the Winbatch version number, as nearly all the fixes appear in the Dll, which has its own version numbering scheme. Henceforth, we will be tracking the DLL version number. The WinBatch VersionDll() function will return the DLL version. This is already built into the SYSINFO.WBT file. DLL 2.1ebc Oct 26 First showing up in WinBatch 5.0Q User pointed out problems in the sin and cos routines. Problem traced to what appear to be singularity-type problems in the Microsoft runtime cos and sin routines. The Dll now checks for the bad numbers, and if it is in the range where the runtime routines fail, it stuffs in an appropriate answer. Fix installed in the 16 bit version only, as the 32 bit versions do not seem to have this problem in the runtimes. Fixed a nit in the dialog editor where, when it was requested to display a script, would do so in a dialog box with a "(Unlicensed)" in the title. Fix a parser problem where an error occurred when the first part of a variable name matched a function name provided by the calling exe program. This problem first showed up in using a "Dialog1" name for a dialog in the Dialog Editor. Fixed a SendKey to DOS bug where stuff like {UP} did not work when the NumLock was set. Fixed by turning off NumLock when sending keystrokes to DOS. DLL 2.1fbc Fixed look of Dialog boxes (back to white) when CTL3DV2.DLL is not installed on system. Fixed >very insignificant< problem where if a user did an AddExtender for the same DLL twice (or more) only one instance of the DLL was freed when the WBT file shut down. Fixed problem in 32 bit version for Windows'95 where default directory was not set properly in =C: environment variable. This problem caused wildcarded filenames to be improperly resolved into real filenames. Fixed problem in 16 bit version where DirRemove always returned a true, whether or not the directory was deleted. If the directory is not deleted, it now returns a suppressable, 1030 error. DLL 2.2abf First showing up in WB 5.1A Because of a data structure change to support more binary buffers (5 was coded, 10 was documented) the main dll renamed to WBDBFxxx.dll Fixed TimeDiffSecs (again). If the first date was smaller than the second date, the answer could be incorrect. Fixed a problem in FileAppend where the following code would not work properly. FileAppend("AAA.*","BBB.TXT") The DLL now does betterchecking. SendKey slowed down a minor tad to help other applications out. 32Bit versions will try harder to locate the WIL DLL on startup. The compiler time check of various DLLS has been removed because of assorted problems. We'll just roll the DLL name instead when incompatibilities arise. The DLL appears to be extremely stable, and the bug fixes implemented lately tend to be minor (see above) A buglet where an ItemInsert on a null string installed a leading delimiter before the inserted item - leading to a list with two items, the first being null, and the second being the desired item - was fixed. When ItemInsert'ing into a null list, no leading delimiter is stuffed in. A problem with PlayWaveForm where it was not checking the [Sounds] section of the WIN.INI file for all possible cases has been fixed. Fixed a problem with FileCopy/FileMove, where the target was ".." and it was a root directory. DirExist now returns TRUE for hidden and system directories. It also uses an improved method (hopefully) of checking for root directories and directories with relative paths (eg, "..\TEMP"). Changed FileExist to return a value of '2' if the specified file exists but is currently open by another application in "read-deny" mode. Most of the other file manipulation functions (except FileOpen) will cause a sharing violation if they try to access such a file. Fixed problems handling file and directory names containing high ANSI characters (>127). Fixed a problem that occurred if, inside a FOR loop, the user changed the increment variable to a string. Fixed an intermittent problem with performing comparisons of negative floating point numbers. FileFullName now correctly expands "dot" directories ("." and "..") in the path name. Fixed a problem processing lines such as "Gosub %param1%" inside conditional structures, when param1 was undefined. (32-bit version) Fixed some incompatabilities with Windows 95: FileAppend FileMove MsgTextGet WinActivate (where the specified parent window had a modal child window displayed -- focus was going to the parent window instead of to the child window) Fixed a problem with accessing the DLL if it was located in the parent directory and ".." was on the path. FileCopy, FileMove, and FileAppend now check for sufficient free disk space before performing the requested operation, and return an error if there is insufficient space, as follows: 1404 FileCopy: Insufficient free space on target drive 1405 FileMove: Insufficient free space on target drive 1406 FileAppend: Insufficient free space on target drive NetWare 3 extender 12012 First showing up in WB 5.1A New functions: n3ServerList(request) Returns name of connected server(s) n3FileAttrGet(filename) Returns NetWare file attributes n3FileAttrSet(filename, attribs, mode) Sets NetWare file attributes NetWare 4 extender 14007 First showing up in WB 5.1A Changed functions: n4memberGet(group, user) n4memberSet(group, user) n4memberDel(group, user) these functions no longer take a 'server' parameter (they change the groups on all servers) New functions: n4ServerList(request) Returns name of connected servers(s) n4FileAttrGet(filename) Returns NetWare file attributes n4FileAttrSet(filename, attribs, mode) Sets NetWare file attributes WB 5.1C April 18, 1995 Fixed problem with compiler and compiled WBT's causing a sharing violation if the DLL was on a network and not marked read-only. Fixed problem with compiler and compiled WBT's not finding the DLL if it was located in the Windows or Windows System directory. Fixed problem with large compiled WBT's being unable to extract the WIL DLL when run on a disk >= 4 gigabytes in size. In WILX.DLL extender -- fixed problem with xDriveReady sometimes causing a GP fault. DLL 2.2abg First showing up in WB 5.1C Added two new string constants: @CR and @LF Fixed bug in BinaryIndex where it wouldn't find the last character in the buffer. WB 5.1D July 18, 1995 WinBatch compiler: for new projects, compiler will use settings (type, icon, and extenders) from the last project. DLL 2.2abh First showing up in WB 5.1D ************************************************************************** IMPORTANT: File delimiters ************************************************************************** In order to support long file names in Windows NT and Windows 95, which can contain embedded spaces, we have changed the default file delimiter, used to delimit lists of files and directories, to a TAB in the 32-bit version of WIL. In the 16-bit version of WIL, the default delimiter has not changed, and remains a space. Note that this is the "default" file delimiter. We have added the ability to change the file delimiter to a character of your own choosing, using the new IntControl 29. If you are using the 32-bit version of WIL, and want to make the file delimiter a space for compatability with existing scripts, you can place the following line at the beginning of each of your scripts: IntControl(29, " ", 0, 0, 0) Conversely, if you want to standardize on a TAB delimiter, you can use: IntControl(29, @TAB, 0, 0, 0) Apostrophes (') and back quotes (`) are no longer treated as special characters to delimit file names containing spaces. They are now treated as ordinary characters in a file name. ---------------------------- Functions which are affected ---------------------------- The most important functions affected by this change are: DirItemize DiskScan FileItemize which now return lists delimited by the current file delimiter character. The following functions, which take file or directory lists as input parameters, now expect the lists to be delimited by the current file delimiter character. However, they now also accept lists delimited with a TAB or a vertical bar ("|", which may be easier to code in a WIL script): DirItemize DirRemove DiskFree FileAppend FileAttrSet FileCopy FileDelete FileItemize FileMove FileRename FileSize FileTimeSet FileTimeTouch Note that DiskFree will continue to accept space-delimited lists as input. ************************************************************************** New IntControl: IntControl(29, delimiter, 0, 0, 0) Changes the default file delimiter. The first parameter is the new file delimiter you want to use, and must be a single character. The return value of the function is the previous file delimiter character. If you specify an empty string ("") as the first parameter, the function will return the current file delimiter character but the file delimiter will not be changed. Added option to WinMetrics: WinMetrics(-4) will return the Windows platform: 0 = Other 1 = Windows 2 = Windows for Workgroups 3 = Win32s 4 = Windows NT 5 = Windows 95 In StrSub, you can now specify a length of -1, which will extract the rest of the string. In TimeWait, you can now specify "00:00:00" for the date, which will wait for the next occurrence of the specified time (ie, today or tomorrow). Added support for 3-D Dialog's in Windows NT, if CTL3D32.DLL is present in the SYSTEM32 directory. Fixed TimeAdd so that it doesn't trim out leading zeros in each field. The Wallpaper function now obeys the tile parameter in Windows 95. Improved handling of colors in Dialog function. Added 3D effect to radio buttons and checkboxes in Dialog function. Fixed problem where if an error occurred in a called WBT, control would go to the "Cancel" label in the calling program. In Dialog and DialogBox, you can now really use IntControl(4) to allow the dialog to be closed without selecting a file, even if there is an edit box associated with a file listbox. If you press a pushbutton after changing the file mask in an edit box, the listbox will be updated with the new mask. But if you press a pushbutton without changing the file mask, the dialog will close (and will return a file name of "NOFILESELECTED"). Fixed problem where string variables were not converted properly to integers at the beginning of a "For" loop. Fixed problem where lines that should have been ignored (eg, if they followed a Break statement) could cause errors if they contained invalid syntax. If the second parameter of an IntControl(12) statement is "" or "0", any previously-set exit message will now be cleared. Also, you can now specify a message beginning with "0". Fixed problem processing "If" statements with a blank string to the left of the equals sign. Fixed a problem in the 32-bit version where the Dialog function would return an invalid file name (garbage characters) if no file was selected. Improved IsKeyDown processing (especially under Windows 95). Improved Ctrl-Break checking (especially under Windows 95). Made WinWaitClose steal less processor time in the 32-bit version. WB 5.1E Aug 3, 1995 In the 32-bit version of WinBatch, it is now possible to run WinBatch files whose names contain spaces, by delimiting the file name with double quotes on the WinBatch command line. For example: WBAT32I "Sample Program.WBT" param1 param2 CallExt now handles file names containing spaces, in 32-bit version. 32-bit version of WinBatch will now run WBT's with file names longer than 64 characters. INI settings have been moved from WWW-PROD.INI to the registry, under key: HKEY_LOCAL_MACHINE\SOFTWARE\Wilson WindowWare\Settings\WWW-PROD DLL 2.2abj First showing up in WB 5.1E For functions which take a partial window name, you can now specify a tilde (~) as the first character of the window name, which will match any window containing the specified string anywhere in its title (ie, not necessarily at the beginning of the title). For example, "~Notepad" will match a window title of "(Untitled) - Notepad" and a window title of "My Notepad Application", as well as a window title of "Notepad - (Untitled)". This should prove especially useful under Windows 95. A '~' at the end of the specified window name indicates (as before) that the name must match the window title through to the end of the title. So, "~Notepad~" will match a window title of "Notepad" and a window title of "(Untitled) - Notepad", but will not match a window title of "Notepad - (Untitled)". New function: WinIdGet(partial-winname). Returns a unique "Window ID" (pseudo-handle) for the specified window. New functions to manipulate Windows 95 shortcut link files (Windows 95 only): ShortcutEdit(linkname, pathname, params, workdir, showmode) Modifies the specified shortcut file. showmode = @NORMAL, @ZOOMED, or @ICON ShortcutExtra(linkname, description, hotkey, iconpath, iconindex) Sets additional information for the specified shortcut file. iconindex = 0=based index of desired icon in "iconpath" ShortcutInfo(linkname) Returns information on the specified shortcut file (TAB-delimited): path, params, workdir, showmode, desc, hotkey, iconpath, iconindex ShortcutMake(linkname, pathname, params, workdir, showmode) Creates a shortcut for the specified filename. showmode = @NORMAL, @ZOOMED, or @ICON In 32-bit version, Run... commands now support file and directory names containing spaces. In 32-bit version, Run... commands no longer support the undocumented method of running a program with a non-standard extension (eg, "SSSTARS.SCR") by replacing the period (.) in the file name with an asterisk (*). However, this is no longer necessary, as the Run... commands in the 32-bit version can now run such programs directly. The 32-bit bit version is now able to run Windows 95 shortcut files under Windows 95, using any of the Run... functions. The "Run" mode specified in the shortcut file (ie: "Normal window", "Minimized", or "Maximized") will always be obeyed, any command-line parameters specified in the shortcut's "Target" field will override any parameters passed by the Run... function, and a working directory specified in the shortcut's "Start in" field will override a working directory parameter in RunShell. New directory attribute functions: DirAttrGet(dirname) Gets directory attributes (like FileAttrGet) DirAttrSet(dir-list, settings) Sets directory attributes (like FileAttrSet) FileAttrGet and FileAttrSet now return an error if a directory name is specified. Use the new DirAttrGet and DirAttrSet instead. New functions (32-bit version only -- the 16-bit version will just return the passed file name): FileNameLong(filename) Returns the long version of a filename. FileNameShort(filename) Returns the short (ie, 8.3) version of a filename. New IntControl (32-bit, Windows NT only): IntControl(30, "sourcefile", "destination", 0, 0) Performs a delayed file move. The file is not actually moved until the operating system is restarted. New registry functions (32-bit version only): RegApp(progname, path) Creates registration entries for a program under "App Paths". RegDelValue(handle, subkey-string) Removes a named value for the specified subkey from the registry. In 32-bit version, PlayMidi function now support file and directory names containing spaces. New function (32-bit version only): InstallFile(filename, targname, default-targdir, delete-old, flags) Installs and uncompresses file. New function (menu-based implementations only): CurrFilePath() Returns the full path+filename of the currently-selected file. Like CurrentFile, but returns a full pathname. New IntControl (32-bit, Windows 95 only): IntControl(31, 0, 0, 0, 0) Returns a tab-delimited list of WinId's for all open Explorer windows. IntControl(67) and IntControl(68) now work in Windows 95. DosVersion now returns correct values in Windows 95. Added new request #'s to WinResources for 32-bit version. The existing request #'s (0-4) will still work, but are not useful on 32-bit platforms. It is not possible to determine free system resources in the 32-bit version. Fixed problem with Dialog and DialogBox returning "NOFILESELECTED" even if a file was selected, if IntControl(4) was set. INI settings have been moved from WWW-PROD.INI to the registry, under key: HKEY_LOCAL_MACHINE\SOFTWARE\Wilson WindowWare\Settings\WWW-PROD WB 95B Sept 7, 1995 New Box functions: BoxButtonDraw(BoxID, button ID, "text", "rect") BoxButtonKill(BoxID, button ID) BoxButtonStat(BoxID, button ID) BoxCaption(BoxID, caption) BoxColor(BoxID, "color", wash color) BoxDataClear(BoxID, "tag") BoxDataTag(BoxID, "tag") BoxDestroy(BoxID) BoxDrawCircle(BoxID, "rect", style) BoxDrawLine(BoxID, "rect") BoxDrawRect(BoxID, "rect", style) BoxDrawText(BoxID, "rect", "text", erase flag, alignment) BoxesUp("rect", show mode) BoxMapMode(BoxID, map mode) BoxNew(BoxID, "rect", style) BoxPen(BoxID, "color", width) BoxTextColor(BoxID, "color") BoxTextFont(BoxID, "name", size, style, family) BoxUpdates(BoxID, update flag) The 32-bit WinBatch compiler now allows you to specify an icon for the EXE being compiled. DLL 2.2abk First showing up in WB 95B In the 32-bit version, the Run... functions will look in the registry under "App Paths" for the location of the specified program, if you do not specify a path for it. In the 32-bit version, the Run... functions will look in the registry under "App Paths" for a "Path" setting for the specified program, and, if found, will prepend it to the "PATH" environment variable before running the program. In the 32-bit version, the following functions now work, but only with 32-bit applications: AppExist AppWaitClose WinExeName In the 32-bit version, AppExist and AppWaitClose are not able to detect the existence of 16-bit DOS or Windows applications, and WinExeName will return the string "(16-bit application)". In the 32-bit version under Windows NT, these functions accept (and return) module names instead of full program names. The module name is usually the same as the root name of the program, without the extension. For example, WinExeName("Program Manager") will return "progman". With AppExist and AppWaitClose, any file extension or path information which is part of the 'program-name' parameter is ignored; so, for example, AppExist("c:\temp\progman.exe") will return TRUE if Program Manager is running, regardless of what directory PROGMAN.EXE is actually located in. One exception: WinExeName("") will return a full path to the program making the current call to the WIL Interpreter. BinaryPeekStr, BinaryPokeStr, and BinaryStrCnt now check for (and reject) negative parameters. RunWait now gives up some processor time while it's waiting. New function (32-bit version only): WinSysInfo() Returns a tab-delimited list of system configuration information. This function should be used instead of WinConfig in the 32-bit version. Additional request #'s for WinMetrics (32-bit version only). New mouse functions: MouseClick(click-type, modifiers) Clicks mouse button(s). MouseClickBtn(win-name, child-win, button-text) Clicks on the specified button control. MouseMove(x, y, win-name, child-win) Moves the mouse to the specified X-Y coordinates (based on a 1000 x 1000 screen). Fixed problem where an invalid YmdHms string containing two consecutive colons could cause a GP Fault. In the 32-bit version, AppExist and AppWaitClose will now wait several seconds for the specified application to appear. Fixed problem in menu-based WIL applications where tabs in menu item descriptions would be displayed as non-printable "black-box" characters. Added new request #'s to MouseInfo. In the 32-bit version, IconReplace now supports 32-bit EXE files. The replacement icon must be the exact same size as the original icon. New IntControl: IntControl(32, address, "data type", 0, 0) Returns the contents of the memory location specified by "address". Fixed WinMetrics(-1) with 32-bit graphics cards. It was returning -1 for these; it now returns 2,147,483,647. WB 95C Oct 10, 1995 New function: BoxButtonWait() Waits for any button in any box to be pressed. Fixed problem with WinBatch locking up when minimizing a WinBatch box that was displaying width-justified text. DLL 2.2abl First showing up in WB 95C Fixed problem with DirExist returning @FALSE for a UNC which was a root directory share on another machine (eg, "\\SERVER\C"). DirMake will now create multi-level directories (eg, "C:\ABC\DEF\GHI"). New functions: BinaryIndexNc(handle, offset, string, direction) Like BinaryIndex, but case-insensitive. WinItemNameId() Returns a list of top-level window names and their "Window ID's", in the form: "window1-name|window1-ID|window2-name|window2-ID|..." In the 32-bit version, Delay and TimeDelay functions now accept floating point numbers: eg, Delay(0.5). New function: ShellExecute(file-name, params, directory, display mode, operation) Performs a ShellExecute. New function (32-bit version only): RegQueryItem(handle, subkey) Returns a tab-delimited list of named data items for the specified subkey. New IntControl: IntControl(33, p1, 0, 0, 0) Controls whether a listbox control in a dialog box allows multiple items to be selected. P1 Meaning -- ------- 0 Single selection 1 Multiple selection (default) Improved registry functions in 32-bit version: RegSetValue, RegQueryValue, and RegDelValue: 1. SEE NOTE BELOW!! Can now specify a named value of [Default] to indicate the primary value for the key (shown in the Registry Editor as "(Default)"); eg: RegSetValue(mykey, "[Default]", "some data") (*** The above feature was subsequently removed in version 96C ***) 2. Can now specify a subkey string containing a named value; eg: RegSetValue(mykey, "MySubKey[MyItem]", "some data"), or, RegSetValue(mykey, "MySubKey\[MyItem]", "some data") Fixed WaitForKey in the 32-bit version. In the 32-bit version, you can now use the Run... functions to "run" data files (eg, Run("win.ini", "")). FileItemize and DirItemize now handle names containing spaces. In 32-bit version, fixed problem with 3D dialogs not being used under Windows NT. WB 95D Nov 1, 1995 Compiler now optimizes WBT's by removing comment lines and whitespace. OLE automation (ObjectOpen and ObjectClose functions) now supported in 32-bit version. When a custom icon is specified, the 32-bit compiler now installs it as the icon that is displayed in the Win95 Explorer window, as well as the icon that is shown in the task bar. Fixed a problem with some of the Box functions, where a color or font that was specified in a definition-type command (such as BoxTextColor) would be used for an output-type command (such as BoxDrawText) that preceded it in the command stack, instead of the default color or font being used. DLL 2.2abl First showing up in WB 95D New registry functions (32-bit version only): RegQueryBin(handle, subkey) Retrieves a binary value from the registry. RegQueryDword(handle, subkey) Retrieves a DWORD value from the registry. RegSetBin(handle, subkey, value) Sets a binary value in the registry. RegSetDword(handle, subkey, value) Sets a DWORD value in the registry. New date/time functions: TimeJulToYmd(julian-date) Converts the specified Julian date value to a date in YmdHms format. Hms will always be "00:00:00". TimeSubtract(YmdHms1, YmdHms2) Subtracts YmdHms2 from YmdHms1. YmdHms2 can not be larger than YmdHms1. New IntControl's: IntControl(34, p1, 0, 0, 0) Returns the error message string which corresponds to the specified WIL error. p1 = error number. IntControl(35, p1, 0, 0, 0) (32-bit version only) Adjusts SendKey delay. p1 = amount of time to delay between each keypress, in milliseconds (1000 milliseconds = 1 second). Returns previous delay setting. The default delay (in the 32-bit version) is 25. Specify a larger number to slow SendKey down, or a smaller number to speed it up (0 = no delay). IntControl(36, p1, p2, 0, 0) (32-bit version only) Waits until an application is waiting for user input. p1 = window name associated with application p2 = timeout, in milliseconds (-1 = no timeout) In dialog boxes, if you create an EDITBOX field with a variable name that begins with "PW_", it will be treated as a password field (ie, asterisks will be echoed instead of the actual characters that the user types). In dialog boxes, file listboxes now use long file names in the 32-bit version under Windows 95. In the DiskScan function, request numbers 8 (CD_ROM) and 16 (RamDisk) are now supported in the 16-bit version. In 32-bit version, added 3D effects to dialog listboxes and edit controls under Windows 95. SendMenusTo now accepts a Window ID for the window name parameter. In 32-bit version, fixed a problem using the Run[] commands to launch a Windows 95 shortcut file. InstallFile function now supported in 16-bit version. NetWare 3 extender 12013 First showing up in WB 95D Fixed a problem with n3GetMapped, if the specified server name was also the partial name of another server (eg, if you specified "\\SERVER1" and you also had a server named "\\SERVER10"). n3FileAttrGet and n3FileAttrSet can now be used to get and set directory attributes. NetWare 4 extender 14010 First showing up in WB 95D Fixed n4Detach function; it now does a full detach, and it now returns @FALSE if it is unable to detach from the monitored connection (ie, from the primary or login server). Fixed a problem with n4GetMapped, if the specified server name was also the partial name of another server (eg, if you specified "\\SERVER1" and you also had a server named "\\SERVER10"). n4FileAttrGet and n4FileAttrSet can now be used to get and set directory attributes. WB 95E Nov 2, 1995 DLL 2.2abm First showing up in WB 95E In 16-bit version, fixed a problem with DirMake creating a directory name containing high ANSI characters (>127). WB 96A Jan 1, 1996 WinBatch for PowerPC now available. New IntControl: IntControl(1000, p1, 0, 0, 0) Sets the exit code returned by WinBatch. Default exit code = 0. Returns previous value. Fixed the "Help" button in the WinBatch compiler. In the BoxColor function, the gradient effect (wash color) now works with video drivers > 256 colors. DLL 2.3abm First showing up in WB 96A New function: DiskInfo(drive-letter, request#) Returns information on the specified disk drive. Req# Return value ---- ------------ 1 sectors per cluster 2 bytes per sector 3 number of free clusters 4 total number of clusters New IntControl's: IntControl(37, p1, p2, p3, 0) Replaces the specified icon in an EXE file. p1 = EXE file p2 = icon file p3 = ordinal position of icon to replace This is similar to the IconReplace function, except it allows you to change an icon other than the first icon in the file. Note: This IntControl is subject to change in future versions. IntControl(39, p1, 0, 0, 0) Sets the file sharing mode for file reads. p1 = share mode for file reads (default = 1) Valid share modes are: -1 = don't change (just return current setting) 0 = prevent the file from being shared 1 = allow other open operations for read access 2 = allow other open operations for write access 3 = allow other open operations for read and write access This affects the FileOpen("READ") and BinaryRead functions. Returns previous setting. IntControl(40, p1, 0, 0, 0) Sets the file sharing mode for file writes. p2 = share mode for file writes (default = 0) This affects the FileOpen("WRITE"/"APPEND") and BinaryWrite functions. Returns previous setting. See IntControl(39) for a list of valid share modes. New return code for WinMetrics(-3): 4 = PowerPC32 In 32-bit version, fixed a problem using DirName with directory names containing spaces or commas. Fixed problem with TimeJulToYmd with years >= 2000. FileWrite now returns an error if the write failed. In 16-bit version, fixed problem with DiskScan causing a GP fault on systems with Stacker compression software installed. In 32-bit version, the following functions are now a little more well-behaved in giving up processor time: RunWait (and RunShell with the "@WAIT" parameter), AppWaitClose, and Delay/TimeDelay. Fixed a problem with the Dialog function, where if you defined an EDITBOX control after a FILELISTBOX control, the file listbox would revert to a filespec of "*.*". In 32-bit version, fixed a prooblem with the Dialog function, where if you had a filespec other than "*.*", it would not show subdirectories in the file list. In 32-bit version, added some code to the ClipGet and ClipPut functions to try to avoid "Clipboard owned by another app" error messages. Fixed problem with TimeWait, when specifying a date of "00:00:00" and a time that was earlier than the current time. In 32-bit version, added a 25-millisecond delay between keystrokes sent using the SendKey function. This can be adjusted using IntControl(35). Fixed problem with PlayWaveForm in 32-bit version. Windows 32 extender 10004 netDirDialog no longer returns an error if user presses "Cancel". Dialog Editor 96A Fixed the "Help" menu. WB 96B Feb 12, 1996 In the 16-bit version, fixed a problem where doing a BoxDestroy immediately after resizing a box window caused a GPF. Fixed a resource leak problem with BoxColor when using gradient effects. DLL 2.3bbm First showing up in WB 96B New binary functions: BinaryHashRec(buffer, recsize, keyoffset, keysize, keyval) Returns a pointer to a record in a binary buffer, using a hashing algorithm. BinaryIncr(buffer, offset) BinaryIncr2(buffer, offset) BinaryIncr4(buffer, offset) BinaryIncrFlt(buffer, offset) These functions are equivalent to doing a BinaryPeek[...], incrementing the extracted value by 1, and then doing a BinaryPoke[...] to store the new value. They return the new value. BinaryPeek2(buffer, offset) BinaryPeek4(buffer, offset) BinaryPeekFlt(buffer, offset) These functions are like BinaryPeek, but they extract 2, 4, or 8 bytes (respectively) beginning at "offset" BinaryPoke2(buffer, offset, value) BinaryPoke4(buffer, offset, value) BinaryPokeFlt(buffer, offset, value) These functions are like BinaryPoke, but they store the specified "value" in 2, 4, or 8 bytes (respectively) beginning at "offset". BinarySort(buffer, recsize, keyoffset, keysize, flags) Sorts records in a binary buffer. The buffer is sorted in place. Change to BinaryIndex and BinaryIndexNc: You can now specify a blank string ("") for the "string" parameter, in which case the function will return the offset of the first non-NULL character found, starting at "offset". Fixed BinaryIndexNC BinaryPoke now correctly returns the previous value, as documented. In the 32-bit version, KeyToggleSet no longer returns an error (however, it is still subject to the limitations described in the documentation). In the 16-bit version, fixed DirAttrSet. The following string functions: StrIndex StrScan StrSub no longer return an error for illegal bounds conditions. Instead, StrIndex/StrScan now return a 0, and StrSub returns a blank string. WB 96C Mar 22, 1996 FileMenu now works in Windows NT 4.0. PopMenu now works in Windows NT 4.0. Fixed problem where BoxButtonDraw didn't change the text of an existing button, or of a button which had previously existed but had been removed with BoxButtonKill. DLL 2.3cbm First showing up in WB 96C In 32-bit version, the following functions now work in Windows NT 4.0: ShortcutEdit ShortcutExtra ShortcutInfo ShortcutMake In 32-bit version, the Run... functions can now be used to launch shortcut files in Windows NT 4.0. In 32-bit version, added 3D effects to Windows NT 4.0. In 32-bit version, fixed problem with licensing dialog in Windows NT 4.0. In 32-bit version, the following registry functions: RegSetValue RegQueryValue RegDelValue no longer treat a named value of [Default] as indicating the primary value for a key (and, therefore, it is now possible to access a value which is actually named "Default"). In 32-bit version, fixed problem with international language strings not being used. New registry functions (32-bit version only): RegQueryExpSz(handle, subkey) Retrieves a REG_EXPAND_SZ value from the registry. RegQueryMulSz(handle, subkey, delimiter) Retrieves a REG_MULTI_SZ value from the registry. RegSetExpSz(handle, subkey, value) Sets a REG_EXPAND_SZ value in the registry. RegSetMulSz(handle, subkey, value, delimiter) Sets a REG_MULTI_SZ value in the registry. In 32-bit version, fixed problem with RegQuery... functions when there was a backslash between the subkey string and a named value, eg: RegQueryValue(mykey, "MySubKey[MyItem]", "some data") -- this worked RegQueryValue(mykey, "MySubKey\[MyItem]", "some data") -- this didn't RegQuery, RegQueryBin, and RegSetBin can now handle longer strings (up to available WIL string space). In 32-bit version, fixed problem with OLE string parameters. In 32-bit version, fixed problem with RegQueryBin with certain values. In 32-bit version, fixed problem with RegSetDword with large values. Fixed problem with TimeSubtract, where the result could have a day of "00" (eg, "96:04:00" instead of "96:03:31"). In 16-bit version, fixed WinItemNameId. Fixed problem with BinaryHashRec crashing if there was only one record in the buffer. NetWare 3 extender 12014 First showing up in WB 96C Fixed n3FileAttrGet and n3FileAttrSet. n3FileAttrGet and n3FileAttrSet no longer support directories (use new functions n3DirAttrGet and n3DirAttrSet instead). New functions: n3DirAttrGet(dirname) Same as n3FileAttrGet, but for directory attributes. n3DirAttrSet(dirname, attribs, mode) Same as n3FileAttrSet, but for directory attributes. n3MapDir(net-path, local-name) Like n3Map, but performs a regular (non-root) map. n3MapRoot(net-path, local-name) Identical to n3Map. With n3Map[..], it is no longer necessary to add a trailing backslash when mapping to the root of a volume. New functions: n3CapturePrt(s:server-name, s:queue-name, i:port-number, s:flags) Captures a local printer port to a Netware printer queue. "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc). "flags" is a tab-delimited list of keyword=value pairs, ie: "key1=value1%@TAB%key2=value2%@TAB%key3=value3..." Valid keywords are: JobDescription JobControlFlags TabSize NumCopies PrintFlags MaxLines MaxChars FormName FormType BannerText FlushCaptureTimeout FlushCaptureOnClose See the Netware 3 extender help file for an explanation of these flags. n3CaptureEnd(i:port-number) Ends a printer capture. "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc). n3GetUserId(s:server-name, s:user-name, i:format) Returns the object ID corresponding to the specified user name. "Format" specifies the format in which the ID is returned: 0 Decimal number, in internal Netware format 1 Hexadecimal string, such as used for mail directories n3ChgPassword(s:server-name, s:user-name, s:old-password, s:new-password) Changes a user's password. If you have supervisor or equivalent rights, you can specify a blank string ("") for "old-password". Passwords are NOT case-sensitive. You must be currently logged in to the specified server. n3GetNetAddr(s:server, i:flags) Returns the internetwork address of the current workstation. "server" can be a blank string (""), in which case the default server is used. "flags" is reserved for future use, and should be set to 0. The return value is a string of hex bytes in the format: x1x2x3x4:y1y2y3y4y5y6:z1z2 where: x1x2x3x4 = 4-byte network address y1y2y3y4y5y6 = 6-byte net node address (physical address of workstation's LAN board) z1z2 = socket n3ServerInfo(s:server, i:request) Returns information on the specified Netware server. Request Meaning ------- ------- 1 major NetWare version number 2 minor NetWare version number 3 revision number of the NetWare OS on NetWare server 4 maximum number of connections the server will support 5 highest number of connections simultaneously in use 6 number of connections the server currently has in use 7 maximum number of volumes the server will support 8 SFT level the server supports 9 TTS Level of NetWare server operating system n3UserGroups(s:server, s:username) Lists groups to which the specified user belongs. The return value is a tab-delimited list of groups. Added new request # to n3ServerList: 4 = all known servers (TAB-delimited list) NetWare 4 extender 14011 First showing up in WB 96C Fixed n4FileAttrGet and n4FileAttrSet. n4FileAttrGet and n4FileAttrSet no longer support directories (use new functions n4DirAttrGet and n4DirAttrSet instead). New functions: n4DirAttrGet(dirname) Same as n4FileAttrGet, but for directory attributes. n4DirAttrSet(dirname, attribs, mode) Same as n4FileAttrSet, but for directory attributes. n4MapDir(net-path, local-name) Like n4Map, but performs a regular (non-root) map. n4MapRoot(net-path, local-name) Identical to n4Map. With n4Map[..], it is no longer necessary to add a trailing backslash when mapping to the root of a volume. New functions: n4CapturePrt(s:server-name, s:queue-name, i:port-number, s:flags) Captures a local printer port to a Netware printer queue. "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc). "flags" is a tab-delimited list of keyword=value pairs, ie: "key1=value1%@TAB%key2=value2%@TAB%key3=value3..." Valid keywords are: JobDescription JobControlFlags TabSize NumCopies PrintFlags MaxLines MaxChars FormName FormType BannerText FlushCaptureTimeout FlushCaptureOnClose See the Netware 4 extender help file for an explanation of these flags. n4CaptureEnd(i:port-number) Ends a printer capture. "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc). n4GetUserId(s:server-name, s:user-name, i:format) Returns the object ID corresponding to the specified user name. "Format" specifies the format in which the ID is returned: 0 Decimal number, in internal Netware format 1 Hexadecimal string, such as used for mail directories n4ChgPassword(s:server-name, s:user-name, s:old-password, s:new-password) Changes a user's password. "old-password" must be specified for Directory Services connections. For bindery connections, if you have supervisor or equivalent rights, you can specify a blank string ("") for "old-password". Passwords ARE case-sensitive for Directory Services connections, but NOT for bindery connections. For bindery connections, you must be currently logged in to the specified server. n4GetNetAddr(s:server, i:flags) Returns the internetwork address of the current workstation. "server" can be a blank string (""), in which case the default server is used. "flags" is reserved for future use, and should be set to 0. The return value is a string of hex bytes in the format: x1x2x3x4:y1y2y3y4y5y6:z1z2 where: x1x2x3x4 = 4-byte network address y1y2y3y4y5y6 = 6-byte net node address (physical address of workstation's LAN board) z1z2 = socket n4ServerInfo(s:server, i:request) Returns information on the specified Netware server. Request Meaning ------- ------- 1 major NetWare version number 2 minor NetWare version number 3 revision number of the NetWare OS on NetWare server 4 maximum number of connections the server will support 5 highest number of connections simultaneously in use 6 number of connections the server currently has in use 7 maximum number of volumes the server will support 8 SFT level the server supports 9 TTS Level of NetWare server operating system n4UserGroups(s:server, s:username) Lists groups to which the specified user belongs. The return value is a tab-delimited list of groups. If the specified server is a Directory Services connection, the group names will contain distinguishing path information (eg, "Server1.Users"). Added new request # to n4ServerList: 4 = all known servers (TAB-delimited list) If the current default server is a Directory Services connection, only servers that are part of Directory Services are returned. If the current default server is a bindery connection, only servers listed in the bindery are returned. Windows 32 extender 10005 netGetCon now accepts printer ports higher than LPT3 (up to LPT9). WB 96D June 26, 1996 Fixed problem with PopMenu, when generating a file name based on an application whose class name contained characters that were not valid file name characters. PopMenu now strips off such characters when generating the file name (eg, class name of "Edit:App" becomes "EditApp.mnw"). Fixed problem with PopMenu, where it would occasionally fail to launch the editor when editing/creating a menu file. In the 16-bit version, WinBatch now does not try to load CTL3DV2.DLL at startup unless the DLL is located in the Windows System directory. Compiler now searches path for extender DLL's, if they are not found in the compiler directory, when compiling a large EXE. Fixed problem with FileMenu locking up in some cases if the user rapidly clicked twice on a menu. Fixed problem with BoxDrawText with "alignment" = 32 (adjust font), where sometimes the displayed font was too large. Added two new alignment flags to BoxDrawText: 64 Right-justify text by adding space between words 128 Clip (truncate) text if it doesn't fit within specified rectangle In FileMenu, fixed a problem with the status bar descriptions under Windows NT 4.0. DLL 2.3dbm First showing up in WB 96D New functions: RegEntryType(i:handle, s:subkey) Returns the type of data for the specified subkey. In the 32-bit version, the return value will be one of the following: 0 (REG_NONE) No value type 1 (REG_SZ) Unicode nul terminated string 2 (REG_EXPAND_SZ) Unicode nul terminated string (with environment variable references) 3 (REG_BINARY) Free form binary 4 (REG_DWORD) 32-bit number 5 (REG_DWORD_BIG_ENDIAN) 32-bit number 6 (REG_LINK) Symbolic Link (unicode) 7 (REG_MULTI_SZ) Multiple Unicode strings 8 (REG_RESOURCE_LIST) Resource list in the resource map 9 (REG_FULL_RESOURCE_DESCRIPTOR) Resource list in the hardware description 10 (REG_RESOURCE_REQUIREMENTS_LIST) In the 16-bit version, the return value will always be 1. RegQueryEx(i:handle, s:subkey, s:delimiter, i:type) Retrieves a value from the registry. "Delimiter" is ignored unless "type" is 7. In the 32-bit version, "type" can be one of the following: 1 (REG_SZ) Unicode nul terminated string 2 (REG_EXPAND_SZ) Unicode nul terminated string (with environment variable references) 3 (REG_BINARY) Free form binary 4 (REG_DWORD) 32-bit number 7 (REG_MULTI_SZ) Multiple Unicode strings In the 16-bit version, "type" must be 1. RegSetEx(i:handle, s:subkey, s:value, s:delimiter, i:type) Sets a value in the registry. "Delimiter" is ignored unless "type" is 7. See "RegQueryEx" for a list of valid types. FileVerInfo(s:filename, s:language-key, s:resource-string) Returns a version resource string from a binary file. "filename" is the name of the EXE, DLL, or other binary file containing version resource information. "language-key" is a hexadecimal string identifying the desired language and character-set block within the file's resource table. U.S. English (w/ Windows Multilingual character set) is "040904E4". You can specify a blank string ("") to indicate U.S. English, which will almost always be appropriate. "resource-string" specifies the item to return. The following are standard item names (although some of these are optional and will not necessarily be present in any particular file): "Comments" "CompanyName" "FileDescription" "FileVersion" "InternalName" "LegalCopyright" "LegalTrademarks" "OriginalFilename" "ProductName" "ProductVersion" Example: desc = FileVerInfo("notepad.exe", "", "FileDescription") ver = FileVerInfo("notepad.exe", "", "FileVersion") Message(desc, ver) WinWaitExist(s:partial-winname, i:timeout) Waits for a top-level window to exist. "timeout" is the number of seconds to wait (maximum = 86400). Specify 0 to have the function return immediately without waiting. Specify -1 for no timeout (ie, wait forever). Returns @TRUE if the window appeared; @FALSE if it didn't. WinWaitChild(s:partial-parent-winname, s:partial-child-winname, i:timeout) Waits for a child window to exist. "timeout" is the number of seconds to wait (maximum = 86400). Specify 0 to have the function return immediately without waiting. Specify -1 for no timeout (ie, wait forever). Returns @TRUE if the window appeared; @FALSE if it didn't. New IntControl's: IntControl(41, p1, 0, 0, 0) Controls YmdHms format returned by time functions. P1 Meaning -- ------- -1 Don't change (just return current setting) 0 2-digit year (YY:MM:DD:HH:MM:SS) (default) 1 4-digit year (YYYY:MM:DD:HH:MM:SS) This affects the following functions which return a YmdHms string: FileYmdHms TimeAdd TimeJulToYmd TimeSubtract TimeYmdHms Returns previous setting. IntControl(42, p1, 0, 0, 0) Get pointer to a binary buffer. This returns the address of a pointer to a binary buffer. The address will be within the memory space of the WIL Interpreter. "P1" specifies the binary buffer (see BinaryAlloc). Fixed problem with RegQueryItem, where only one item was being returned. In the 16-bit version, fixed a problem with WinMetrics(-4) returning 0 under Windows for Workgroups if a secondary network (such as Netware) was installed. FileSize no longer returns an error if a wildcard file mask is specified which does not match any files; it now returns 0. All functions which take a YmdHms string as a parameter will now accept a string in the format "YYYY:MM:DD:HH:MM:SS" (ie, containing a 4-digit year). Fixed problem with time functions which return a YmdHms string (such as TimeAdd) with years >= 2000. Fixed problem with Delay function where the current year was >= 2000. Changed TimeJulianDay so that it treats 2-digit years in the input string as falling within the range 1950-2049 (eg, "96:04:01" is April 1, 1996). This is consistent with the behavior of the other time functions. Previously, TimeJulianDay was not adjusting the year, so that "96:04:01" would be treated as April 1, 0096. To retain the old behavior, you can specify a full 4-digit year (eg, "0096:04:01"). TimeJulianDay now correctly calculates julian dates for leap years that are evenly divisible by 400 (such as 2000). AddExtender and DllCall/DllLoad now also look for the specified DLL in the directory where the WIL Interpreter application is located. In the 32-bit version, SendKey (and SendKeysTo and SendKeysChild) now attempt to wait until the active application is ready to accept input before sending each keystroke. This can be disabled with IntControl 43 (see "DLL 2.3ebm" section, below). Fixed problem with RegQueryBin truncating long values. In the 16-bit version, fixed problem with FileAppend where the target was a UNC. Fixed memory allocation problem with WinWaitClose. The 32-bit version can now process batch and menu files which were saved by Notepad as Unicode text files. It may be able to handle Unicode text files created with other editors as well, as long as the first character in the file is a hexadecimal FFFE or FEFF. In the 32-bit version, the Dialog and DialogBox functions now properly set the current working directory when the user selects a file from a listbox. Fixed problem where an error that occurred in a CALL'ed script would not cancel the calling program. In the 32-bit version, fixed problem with FileCopy, FileMove, and FileAppend causing a crash if the specified source file did not exist and the specified target was a UNC. When AddExtender fails with an error 3437, it now displays a message box with some idea of what the problem may be, or with a Windows error code. NetWare 3 extender 12015 First showing up in WB 96D Fixed problem with n3ChgPassword. NOTE: Added "old-password" parameter to n3ChgPassword (changed from 96C). NetWare 4 extender 14012 First showing up in WB 96D Fixed problem with n4ChgPassword, when using bindery emulation. In the 32-bit version, fixed problem with Unicode initialization errors when using the Netware NT client. Windows 32 extender 10007 First showing up in WB 96D New functions: netResources(s:net-resource, i:scope, i:type, i:usage) Itemizes network resources. This function returns a tab-delimited list of network resources which are located immediately below the specified 'net-resource'. 'net-resource' can be a UNC (eg, "\\FredsPC"), a domain (eg, "SALES"), or "" for the root of the network. 'scope' can be one of the following: 1 All currently connected resources 2 All resources on the network 3 All remembered (persistent) connections 'type' can be one of the following: 0 All resources 1 All disk resources 2 All print resources 3 All disk and print resources 'usage' can be one of the following: 0 All resources 1 All connectable resources 2 All container resources 3 All connectable and container resources Note: 'usage' is ignored unless 'scope' is 2. WB 96E June 27, 1996 New IntControl: IntControl(1001, p1, 0, 0, 0) (32-bit only) Set service process status. P1 Meaning -- ------- 0 Run as a normal application (default). 1 Run as a service. If WinBatch is running as a service, it will not be closed when the user logs out. Under Windows 95, this function actually registers the currently executing WinBatch program as a service. Under Windows NT, it just causes the WinBatch program to behave as a service (ie, don't close when the user logs out); in order to launch a WinBatch program as a service under Windows NT, you will need to use a utility such as the SRVANY.EXE program which is included with the Windows NT Resource Kit. Returns @TRUE on success, @FALSE on failure. For window class names beginning with "Afx", PopMenu now bases the menu name upon the application's module name instead of the class name. DLL 2.3ebm First showing up in WB 96E New IntControl: IntControl(43, p1, 0, 0, 0) (32-bit only) Enable/disable "WaitForInputIdle". P1 Meaning -- ------- -1 Don't change (just return current setting) 0 Don't wait for application to be ready. 1 Wait for application to be ready (default). This controls whether SendKey (and SendKeysTo and SendKeysChild) attempt to wait until the active application is ready to accept input before sending each keystroke. Returns previous setting. WB 96F Oct 18, 1996 In BoxTextFont, expanded the "pitch & family" parameter to now be "pitch & family & character-set": In addition to the existing flags for pitch and family, you can now specify one of the following flags specifying a character set (combined with the pitch and/or family flags using the binary "OR" ["|"] operator): ANSI_CHARSET 0 (default) DEFAULT_CHARSET 256 SYMBOL_CHARSET 512 SHIFTJIS_CHARSET 32768 (Kanji) HANGEUL_CHARSET 33024 GB2312_CHARSET 34304 CHINESEBIG5_CHARSET 34816 OEM_CHARSET 65280 The following flags are for Windows 95 and NT 4.0 only: JOHAB_CHARSET 33280 HEBREW_CHARSET 45312 ARABIC_CHARSET 45568 GREEK_CHARSET 41216 TURKISH_CHARSET 41472 THAI_CHARSET 56832 EASTEUROPE_CHARSET 60928 RUSSIAN_CHARSET 52224 MAC_CHARSET 19712 BALTIC_CHARSET 47616 The character set flags will not override the typeface specified by the font "name" parameter. If you would rather specify a character set than a specific typeface, specify a blank string ("") for font "name". Note: If you wish to use a Kanji (Japanese) font, you must specify the SHIFTJIS_CHARSET flag (32768). New IntControls: IntControl(1002, p1, 0, 0, 0) Sets icon display state. This function sets the state of the WinBatch icon to being visible (default) or hidden. It is equivalent to using WinShow() or WinHide() on the current WinBatch window, except that after using any of the Box[..] functions and then doing a BoxShut(), the icon will go back to its previous display state. P1 Meaning -- ------- -1 Don't change (just return current setting) 0 Hide WinBatch icon. 1 Show WinBatch icon (default). Returns previous setting. IntControl(1003, p1, 0, 0, 0) Prevents WinBatch icon from being opened. This function sets the "open-able" flag for the WinBatch icon. If this flag is on (default), then the WinBatch icon can be opened (restored) to a normal window by clicking on the icon. If this flag is off, then it will not be possible to open the WinBatch icon by any method, including WinShow() or BoxOpen(). P1 Meaning -- ------- -1 Don't change (just return current setting) 0 WinBatch icon cannot be opened. 1 WinBatch icon can be opened (default). Returns previous setting. IntControl(1004, 0, 0, 0, 0) Returns the file name of the current WinBatch program. If the current WinBatch script is a child program that was called with the Call() function, this IntControl will return the name of the main (calling) program. If the current WinBatch script is a child program that was called with the CallExt() function, this IntControl will return the name of the current (called) program. Fixed a problem with BoxButtonWait returning erroneously when the Enter or Escape key was pressed. Fixed a problem where FileMenu was getting added twice to the menus of shortcut files. This occurred if a user removed the "IsShortcut" value from the "lnkfile" key in the registry. Fixed a problem with excessive repainting in the Box functions. The compiler can now be used to compile an encoded or encrypted WBT to an EXE file. If you try to compile a source WBT which is already encoded or encrypted to a target type which is an encoded or encrypted WBT, no processing will be done on the file and the target will be identical to the source. In other words, you cannot use the compiler to re-encode or re-encrypt a WBT, or convert an encoded WBT to an encrypted WBT (or vice versa). It is now possible to specify an "AutoExec" WIL script that will be called before every WinBatch program that you run. This would be a convenient place to set global variables, or perform standard startup commands, such as AddExtender or IntControl. This will have the same effect as placing a "Call" command to the AutoExec script as the first line of every WinBatch program you run, so therefore: 1. Any variables you set in the AutoExec script will be global, and any extenders you add will be available to the main WinBatch program. 2. If an error occurs in the AutoExec script, it will terminate the main WinBatch program (unless you use the ErrorMode function). 3. If an Exit command is encountered in the AutoExec script, the main WinBatch program will not be run. 4. If the main WinBatch program is a compiled EXE, the AutoExec script must be an encoded WBT. The AutoExec script is specified as follows: In the 16-bit version, add either or both of the following entries to the [WB16I] section of WWW-PROD.INI: AutoExecWbc=filename AutoExecWbt=filename where "filename" is the name of your AutoExec script file. In the 32-bit version, under the registry key: HKEY_LOCAL_MACHINE\SOFTWARE\Wilson WindowWare\Settings\WWW-PROD\WB32I create either or both of the following string values: AutoExecWbc AutoExecWbt and enter the name of your AutoExec script file as the value data. The "AutoExecWbc" settings are used when the WinBatch program being run is a compiled WinBatch EXE. The specified value must be an encoded WBT. The "AutoExecWbt" settings are used when the WinBatch program being run is an un-compiled WinBatch script. The specified value may be either a normal WBT or an encoded WBT. The specified script file name does not need to have an extension of "WBC" or "WBT". If it does not contain a full path, it will be searched for. If the file does not exist, it will be skipped without causing an error (of course, an error will occur if your main WinBatch program refers to a variable that was supposed to have been defined in the AutoExec script; the "IsDefined" function can be useful here). DLL 2.3fbn First showing up in WB 96F New functions: FindWindow(s:class-name) Returns the window title matching a specified class name. This function returns the window title of the first window whose class name matches the specified "class-name". A blank string ("") is returned if no matching window is found. "Class-name" must be the full class name (ie, not a partial name). It is not case sensitive. RegConnect(s:computer-name, i:handle) (32-bit only) Connects to a predefined registry handle on another computer. "computer-name" is in the form "\\computername". "handle" can be either @REGMACHINE OR @REGUSERS. Returns a key handle to the specified handle on the remote computer. You should use RegCloseKey to close the key when you are finished using it. RegQueryKeys(i:handle) Returns a tab-delimited list of subkey names under a specified key. StrFixLeft(base-string, pad-string, length) Pads or truncates the left side of a string to a fixed length using bytes. This function "fixes" the length of a string, either by truncating it on the left, or by prepending enough copies of pad-string to achieve the desired length. See "StrFix" for parameters and other information. StrFixCharsL(base-string, pad-string, length) Pads or truncates the left side of a string to a fixed length using characters. This function "fixes" the length of a string, either by truncating it on the left, or by prepending enough copies of pad-string to achieve the desired length. See "StrFixChars" for parameters and other information. BinaryOleType(i:bin-handle, i:type, i:reserved-1, i:reserved-2, i:reserved-3) Specifies how a binary buffer will be used by OLE functions. This function defines the attributes of the binary buffer specified by "bin-handle", which determines what happens when you use the binary buffer handle as a parameter to an OLE object (ie, one created with the "ObjectOpen" function). This function does not modify any data in the binary buffer itself. When an OLE object is called, and one of the parameters is a binary buffer handle, the following actions are automatically taken: 1. An internal OLE buffer is created which is (at least) as large as the binary buffer. 2. If the binary buffer is defined as an input (or input/output) parameter (see "type" below), any data in the binary buffer (up to the binary EOD) is converted as necessary to the specified format and copied to the OLE buffer. 3. The OLE buffer is passed to the OLE object. When the OLE object returns: 4. If the binary buffer is defined as an output (or input/output) parameter (see "type" below), then any data in the OLE buffer is copied back to the binary buffer. If it is possible to determine how much data was returned in the OLE buffer, then the binary EOD is set to the end of the data; otherwise, the binary EOD is set to the end of the binary buffer. 5. The OLE buffer is freed. "type" specifies what type of parameter the buffer will represent, and whether it will be used as an input or output parameter (or both). It consists of one entry from each of the following groups, added together: data type: 0 undefined 1 BSTR (VT_BSTR) 2 BSTR* (VT_BSTR | VT_BYREF) direction: 100 input parameter 200 output parameter 300 input/output parameter When a binary buffer is created with BinaryAlloc, it has a "type" of 0 (undefined). You must use BinaryOleType to set the buffer's type before using it as a parameter to an OLE object. Parameters 3, 4, and 5 are reserved for future use, and should be specified as 0. Returns 1. DiskVolInfo(root-path, request#) (32-bit only) Returns information on a file system volume. "root-path" specifies the root directory of a file system volume (eg, "C:\" or "\\SERVER\PUBLIC\") Req# Return value ---- ------------ 1 (s) volume name 2 (s) file system name (eg, "FAT" or "NTFS") 3 (s) volume serial number (hex string; eg, "1234-ABCD") 4 (i) volume serial number (decimal) 5 (i) max length of filename component (portion between backslashes) 6 (b) volume preserves the case of filenames when storing files 7 (b) volume supports case-sensitive filenames 8 (b) volume supports Unicode in filenames 9 (b) volume preserves and enforces ACL's 10 (b) volume supports file-based compression 11 (b) volume is a compressed volume (eg, a DoubleSpace volume) Request numbers which indicate a return type of "(b)" (Boolean) return a value of 1 (@TRUE) or 0 (@FALSE). Yields(i:count) Provides time for other windows to do processing. This function is the same as the "Yield" command, but allows you to specify the number of yields to perform; eg, "Yields(5)" is the same as 5 consecutive "Yield" commands. "count" is the number of yields to perform. See "Yield" for more information. RegLoadHive(i:handle, s:subkey, s:filename) (32-bit only) Loads a hive into a registry subkey. "handle" can be @REGUSERS or @REGMACHINE. "subkey" specifies the name of the key which will be created. "filename" specifies the name of a hive file. This function creates a subkey under HKEY_USERS or HKEY_LOCAL_MACHINE and stores registration information from the specified file into that subkey. This registration information is in the form of a hive. A hive is a discrete body of keys, subkeys, and values that is rooted at the top of the registry hierarchy. Returns 1. RegUnloadHive(i:handle, s:subkey) (32-bit only) Unloads a hive from the registry. "handle" can be @REGUSERS or @REGMACHINE. "subkey" must specify a key which is mapped to a hive file. Returns 1. StrIndexNc(s:string, s:sub-string, i:start, i:direction) Searches a string for a sub-string, ignoring case. This function is the same as StrIndex, but is not case sensitive. New IntControls: IntControl(44, p1, 0, 0, 0) Returns the class name for specified window handle. p1 = window handle The window handle can be obtained with the DllHwnd function. Returns a blank string ("") if the window doesn't exist. IntControl(45, p1, 0, 0, 0) (32-bit only) Enable/disable "SendKey speedup" in DOS programs in Windows NT. P1 Meaning -- ------- -1 Don't change (just return current setting) 0 Don't speed up SendKey in DOS programs in Windows NT. 1 Speed up SendKey in DOS programs in Windows NT (default). Normally, SendKey (and SendKeysTo and SendKeysChild) yields a little processor time between keystrokes, to allow other Windows programs to multitask. However, when sending keystrokes to a DOS program in Windows NT, this can result in excessive delays between keystrokes, and so in that case SendKey goes into "speedup" mode and grabs all the processor time it can get. Another factor that affects SendKey speed is the delay that is normally inserted between keystrokes, which by default is 25 milliseconds but can be adjusted with IntControl(35). When "SendKey speedup" mode is in effect, no such delay is inserted. This function allows you to disable the "SendKey speedup" behavior if it causes problems or is not desired. Returns previous setting. IntControl(46, p1, 0, 0, 0) (32-bit only) Set window retry timeout. By default, in the 32-bit version, most WIL functions which take a window title as a parameter (except for WinExist) will wait up to 9 seconds for the specified window to appear if it does not already exist. This IntControl allows you to change the timeout setting. p1 = number of seconds to wait (default = 9), or 0 for no retries. You can specify -1 to return the current setting without changing it. Returns previous setting. IntControl(47, p1, 0, 0, 0) Closes another WinBatch program. This IntControl lets a WIL script close another WinBatch program (it's not possible to close a WinBatch program using "WinClose"). P1 = window title (can be partial) of a WinBatch program window. If P1 is the current window, this function is the same as an Exit. Returns @TRUE on apparent success, or @FALSE on apparent failure. IntControl(48, p1, 0, 0, 0) Closes a DOS program. This IntControl lets you close the window of an MS-DOS program (it's not possible to close a DOS window using "WinClose"). Note: You will not receive any warning from the operating system before the window is closed, even if the DOS application contains unsaved work. Use this function carefully. P1 = window title (can be partial) of a DOS program window. If P1 is not a DOS window, this function has no effect. This function is not supported in Windows NT. Returns @TRUE on apparent success, or @FALSE on apparent failure. IntControl(49, p1, 0, 0, 0) Add system menus to popup windows. This IntControl lets you specify that certain types of WIL popup windows will have system menus (a little box or icon at the left side of the title bar) and minimize/maximize icon buttons. "P1" specifies what types of windows will have these icons: P1 Meaning -- ------- -1 Don't change (just return current setting) 0 No windows (default). 1 Dialog boxes (created with "Dialog"). 2 Item listboxes (eg, created with "AskItemList"). 3 Dialog boxes and item listboxes. Returns previous setting. IntControl(50, p1, 0, 0, 0) Controls whether "Go to web page" button is added to error boxes. By default, when an error occurs in one of the WIL programs distributed by Wilson WindowWare, and the program displays an error message box, it checks the system to see if a Web browser has been configured; if so, it adds a pushbutton to the error message box which says "Go to Tech Support Web Page". If pressed, the button launches the Web browser. This IntControl lets you prevent that button from being added. P1 Meaning -- ------- -1 Don't change (just return current setting) 0 Don't add "Go to web page" button to error boxes. 1 Add "Go to web page" button to error boxes (default). Returns previous setting. IntControl(51, p1, 0, 0, 0) (32-bit only) Specifies flags for CreateProcess. In the 32-bit version, all the Run[..] commands call the Windows API "CreateProcess" function to launch the application. This IntControl lets you specify certain flags that control the priority class and the creation of the process, and affects all subsequent Run[..] commands. Under normal circumstances, you should not need to use this IntControl at all. It should be used only by knowledgeable users, and completely at your own risk. Some of these flags can have unexpected or undesirable results. We cannot provide any support for their use. P1 = one or more of the following flags, combined using the binary "OR" ("|") operator. The default setting is 32: Value Flag name Meaning ----- --------- ------- 1 DEBUG_PROCESS If this flag is set, the calling process is treated as a debugger, and the new process is a process being debugged. The system notifies the debugger of all debug events that occur in the process being debugged. If you create a process with this flag set, only the calling thread (the thread that called CreateProcess) can call the WaitForDebugEvent function. 2 DEBUG_ONLY_THIS_PROCESS If not set and the calling process is being debugged, the new process becomes another process being debugged by the calling process’s debugger. If the calling process is not a process being debugged, no debugging-related actions occur. 4 CREATE_SUSPENDED The primary thread of the new process is created in a suspended state, and does not run until the ResumeThread function is called. 8 DETACHED_PROCESS For console processes, the new process does not have access to the console of the parent process. The new process can call the AllocConsole function at a later time to create a new console. This flag cannot be used with the CREATE_NEW_CONSOLE flag. 16 CREATE_NEW_CONSOLE The new process has a new console, instead of inheriting the parent’s console. This flag cannot be used with the DETACHED_PROCESS flag. 512 CREATE_NEW_PROCESS_GROUP The new process is the root process of a new process group. The process group includes all processes that are descendants of this root process. The process identifier of the new process group is the same as the process identifier, which is returned in the lpProcessInformation parameter. Process groups are used by the GenerateConsoleCtrlEvent function to enable sending a CTRL+C or CTRL+BREAK signal to a group of console processes. 1024 CREATE_UNICODE_ENVIRONMENT If set, the environment block pointed to by lpEnvironment uses Unicode characters. If clear, the environment block uses ANSI characters. 2048 CREATE_SEPARATE_WOW_VDM Windows NT only: This flag is valid only when starting a 16-bit Windows-based application. If set, the new process is run in a private Virtual DOS Machine (VDM). By default, all 16-bit Windows-based applications are run as threads in a single, shared VDM. The advantage of running separately is that a crash only kills the single VDM; any other programs running in distinct VDMs continue to function normally. Also, 16-bit Windows-based applications that are run in separate VDMs have separate input queues. That means that if one application hangs momentarily, applications in separate VDMs continue to receive input. 4096 CREATE_SHARED_WOW_VDM Windows NT only: The flag is valid only when starting a 16-bit Windows-based application. If the DefaultSeparateVDM switch in the Windows section of WIN.INI is TRUE, this flag causes the CreateProcess function to override the switch and run the new process in the shared Virtual DOS Machine. 67108864 CREATE_DEFAULT_ERROR_MODE The new process does not inherit the error mode of the calling process. Instead, CreateProcess gives the new process the current default error mode. An application sets the current default error mode by calling SetErrorMode. This flag is particularly useful for multi-threaded shell applications that run with hard errors disabled. The default behavior for CreateProcess is for the new process to inherit the error mode of the caller. Setting this flag changes that default behavior. These flags control the new process’s priority class, which is used in determining the scheduling priorities of the process’s threads. If none of the following priority class flags is specified, the priority class defaults to NORMAL_PRIORITY_CLASS unless the priority class of the creating process is IDLE_PRIORITY_CLASS. In this case the default priority class of the child process is IDLE_PRIORITY_CLASS. One of the following flags can be specified: Value Flag name Meaning ----- --------- ------- 32 NORMAL_PRIORITY_CLASS Indicates a normal process with no special scheduling needs. 64 IDLE_PRIORITY_CLASS Indicates a process whose threads run only when the system is idle and are preempted by the threads of any process running in a higher priority class. An example is a screen saver. The idle priority class is inherited by child processes. 128 HIGH_PRIORITY_CLASS Indicates a process that performs time-critical tasks that must be executed immediately for it to run correctly. The threads of a high-priority class process preempt the threads of normal-priority or idle-priority class processes. An example is Windows Task List, which must respond quickly when called by the user, regardless of the load on the operating system. Use extreme care when using the high-priority class, because a high-priority class CPU-bound application can use nearly all available cycles. 256 REALTIME_PRIORITY_CLASS Indicates a process that has the highest possible priority. The threads of a real-time priority class process preempt the threads of all other processes, including operating system processes performing important tasks. For example, a real-time process that executes for more than a very brief interval can cause disk caches not to flush or cause the mouse to be unresponsive. Returns previous setting. Fixed problem with RegDelValue under Windows NT. In the 32-bit version, fixed problem with Ctrl-Break not working during a RunWait. In the 32-bit version, FileCopy can now copy files to COM and LPT ports (the 16-bit version has always been able to do this). Increased the maximum number of extender entries from 100 to 200. In the 32-bit version of FileVerInfo, if you specify a blank string for "language-key", it will first try to look up the item under the language key "040904E4" (U.S. English w/ Windows Multilingual character set). If that fails, it will then try the key "040904B0" (U.S. English w/ Unicode character set). FileVerInfo now returns a blank string ("") if the specified item was not found, instead of returning an error. Fixed problem passing the number -2147483648 as a string parameter to functions. In the 32-bit version, fixed FileExist so that it actually returns a value of 2 (as documented) if the file is open by another application. It was returning a 1. Fixed problem with the Random() function crashing if a negative number was specified. Added new request #'s for WinMetrics: -6 pixels per horizontal dialog unit (rounded to an integer) -5 pixels per vertical dialog unit (rounded to an integer) Fixed problem with Debug displaying a return value of 0 for the last command in a script, if there was more than one blank line at the end of the script file. Fixed "Opening parenthesis missing" error when using a variable name such as 'max_users', where the portion of the variable name which preceded the underscore (ie, 'max') was the same as the name of a WIL function. In 32-bit version, fixed problem with Wallpaper() function in Windows NT 4.0. In 32-bit version, fixed problem with Display() function not timing out in some unusual cases. If you do an Exit from a called script, it will now really exit the program instead of returning to the calling script. In 32-bit version, you can now specify a blank section name for IniItemizePvt, but the specified INI file name must be a real file, not a "virtual" file that has been mapped to the registry. In 16-bit version, fixed a problem with WinMetrics(-4) returning 0 under Windows 3.1 if a network (such as Netware) was installed. In 32-bit version, changed NetInfo: NetInfo(0) will always return the string "WINNT", regardless of the operating system. This is consistent with previous behavior. NetInfo(1) will now depend on the operating system: Under Windows 95, NetInfo(1) will return a list of installed network client ID's, delimited with the standard file delimiter (by default, a tab). Some possible client ID's, with their corresponding descriptions, are: Client ID Description --------- ----------- 3OPEN 3Com 3+Open (all versions) 3SHARE 3Com 3+Share (all versions) DLR IBM OS/2 LAN Server (versions below 1.2) DLR12 IBM OS/2 LAN Server (version 1.2) DLR13 IBM OS/2 LAN Server (versions 1.2, 1.3, and 1.2 without /API) DLR13CSD IBM OS/2 LAN Server (version 1.3 CSD 5015/5050) DLR20 IBM OS/2 LAN Server (version 2.0) FTPNFS FTP Software NFS Client (InterDrive 95) LANMAN Microsoft Real Mode LAN Manager LANT5 Artisoft LANtastic (version 5.X and above) MSNET Real mode MS-Net Compatible NETWARE3 Novell NetWare (Workstation Shell 3.X [NETX]) NETWARE4 Novell NetWare (Workstation Shell 4.0 and above [VLM]) NOVELL32 Novell NetWare Client 32 NWREDIR Client for NetWare Networks PATHWKS DEC PATHWORKS (versions below 4.0) PATHWKS40 DEC PATHWORKS (version 4.x) PCLP IBM PC LAN Program (all versions) PCNFS50 SunSoft PC-NFS (version 5.0) VINES552 Banyan DOS/Windows 3.1 client VREDIR Client for Microsoft Networks Under Windows NT, NetInfo(1) will return a list of installed network provider ID's, delimited with the standard file delimiter (by default, a tab). Some possible providers, with their corresponding descriptions, are: Provider ID Description ----------- ----------- LanmanWorkstation Microsoft Windows Network NetWareWorkstation NetWare Services NWCWorkstation NetWare or Compatible Network Fixed problem with Display() function causing a "DlgPointLookup Failure" if you put the Display() in a loop and held down the spacebar. In 32-bit version, improved the problem of SendKey (and SendKeysTo and SendKeysChild) sending keystrokes very slowly to DOS programs in Windows NT. The speedup seems more noticeable in NT 4.0, although there should be some improvement in NT 3.51 as well. If this new "SendKey speedup" mode causes problems, it can be disabled with the new IntControl(45). Fixed problem with using WaitForKey twice in a row to wait for the same key, where the second WaitForKey returned immediately and didn't wait. In 32-bit version, fixed problem with PlayWaveForm not working if a keyword was specified (eg, "SystemStart") instead of a filename. In 32-bit version, fixed problem with StrCmp, StrCmpi, and BinarySort, when comparing or sorting two strings which were the same except for a hyphen or apostrophe (eg, "coop" and "co-op"). StrCmp and StrCmpi would, in some cases, return 1 instead of -1 (and vice versa), and BinarySort would sort the two strings improperly. In Dialog function, fixed problem with radio buttons having text descriptions longer than 60 characters always being selected by default. In 32-bit version, changed the way the Run[..] functions launch data files: When launching data files, the Run[..] functions now retrieve the command-line parameters from the registry, as well as the application name. For example, if the command line associated with .WBT files is: "C:\Program Files\WinBatch\System\WinBatch.Exe" "%1" %2 (note the quote marks), and you use the WIL function: Run("Test Script.Wbt", "Alpha Beta") then the actual command that will be executed is: "C:\Program Files\WinBatch\System\WinBatch.Exe" "Test Script.Wbt" Alpha The quote marks from the command line (as specified in the registry) are preserved. %1 gets replaced with the name of the data file. %2 gets replaced with the first parameter from the Run function ('Alpha'), if any. If there were a %3 specified in the command line, it would have been replaced with the second parameter from the Run function ('Beta'), if any, but since there was no %3 specified the 'Beta' parameter was stripped off. If the command line specified in the registry does not contain a %1, the Run[..] functions assume that the (only) parameter to be passed to the application is the name of the data file, with quote marks around it. KeyToggleGet and KeyToggleSet now work properly in the 32-bit version. Sounds now defaults to @OFF in the 32-bit version. Fixed a problem sending Alt-key combinations and other extended keystrokes to a small number of unusual DOS programs, particularly the DOS EDIT.COM. NetWare 3 extender 12016 First showing up in WB 96F (Note: the internal version number is mistakenly set as 12015) New function: n3CaptureGet(i:port-number) Returns the name of the print queue associated with a printer capture. "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc). Fixed problem with n3ServerList(request #'s 1 and 2) returning a blank string or garbage characters in the WWN3Z32I.DLL version. In the 32-bit version, fixed problem with n3CaptureEnd returning 0 and not ending the capture. NetWare 4 extender 14014 First showing up in WB 96F New functions: n4CaptureGet(i:port-number) Returns the name of the print queue associated with a printer capture. "port-number" is a number from 1 to 9 (where 1 = "LPT1", etc). n4ObjectList(s:context, s:parent, s:class, s:mask) Lists objects in a Directory Services tree. "context" is a NetWare context, or "" for the current context. "parent" is the object whose immediate subordinates are to be listed, or "" for the top of the tree. "class" identifies the type of objects to be listed. It can be "" for all objects, or it can be one of the following NetWare classes: "AFP Server" "Alias" "Bindery Object" "Bindery Queue" "Computer" "Country" "Device" "Directory Map" "External Entity" "Group" "List" "Locality" "Message Routing Group" "Messaging Routing Group" "Messaging Server" "NCP Server" "Organization" "Organizational Person" "Organizational Role" "Organizational Unit" "Partition" "Person" "Print Server" "Printer" "Profile" "Queue" "Resource" "Server" "Top" "Unknown" "User" "Volume" Note: Standard NetWare servers have a class of "NCP Server". "mask" identifies the objects to be listed. It can be "" for all names, or it can be a wildcard mask such as "Serv*". Returns a tab-delimited list of object names. Example: objects = n4ObjectList("", "", "Queue", "") ItemSelect("Queues in current context", objects, @TAB) n4ObjectInfo(s:context, s:object, i:request) Returns information on the specified object. "context" is a NetWare context, or "" for the current context. "object" is the name of a NetWare object. "request" is one of the following: 0 Server (UNC) where the object is stored (eg, "\\SERVER"). This is not necessarily the server on which the object is physically located. 1 Object class (see "n4ObjectList" for a list of classes). Example: server = n4ObjectInfo("Admin", "Print01", 0) Message("Print01 is located on", server) n4ObjectProps(s:context, s:object, s:attribute) Returns properties of the specified object. "context" is a NetWare context, or "" for the current context. "object" is the name of a NetWare object. "attribute": If "attribute" is a blank string (""), this function will return a tab-delimited list of all attributes for "object". If "attribute" specifies an valid attribute of "object", this function will return a tab-delimited list of values for that attribute. Note: Only string values will be returned correctly. Examples: host = n4ObjectProps("", "Print01", "Host Device") Message("Host Device", host) ; list all attributes and values for an object attribs = n4ObjectProps("", "Print01", "") count = ItemCount(attribs, @TAB) For i = 1 To count attrib = ItemExtract(i, attribs, @TAB) values = n4ObjectProps("", "Print01", attrib) ItemSelect(attrib, values, @TAB) Next n4NameConvert(s:context, s:object, i:format) Converts an object name to a different format. "context" is a NetWare context, or "" for the current context. "object" is the name of a NetWare object. If "object" contains a period ("."), it is assumed to be in canonical format; otherwise, it is assumed to be in abbreviated format. If "object" begins with two slashes "\\", it is assumed to be a UNC. If "object" is in an invalid format, it will be returned as-is, without being converted. "format" specifies what format "object" will be converted to, and is one of the following: 1 canonical, typed (eg, "CN=Server.O=Office") 2 abbreviated, typed (eg, "CN=Server") 3 canonical, typeless (eg, "Server.Office") 4 abbreviated, typeless (eg, "Server") 5 UNC (eg, "\\Server") Example: objname = n4NameConvert("", "\\Server", 3) Message("Object name", objname) In the 32-bit version, fixed problem with n4CaptureEnd returning 0 and not ending the capture. Fixed problem with n4MemberGet erroneously returning @FALSE in some cases. Fixed problem with n4ServerList(4) only returning the names of servers that were located in the current context. Windows 32 extender 11000 First showing up in WB 96F Split the Windows 32 extender (WWNET32I.DLL) into separate extenders for Windows 95 (WWW9532I.DLL) and Windows NT (WWWNT32I.DLL). The existing net[..] functions have been renamed to w95[..] and wnt[..], respectively: Old Windows 32 New Windows 95 New Windows NT -------------- -------------- -------------- netAddDrive w95AddDrive wntAddDrive netAddPrinter w95AddPrinter wntAddPrinter netCancelCon w95CancelCon wntCancelCon netDirDialog w95DirDialog wntDirDialog netGetCon w95GetCon wntGetCon netGetUser w95GetUser wntGetUser netResources w95Resources wntResources netVersion w95Version wntVersion For backwards compatability, we are continuing to distribute an extender DLL named WWNET32I.DLL which supports the existing net[..] functions. However, this DLL is a "wrapper" or "shell" which calls the appropriate platform-specific extender DLL (ie, WWW9532I.DLL or WWWNT32I.DLL). Therefore, one of these two DLL's (depending on the operating system being used) will need to be available (either in the current directory, in the same directory as WWNET32I.DLL, or in a directory on the path). Windows 95 extender 11000 First showing up in WB 96F New functions: w95ShareAdd(s:server-name, s:resource, s:share-name, i:share-type, i:flags) Shares a resource. "server-name" can be the name of the server on which the function will execute, or a blank string ("") to indicate the current machine. "resource" identifies the object to be shared. It can be a directory name (eg, "C:\UTIL"), a printer object (eg, "HP LaserJet III"), or the name of a shareable device. "share-name" is the name by which other users will access the resource. "share-type" identifies what type of object "resource" is, and can be one of the following: 0 directory 1 printer 2 device "flags" specifies the access type being granted to other users: If share-level access control is being used, then "flags" can be one of the following: 100001 read-only 100002 full 100003 depends on password Note: If "resource" specifies a printer, then "flags" should be set to 100002. If user-level access control is being used, then "flags" should be set to 100002. Returns 1. w95ShareSet(s:server-name, s:share-name, s:comment, s:full-password, s:read-password) Sets additional share information for a resource. "comment" is a text string that can be used to describe the share, or a blank string ("") if no comment is desired. "full-password" and "read-password": If share-level access control is being used, and "share-name" specifies a directory, then "full-password" specifies the password that is required for full access, and "read-password" specifies the password that is required for read-only access. If share-level access control is being used, and "share-name" specifies a printer, then "full-password" specifies the password that is required for access, and "read-password" should be set to a blank string (""). If user-level access control is being used, then "full-password" and "read-password" should be set to blank strings (""). See "w95ShareAdd" for additional parameter information. Returns 1. w95ShareDel(s:server-name, s:share-name) Un-shares a resource. See "w95ShareAdd" for parameter information. Returns @TRUE if the share was deleted, or @FALSE if there was no share with the specified name. w95AccessAdd(s:server-name, s:resource, s:user/group name, i:access-rights, i:flags) Adds or updates an access (permission) record for a resource. If "resource" is a printer, it should be specified in the form: "\PRINT\sharename" "user/group name" is the name of the user or group to whom access is being granted. If necessary, it can be fully qualified as "server\user". "access-rights" specifies the type of access that is being granted: It can be one of the following standard permission types: @ACC_READ_95 Read-only access @ACC_FULL_95 Full access Or, you can can specify a combination of the following custom permission bits, combined using the binary "OR" ("|") operator: @ACC_READ Read @ACC_WRITE Write @ACC_CREATE Create @ACC_DELETE Delete @ACC_ATTRIB Change attributes @ACC_LIST List files @ACC_CONTROL Change access control If "resource" specifies a printer, "access-rights" should be: @ACC_FULL_95 Full access "flags" is reserved for future use, and should be set to 0. See "w95ShareAdd" for additional parameter information. If an access record already exists for "resource" for the specified "user/group name", it will be updated to have the specified "access-rights". Note: This function can only be used if user-level access control is being used (this is configured under "Network" settings). Returns 1. w95AccessDel(s:server-name, s:resource, s:user/group name) Removes an access (permission) record from a resource. If "resource" is a printer, it should be specified in the form: "\PRINT\sharename" See "w95ShareAdd" and "w95AccessAdd" for parameter information. Note: This function can only be used if user-level access control is being used (this is configured under "Network" settings). Returns @TRUE if any records were deleted, or @FALSE if no appropriate records were found. w95ListGroups(s:server) Lists all global user groups in an NT domain. "server" is the UNC name of an NT primary or backup domain controller, to which you are logged in (eg, "\\MYSERVER"). Note: In order to use this function, you must have RADMIN32.DLL and RLOCAL32.DLL present. These DLL's can be found in the Microsoft Windows 95 Service Pack 1. Returns tab-delimited list of groups. w95MemberGet(s:server, s:group, s:user) Determines if user is a member of a global group in an NT domain. "server" is the UNC name of an NT primary or backup domain controller, to which you are logged in (eg, "\\MYSERVER"). Note: In order to use this function, you must have RADMIN32.DLL and RLOCAL32.DLL present. These DLL's can be found in the Microsoft Windows 95 Service Pack 1. Returns @TRUE or @FALSE. w95MemberSet(s:server, s:group, s:user) Adds user to a global group in an NT domain. "server" is the UNC name of an NT primary or backup domain controller, to which you are logged in (eg, "\\MYSERVER"). Note: In order to use this function, you must have RADMIN32.DLL and RLOCAL32.DLL present. These DLL's can be found in the Microsoft Windows 95 Service Pack 1. Returns @TRUE on success; @FALSE if user already member of group. w95MemberDel(s:server, s:group, s:user) Removes user from a global group in an NT domain. "server" is the UNC name of an NT primary or backup domain controller, to which you are logged in (eg, "\\MYSERVER"). Note: In order to use this function, you must have RADMIN32.DLL and RLOCAL32.DLL present. These DLL's can be found in the Microsoft Windows 95 Service Pack 1. Returns @TRUE on success; @FALSE if user not member of group. w95MemberGrps(s:server, s:user) Lists all global groups in an NT domain to which a user belongs. "server" is the UNC name of an NT primary or backup domain controller, to which you are logged in (eg, "\\MYSERVER"). Note: In order to use this function, you must have RADMIN32.DLL and RLOCAL32.DLL present. These DLL's can be found in the Microsoft Windows 95 Service Pack 1. Returns tab-delimited list of groups. w95MemberList(s:server, s:group) Lists all members of a global group in an NT domain. "server" is the UNC name of an NT primary or backup domain controller, to which you are logged in (eg, "\\MYSERVER"). Note: In order to use this function, you must have RADMIN32.DLL and RLOCAL32.DLL present. These DLL's can be found in the Microsoft Windows 95 Service Pack 1. Returns tab-delimited list of users. Windows NT extender 11000 First showing up in WB 96F New functions: wntShareAdd(s:server-name, s:resource, s:share-name, i:share-type, i:max-users) Shares a resource. "server-name" can be the name of the server on which the function will execute, or a blank string ("") to indicate the current machine. If "share-type" = 1 (printer), then "server-name" is ignored and should be set to a blank string (""). "resource" identifies the object to be shared. It can be a directory name (eg, "C:\UTIL"), a printer object (eg, "HP LaserJet III"), or the name of a shareable device. "share-name" is the name by which other users will access the resource. "share-type" identifies what type of object "resource" is, and can be one of the following: 0 directory 1 printer 2 device "max-users" indicates the maximum number of users allowed, or -1 for the highest possible number. If "share-type" = 1 (printer), this parameter is ignored and should be set to -1. Returns 1. wntShareSet(s:server-name, s:resource/share-name, i:share-type, s:comment, s:location) Sets additional share information for a resource. "resource/share-name" identifies the object to be modified: If "share-type" = 1 (printer), then "resource/share-name" should specify the object's resource name (eg, "HP LaserJet III"). Otherwise, it should specify the object's share name. "comment" is a text string that can be used to describe the share, or a blank string ("") if no comment is desired. "location": If "share-type" = 1 (printer), then this is a text string that can be used to describe the location of the printer, or a blank string ("") if no location description is desired. For other share types, this parameter is ignored and should be set to a blank string (""). See "wntShareAdd" for additional parameter information. Returns 1. wntShareDel(s:server-name, s:resource/share-name, i:share-type) Un-shares a resource. "resource/share-name" identifies the object to be modified: If "share-type" = 1 (printer), then "resource/share-name" should specify the object's resource name (eg, "HP LaserJet III"). Otherwise, it should specify the object's share name. See "wntShareAdd" for additional parameter information. Returns @TRUE if the share was deleted, or @FALSE if there was no share with the specified name. wntAccessAdd(s:server-name, s:resource/share-name, s:user/group name, i:object-type, s:access-string) Adds or updates access (permission) records for a resource. "server-name" can be the name of the server on which the function will execute, or a blank string ("") to indicate the current machine. This is used for looking up share names (if "resource/share-name" specifies a share) and user/group names. "resource/share-name" identifies the object to be modified: If "object-type" = 100 (share), then "resource/share-name" should specify the name of the share. If "object-type" = 400 (registry key), then "resource/share-name" should be the handle of an open registry key (opened with the "RegOpenKey" function), or a predefined registry handle (listed in the WIL Reference under "Registration Database Operations"). Otherwise, "resource/share-name" should specify the name of the resource (eg, "HP LaserJet III" or "C:\UTIL\MYFILE.TXT"). "user/group name" is the name of the user or group to whom access is being granted. If necessary, it can be fully qualified as "server\user". "object-type" indicates the type of object identified by "resource/share-name", and can be one of the following: 100 share (eg, a directory accessed through a share) 200 printer (accessed through a share) 300 file or directory in an NTFS partition 400 registry key "access-string" specifies the type of access that is being granted. It can be either (A) a predefined access type, or (B) a delimited list of one or more specific "access-records". Both are described below: (A) Predefined access types: These get translated into specific access records, as shown. It is possible that the appropriate values may vary depending on your system configuration, or among different versions of Windows NT: Access-string Meaning Specific equivalent -------------- ---------------- -------------------------- "DirNT:List" List "0:2:1179817" "DirNT:Read" Read "0:9:-1610612736|0:2:1179817" "DirNT:Add" Add "0:2:1180086" "DirNT:AddRead" Add & Read "0:9:-1610612736|0:2:1180095" "DirNT:Change" Change "0:9:-536805376|0:2:1245631" "DirNT:Full" Full Control "0:9:268435456|0:2:2032127" "DirNT:None" No Access "1:9:268435456|1:2:2032127" "DirShare:Read" Read "0:0:1179817" "DirShare:Change" Change "0:0:1245631" "DirShare:Full" Full Control "0:0:2032127" "DirShare:None" No Access "1:0:2032127" "File:Read" Read "0:0:1179817" "File:Change" Change "0:0:1245631" "File:Full" Full Control "0:0:2032127" "File:None" No Access "1:0:2032127" "Print:Print" Print "0:0:131080" "Print:Manage" Manage Documents "0:0:131072|0:0:268435456" "Print:Full" Full Control "0:0:983052|0:0:268435456" "Print:None" No Access "1:0:983052|1:0:268435456" "Reg:Read" Read "0:2:131097" "Reg:Full" Full Control "0:2:983103" Note: "DirShare" is a directory accessed through a share ("object-type" = 100). "DirNT" is a directory in an NTFS partition, accessed through NT security ("object-type" = 300). (B) Specific "access-records": This can be a single record, or a list of records (maximum of 10) delimited with vertical bars (|). Each record is in the format: record-type:access-flags:access-rights where "record-type", "access-flags", and "access-rights" are each a decimal number, separated with colons (:). It is not expected that most users will want to manually create or edit "access-records" strings. Instead, you can use the "wntAccessGet" function to return an "access-records" string in the proper format to be used with this function. This can be useful for transferring access rights from one user to another. A brief description of the fields in the "access-records" string follows (note that any detailed explanation is beyond the scope of this document, but might be obtained from the WIN32 SDK programmers' documentation available from Microsoft and other publishers): "record-type" (one of the following): 0 ACCESS_ALLOWED_ACE_TYPE 1 ACCESS_DENIED_ACE_TYPE "access-flags" (0, or, one or more of the following): 1 OBJECT_INHERIT_ACE 2 CONTAINER_INHERIT_ACE 4 NO_PROPAGATE_INHERIT_ACE 8 INHERIT_ONLY_ACE "access-rights" (one or more of the following, usually several, depending on the object type; this is not a complete list): 1 FILE_LIST_DIRECTORY (Dir) 1 FILE_READ_DATA (File) 2 FILE_ADD_FILE (Dir) 2 FILE_WRITE_DATA (File) 4 FILE_ADD_SUBDIRECTORY (Dir) 4 FILE_APPEND_DATA (File) 8 FILE_READ_EA 16 FILE_WRITE_EA 32 FILE_TRAVERSE (Dir) 32 FILE_EXECUTE (File) 64 FILE_DELETE_CHILD 128 FILE_READ_ATTRIBUTES 256 FILE_WRITE_ATTRIBUTES 65536 DELETE 131072 READ_CONTROL 262144 WRITE_DAC 524288 WRITE_OWNER 1048576 SYNCHRONIZE 268435456 GENERIC_ALL 536870912 GENERIC_EXECUTE 1073741824 GENERIC_WRITE -2147483648 GENERIC_READ If any access records already exist for "resource/share-name" for the specified "user/group name", they will be removed before adding the records specified by "access-string". Note: If you have not previously added any permissions to a share, it may implicitly have some default permissions (eg, when you create a share for a directory, it defaults to giving "Full Control" access to "Everyone"). When you use "wntAccessAdd" to create an access record for such a share, it will supercede those default permissions (ie, the default permissions will be removed). If you wish to keep the default permissions, use "wntAccessAdd" to set them explicitly. Returns 1. wntAccessDel(s:server-name, s:resource/share-name, s:user/group name, i:object-type) Removes access (permission) records from a resource. This function removes all access records from "resource/share-name" that are associated with "user/group name". See "wntAccessAdd" for parameter information. Returns @TRUE if any records were deleted, or @FALSE if no appropriate records were found. wntAccessGet(s:server-name, s:resource/share-name, s:user/group name, i:object-type) Returns access (permission) records for a resource. Returns a list of access records for "resource/share-name" for the specified "user/group name", delimited with vertical bars (|). See "wntAccessAdd" for information on the format of the access records. If there are no appropriate records, it returns a blank string (""). Note: If you have not previously added any permissions to a share, it may implicitly have some default permissions (eg, when you create a share for a directory, it defaults to giving "Full Control" access to "Everyone"), although there may not actually be any access records for the share. Therefore, "wntAccessGet" may return a blank string (""). However, if you go into File Manager (or Explorer), bring up the "Permissions" dialog for the share, and then simply select "OK", it will cause the implicit permissions to become actual permissions, which you can then retrieve using "wntAccessGet". See "wntAccessAdd" for parameter information. Returns a delimited list of access records. wntListGroups(s:server, i:group-type) Lists all user groups on a server or domain. "server" is the UNC name of the server on which the function will execute (eg, "\\MYSERVER"), or "" for the local computer. "group-type" can be @LOCALGROUP or @GLOBALGROUP. Returns tab-delimited list of groups. wntMemberGet(s:server, s:group, s:user, i:group-type) Determines if user is a member of a group. "server" is the UNC name of the server on which the function will execute (eg, "\\MYSERVER"), or "" for the local computer. "group-type" can be @LOCALGROUP or @GLOBALGROUP. Returns @TRUE or @FALSE. wntMemberSet(s:server, s:group, s:user, i:group-type) Adds user to a group. "server" is the UNC name of the server on which the function will execute (eg, "\\MYSERVER"), or "" for the local computer. "group-type" can be @LOCALGROUP or @GLOBALGROUP. Returns @TRUE on success; @FALSE if user already member of group. wntMemberDel(s:server, s:group, s:user, i:group-type) Removes user from a group. "server" is the UNC name of the server on which the function will execute (eg, "\\MYSERVER"), or "" for the local computer. "group-type" can be @LOCALGROUP or @GLOBALGROUP. Returns @TRUE on success; @FALSE if user not member of group. wntMemberGrps(s:server, s:user, i:group-type, i:flags) Lists all groups to which a user belongs. "server" is the UNC name of the server on which the function will execute (eg, "\\MYSERVER"), or "" for the local computer. "group-type" can be @LOCALGROUP or @GLOBALGROUP. "flags" -- if "group-type" = @LOCALGROUP, you can set "flags" to 1 to include groups that the user is a member of indirectly. Otherwise, set to 0. Returns tab-delimited list of groups. wntMemberList(s:server, s:group, i:group-type) Lists all members of a user group. "server" is the UNC name of the server on which the function will execute (eg, "\\MYSERVER"), or "" for the local computer. "group-type" can be @LOCALGROUP or @GLOBALGROUP. Returns tab-delimited list of users. wntResources2(s:net-resource, i:scope, i:type, i:usage, s:provider) Itemizes network resources. Note: This function supercedes the "wntResources" function. This function returns a tab-delimited list of network resources which are located immediately below the specified 'net-resource'. 'net-resource' can be a server UNC (eg, "\\FredsPC"), a domain (eg, "SALES"), or the name of a container object within a domain (eg, "Directory Services"). It cannot be a network provider. You can specify "" for the root of the network or the root of the network provider (depending on the 'provider' parameter, below). 'scope' can be one of the following: 1 All currently connected resources 2 All resources on the network 3 All remembered (persistent) connections 'type' can be one of the following: 0 All resources 1 All disk resources 2 All print resources 3 All disk and print resources 'usage' can be one of the following: 0 All resources 1 All connectable resources 2 All container resources 3 All connectable and container resources Note: A "connectable" object is an object that can be connected to, such as a directory or a printer. A "container" object is an object that contains other objects, such as a domain or a server. 'provider' is the name of the network provider under which 'net-resource' is located, most commonly "Microsoft Windows Network" (for Windows NT) or "Netware Services" (for Netware). If you don't have any secondary networks on your system, you can usually specify a blank string ("") for 'provider'. If you specify blank strings ("") for both 'net-resource' and 'provider', this function will return a list of network providers. If you specify a blank string ("") for 'net-resource' and a non-blank 'provider', this function will return a list of network resources located beneath 'provider'. Note: 'net-resource', 'usage', and 'provider' are ignored unless 'scope' is 2. That is, you can itemize all current or persistent connections network-wide, eg: wntResources2("", 1, 0, 1, "") Or you can itemize all available resources under a specific 'net-resource', eg: wntResources2("\\JELLO", 2, 0, 1, "Microsoft Windows Network") But you can't do both at the same time, ie, you can't itemize current connections under a specific 'net-resource'. wntServiceAt(s:server, s:domain, i:server-type, s:service-name, i:flags) Lists all servers in a domain which contain a specified service. "server" is the UNC name of the server on which the function will execute (eg, "\\MYSERVER"), or "" for the local computer. "domain" is the name of the domain which will be used (eg, "SALES"), or "" for the primary domain. "server-type" identifies the type of servers which will be examined. You can specify -1 for all servers. Or, you can specify one or more of the following flags, combined using the binary OR ("|") operator; servers meeting 1 All LAN Manager workstation 2 All LAN Manager server 4 Any server running with Microsoft SQL Server 8 Primary domain controller 16 Backup domain controller 32 Server running the timesource service 64 Apple File Protocol servers 128 Novell servers 256 LAN Manager 2.x Domain Member 512 Server sharing print queue 1024 Server running dialin service 2048 Xenix server 4096 Windows NT (either workstation or server) 8192 Server running Windows for Workgroups 16384 Microsoft File and Print for Netware 32768 Windows NT Non-DC server 65536 Server that can run the browser service 131072 Server running a browser service as backup 262144 Server running the master browser service 524288 Server running the domain master browser 4194304 Windows 95 or newer -2147483648 Domain announcement "service-name" is the name of the service to be looked for. "flags" specifies information on the service being looked for. It consists of one entry from each of the following three groups, added together: service type: 1 services 2 drivers 3 both (services and drivers) service state: 100 active services 200 inactive services 300 both (active and inactive) name type (indicates what the "service-name" parameter represents): 0 display name (the name shown in Control Panel) 1000 service name (the actual registry key name) Returns a tab-delimited list of server UNC names (eg, "\\