WIL Reference Manual NOV 2009
Transcription
WIL Reference Manual NOV 2009
WIL Reference Manual Manual Revision ~ Nov 2009 Copyright © 1988-2009 by Morrie Wilson. All rights reserved. No part of this manual may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying and recording, for any purpose without the express written permission of Wilson WindowWare, Inc. Information in this document is subject to change without notice and does not represent a commitment by Wilson WindowWare, Inc. The software described herein is furnished under a license agreement. It is against the law to copy this software under any circumstances except as provided by the license agreement. U.S. Government Restricted Rights Use, duplication, or disclosure by the Government is subject to restrictions as set forth in subdivision (b)(3)(ii) of the Rights in Technical Data and Computer Software clause at 252.227-7013. Contractor/manufacturer is Wilson WindowWare, Inc. / 5421 California Ave. SW / Seattle, WA 98136 / Orders: 800-762-8383 / Support: 206-937-9335 / Fax: 206-935-7129. Trademarks Microsoft and MS-DOS are registered trademarks of Microsoft Corporation. Windows, Explorer, Word for Windows, NotePad, Visual Basic, ClearType and Excel are trademarks of Microsoft Corporation. WordPerfect, WordPro are trademarks of IBM. Power Builder is a trademark of PowerSoft Corporation. Clock Manager is a trademark of Graphical Dynamics. WinBatch®, and WebBatch® are registered trademarks of Wilson WindowWare, Inc. WinMacro, and WinBatch Studio are trademarks of Wilson WindowWare, Inc. CONTENTS CONTENTS WIL Reference Manual i CONTENTS iii INTRODUCTION What is WIL? What is WIL good for? Products that use WIL Notational Conventions Acknowledgments 17 17 17 18 19 20 WIL TUTORIAL Creating WIL Scripts Files Running WIL Utilities Command Line Parameters What is a WIL Program? Our First WIL Program Functions and Parameters Displaying Text User Input Using Variables Making Decisions Control of Program Flow Exploring WIL Running Programs Display and Input Manipulating Windows Files and Directories Handling Errors Debugging WIL Scripts Selection Methods Nicer File Selection Nicer Messages Running DOS Programs Sending Keystrokes to Programs Our Completed WIL File 21 21 21 22 23 24 24 27 28 30 31 34 39 40 42 44 47 49 52 52 56 57 58 59 60 THINGS TO KNOW Recovering from Cancel Extenders: Networking, Novell, TCP/IP, Microsoft Terminating WIL processing Carriage Return Line Feed 63 63 64 66 66 iii CONTENTS Extension Associations and the Run Functions Debug Internal Control Functions Partial Window Names System.ini and its device= lines Dividing Floating Point Numbers File Delimiters Sounds WIL LANGUAGE Language Components Constants Identifiers Variables Variable Substitution Lists Explained Keywords Operators Precedence and Evaluation Order Comments Assignment Statements Control Statements Function Parameters User Defined Functions Arrays Error Handling Using ErrorMode Using IntControl 73 WIL FUNCTION REFERENCE Introduction About Abs Acos AddExtender AppExist AppWaitClose ArrayFileGet ArrayFileGetCsv ArrayFilePut ArrayFilePutCsv Arrayize ArraySwapElements ArrDimension ArrInfo ArrInitialize Asin iv 66 66 67 67 68 68 69 70 71 71 71 72 73 73 74 75 75 76 77 77 77 78 79 82 83 83 83 85 85 86 86 87 87 89 90 91 92 93 94 95 96 97 98 99 100 CONTENTS AskColor AskDirectory AskFileName AskFileText AskFont AskItemList AskLine AskPassword AskTextBox AskYesNo Atan Average Beep Binary Operations BinaryAlloc BinaryAllocArray BinaryAnd BinaryBufInfo BinaryCheckSum BinaryClipGet BinaryClipPut BinaryCompare BinaryConvert BinaryCopy BinaryEodGet BinaryEodSet BinaryFree BinaryHashRec BinaryIncr BinaryIndex BinaryIndexBin BinaryIndexEx BinaryIndexNc BinaryOleType BinaryOr BinaryPeek BinaryPeekHex BinaryPeekStr BinaryPeekStrW BinaryPoke BinaryPokeHex BinaryPokeStr BinaryPokeStrW BinaryRead BinaryReadEx BinaryReplace 100 101 103 105 106 108 110 112 112 113 114 115 115 116 116 117 119 120 121 122 123 125 125 127 128 128 129 130 131 132 133 134 135 136 139 140 141 142 143 143 144 145 146 147 147 149 v CONTENTS BinarySort BinaryStrCnt BinaryTagExtr BinaryTagFind BinaryTagIndex BinaryTagInit BinaryTagLen BinaryTagRepl BinaryWrite BinaryWriteEx BinaryXlate BinaryXor Break ButtonNames Call Ceiling Char2Num ChrGetCodePage ChrHexToString ChrHexToUnicode ChrSetCodePage ChrStringToHex ChrStringToUnicode ChrUnicodeToHex ChrUnicodeToString ClipAppend ClipGet ClipGetEx ClipHasFormat ClipPut ComputerNameGet ComputerNameSet Continue Cos Cosh CreateObject CurrentFile {*M} CurrentPath {*M} CurrFilePath {*M} DataCast DDEExecute DDEInitiate DDEPoke DDERequest DDETerminate DDETimeout vi 149 151 152 153 155 156 158 160 162 163 164 165 166 167 168 169 170 171 171 172 172 173 173 174 174 175 175 176 176 178 178 179 180 181 182 182 182 183 184 185 185 186 187 188 189 190 CONTENTS Debug DebugData DebugTrace Decimals Dialog User-Defined-Callback Function or Subroutine Using Internet Explorer Controls in WIL Dialogs DialogControlGet DialogControlSet DialogControlState DialogObject DialogProcOptions DirAttrGet DirAttrGetEx DirAttrSet DirAttrSetEx DirChange DirExist DirGet DirHome DirInfoToArray DirItemize DirMake DirRemove DirRename DirScript DirSize DirWindows DiskExist DiskFree DiskInfo DiskScan DiskSize DiskVolInfo Display DllCall DllCall Additional Information DllCallCdecl DllFree DllHinst DllHwnd DllLastError DllLoad DOSVersion Drop DropWild 191 193 194 198 199 218 225 234 238 242 246 249 254 255 257 258 261 262 263 263 264 265 266 266 267 268 268 269 270 271 272 272 273 274 275 276 279 280 283 283 284 285 286 286 287 287 vii CONTENTS EndSession Environment EnvironSet EnvItemize ErrorEvent ErrorMode Exclusive Execute ExeTypeInfo Exit Exp Fabs FileAppend FileAttrGet FileAttrGetEx FileAttrSet FileAttrSetEx FileBaseName FileClose FileCompare FileCopy FileCopyAttr FileCreateTemp FileDelete FileDigest FileExist FileExtension FileFullName FileGet FileGetW FileInfoToArray FileItemize FileItemPath FileLocate FileMapName FileMove FileMoveAttr FileNameLong FileNameShort FileOpen FilePath FilePut FilePutW FileRead FileRename FileRoot viii 288 289 290 291 292 292 294 295 296 296 297 297 298 299 299 302 303 305 306 306 307 309 310 311 312 312 313 314 315 315 316 317 318 319 320 321 322 323 324 324 326 327 327 328 329 329 CONTENTS FileSize FileSizeEx FileTimeCode FileTimeGet FileTimeGetEx FileTimeSet FileTimeSetEx FileTimeTouch FileVerInfo FileWrite FileYmdHms FindWindow Floor For ForEach GetExactTime GetObject GetTickCount GoSub Goto IconExtract IconInfo IconReplace If ... Else ... Endif If ... Then ... Else IgnoreInput IniDelete IniDeletePvt IniItemize IniItemizePvt IniRead IniReadPvt IniWrite IniWritePvt InstallFile Int IntControl IsDefined IsFloat IsInt IsKeyDown IsLicensed IsNumber ItemCount ItemCountCsv ItemExtract ItemExtractCsv 330 331 332 332 333 334 335 336 336 339 340 340 341 341 342 344 345 345 345 346 347 347 349 351 353 353 354 355 355 356 357 358 358 359 361 361 394 394 395 396 396 397 397 398 399 400 ix CONTENTS ItemInsert ItemLocate ItemRemove ItemReplace ItemSort KeyToggleGet KeyToggleSet LastError Log10 LogDisk LogE Max Message Min Mod MouseClick MouseClickBtn MouseCoords MouseInfo MouseMove MousePlay MsgTextGet Net101 NetInfo Num2Char OLE / COM ObjectAccess ObjectClose ObjectConstantsGet ObjectConstToArray ObjectCreate ObjectEventAdd ObjectEventRemove ObjectGet ObjectOpen ObjectType ObjectTypeGet ParseData Pause PipeClientClose PipeClientOpen PipeClientSendRecvData PipeInfo PipeServerClose PipeServerCreate PipeServerRead x 402 402 403 404 404 405 405 406 407 407 408 408 409 409 410 410 411 412 413 415 415 418 418 419 419 420 426 427 428 430 431 434 436 438 440 441 444 447 448 449 450 452 453 455 456 457 CONTENTS PipeServerWrite PlayMedia PlayMidi PlayWaveForm PtrGlobal PtrGlobalDefine PtrGlobalTest PtrPersistent Print Random Registration Database Operations RegApp RegCloseKey RegConnect RegCreateKey RegDeleteKey RegDelValue RegEntryType RegExistKey RegExistValue RegLoadHive RegOpenFlags RegOpenKey RegOpenKeyEx RegQueryBin RegQueryDword RegQueryEx RegQueryExpSz RegQueryItem RegQueryKey RegQueryKeyLastWriteTime RegQueryKeys RegQueryMulSz RegQueryQword RegQueryStr RegQueryValue RegSetBin RegSetDword RegSetEx RegSetExpSz RegSetMulSz RegSetQword RegSetValue RegUnloadHive Reload {*M} Return 459 460 462 462 463 464 465 465 466 467 467 469 470 470 471 472 473 474 477 478 479 479 481 481 483 484 484 485 486 487 488 489 489 490 491 492 493 494 494 495 496 497 498 499 499 500 xi CONTENTS RtStatus Run RunEnviron RunHide RunHideWait RunIcon RunIconWait RunShell RunWait RunWithLogon RunZoom RunZoomWait Select SendKey SendKeysChild SendKeysTo SendMenusTo SendMessageA SendMessageW ShellExecute ShortcutDir ShortcutEdit ShortcutExtra ShortcutInfo ShortcutMake Sin Sinh SnapShot Sounds SoundVolume Sqrt StrByteCount StrCat StrCharCount StrClean StrCmp StrCnt StrFill StrFix StrFixBytes StrFixBytesL StrFixChars StrFixCharsL StrFixLeft StriCmp StrIndex xii 501 502 503 504 505 505 506 507 508 509 513 514 515 516 520 521 522 522 523 524 525 528 529 531 532 533 534 534 536 536 537 537 538 538 539 540 541 542 542 543 544 545 545 546 547 547 CONTENTS StrIndexNc StrIndexWild StrInsert StrLen StrLenWild StrLower StrOverlay StrReplace StrScan StrSub StrSubWild StrTrim StrTypeInfo StrUpper Switch SysParamInfo Tan Tanh Terminate TerminateApp TimeFunctions TimeAdd TimeDate TimeDayofWeek TimeDelay TimeDiff TimeDiffDays TimeDiffSecs TimeJulianDay TimeJulToYmd TimeSubtract TimeWait TimeYmdHms UacElevationLevel UacExePromptTest UacManifestSettings VarType Version VersionDLL WaitForKey WaitForKeyEx WallPaper While WinActivate WinActiveChild WinArrange 548 549 550 550 551 551 552 553 553 555 555 556 556 558 559 560 561 562 562 563 564 565 566 566 567 567 568 569 569 570 571 571 572 572 573 574 574 576 576 577 578 579 580 581 582 582 xiii CONTENTS WinClose WindowOnTop WinExeName WinExist WinExistChild WinGetActive WinHelp WinHide WinIconize WinIdGet WinIsDOS WinItemChild WinItemize WinItemizeEx WinItemNameId WinItemProcId WinMetrics WinName WinParmGet WinParmSet WinPlace WinPlaceChild WinPlaceGet WinPlaceSet WinPosition WinPositionChild WinResources WinShow WinState WinSysInfo WinTitle WinVersion WinWaitChild WinWaitClose WinWaitExist WinWaitReady WinZoom Yield Yields MENU FILES About Menu Files How Menu Files are used Menu File Structure Modifying Menus Menu Hotkeys Menu Items xiv 583 584 584 585 586 587 587 589 590 590 591 592 593 593 594 595 596 599 599 600 601 602 603 604 605 606 606 608 608 609 610 611 613 614 615 615 616 617 617 619 619 619 619 623 623 624 CONTENTS APPENDIX Constants Predefined Constants String Constants Floating Point Constants 626 626 627 627 INDEX 629 xv INTRODUCTION INTRODUCTION What is WIL? The Windows Interface Language (WIL) is an easy-to-use yet very powerful general-purpose programming language with over 500 functions for file management, sending keystrokes, disk drive management, directory management, binary file access, multimedia support, COM/OLE support, clipboard handling, system control, program management, string handling, displaying information, user prompting, window management, floating point & integer arithmetic, execution control and more. Many operations that require pages of code in other programming languages can be accomplished with a single WIL function call. What is WIL good for? Using WIL, you can make small batch files to use as system management utilities. Connecting to network servers, printing batch jobs out at odd hours, upgrading software, and metering application use, are just a few of the chores handled by the system utilities made with WIL. You can also write major business applications. Experience with small utilities encourages the leap to major projects. WIL is the common glue that can bind any off-the-shelf or custom Windows and DOS programs together. Software from any vendor can be combined to make a solution. Automated business solutions save time, save money, and make money for the companies using them to leverage their investment in hardware, software and people. With the WebBatch implementation of WIL, your Windows NT-based web server can process orders, dynamically respond to visitor choices, manage group discussion lists, and publish tech support pages; nearly anything you've seen done on the Internet using Perl or C can often be done much easier and faster using WIL. WIL gives you some very powerful features: Traditional batch-language file management capabilities such as copying files, changing the directory, or launching applications Structured programming, including GOSUB, SWITCH CASE, FOR...NEXT, WHILE...ENDWHILE, IF...ELSE...ENDIF Complete support for user interaction, including standard Windows dialog boxes, check boxes, radio buttons, and file list selectors 17 INTRODUCTION Time and date functions for scheduling operations Send keystrokes and menu commands directly to applications Network support: extenders included for Novell and Win32 Networks Link to Windows Dlls, third party MAPI and TAPI Dlls, or your own C or C++ Dlls Extensive string manipulation, integer and floating point arithmetic, including trig and log functions System control -- read and change system values like the current wallpaper, keyboard repeat rate, etc. Manipulate windows (change their size or location) Control multimedia hardware (sound cards, CD-ROM drives, etc.) Launch a script by clicking an icon in the Explorer or Start Menu Complete binary access to any file Your implementation of WIL may include all of these features and more; see your program's help file for complete details. Products that use WIL WIL is supported by several Wilson WindowWare products, including WinBatch, WinBatch+Compiler, and WebBatch. WIL scripts are written in a plain ASCII text file, which can be created by WinBatch Studio, Notepad or most word processors. These text files can take one of two forms, depending on your particular implementation of WIL: batch files or menu files. Batch Files A batch file is simply a list of WIL commands and function calls, executed in order (just like the old DOS batch language). Menu Files A menu file is similar to a batch file, except that multiple chunks of WIL code are organized into menu and sub-menus, and each routine is launched by pressing the appropriate keystroke or selecting an item from the menu. (The name and location of the menus vary depending on the particular implementation of WIL menu files.) Because WIL can be implemented in many different ways, with several different applications, this manual must at times be somewhat general. Therefore, you will 18 INTRODUCTION need to refer to your application's User's Guide for information on any additional functions which may be available, as well as functions which may be unavailable or which may operate differently than presented here. In all cases, your product-specific documentation and help files supersedes the information provided in this Reference Manual. Batch file implementations of WIL WinBatch WinBatch+Compiler WebBatch Clock Manager Menu file implementations of WIL WinBatch Studio PopMenu (a utility included with WinBatch) FileMenu (a utility included with WinBatch) Some features aren't appropriate for a particular implementation; for example, WebBatch doesn't include any window-management functions, but it has many functions that are only appropriate in a web server environment. The following symbols will be used to indicate a function or a section of the manual which applies only to a specific implementation of the WIL Interpreter. {*Explorer} For use with the Microsoft Explorer. {*M} menu-based implementations of WIL Interpreter. Notational Conventions Throughout this manual, we use the following conventions to distinguish elements of text: Boldface Used for important points, programs, function names, and parts of syntax that must appear as shown. system Used for items in menus and dialogs, as they appear to the user. Small fixed-width Used for WIL sample code. Italics Used for emphasis, and to liven up the documentation just a bit. 19 INTRODUCTION Acknowledgments WIL software developed by Morrie Wilson, Richard Merit and Tony Deets. Documentation written by Richard Merit, Morrie Wilson, Jim Stiles, Liv Browning, Laura Plaut and Deana Falk. 20 WIL TUTORIAL WIL TUTORIAL Creating WIL Scripts Files WIL is a script file interpreter. Before you can do anything useful with the WIL interpreter, you must have at least one WIL script file to interpret. Your program installation puts several sample scripts into a "samples" directory. Sample scripts are located in a "samples" subdirectory in the WinBatch directory. WIL script files must be formatted as plain ASCII text files. You can create them with WinBatch Studio, the Windows Notepad or another text editor. Word processors like WordPerfect, WordPro, and Microsoft Word can also save scripts in plain text files. The .WBT (WinBatch) extension is used in this manual for batch file extensions, but, you can use others just as well. If you want to click on a batch file and have Windows run it, be sure that you associate it in Windows with your executable program file. When you installed your program, an association was automatically established between the interpreter (WinBatch.exe) and .WBT files. Each line in a script file contains a statement written in WIL, Wilson WindowWare's Windows Interface Language. A statement can be a maximum of 2048 characters long (refer to WIL Function Reference, pg. 85, for information on the commands). Indentation does not matter. A statement can contain functions, commands, and comments. You can give each script file a name which has an extension of WBT (e.g. TEST.WBT). We'll use the terms WinBatch script files and WBT files interchangeably. Running WIL Utilities WIL system utilities are very versatile. They can be run from: icons in the Windows Explorer. 21 WIL TUTORIAL from macros in word processors and spreadsheets. from a command line entry such as "Run..." from the Explorer Start button. by double clicking. from menu items via the FileMenu and PopMenu utilities. from other WIL scripts to serve as single or multiple "agents", event handlers, or schedulers. from any Windows application or application macro language that can execute another Windows program. Software suite macro languages and application builders like Visual Basic and PowerBuilder are examples of these. Command Line Parameters WIL utilities run like any other Windows program. They can be run from a command line, a shortcut or an icon in a shell program like the Windows Explorer, or a Start menu selection. WIL utilities are usually run as files with the extension .WBT. When some WIL utilities are used, they need information passed to them when they run. This is easily done by passing command line parameters to them. This capability can be used from the command line in the Start|Run menu. Parameters can be also be passed through the command line entry included in the item properties of any shortcut icon. Finally, an application can send parameters to a WIL utility it launches from a command line or from a function in a macro language. A command like this runs a WinBatch system utility from a command line or a shortcut icon. command line: Winbatch.exe filename.wbt p1 p2... p[n] This command line can be entered into a Command Line text entry box like this one: 22 WIL TUTORIAL "filename.wbt" is any valid WBT file, and is a required parameter. "p1 p2 ... p[n]" are optional parameters to be passed to the WBT file on startup. Each is delimited from the next by one space character. Parameters passed to a WBT file will be automatically inserted into variables named param1, param2, etc. The WinBatch utility will be able to use these. An additional variable, param0, gives you the total number of command-line parameters. What is a WIL Program? A WIL program, like a DOS batch file, is simply a list of commands for the computer to process. Any task which will be run more than once, or which requires entering multiple commands or even a single complex command, is a good candidate for automation as a WIL program. For example, suppose you regularly enter the following commands to start Windows: First: cd \windows then: win and then: cd \ Here, you are changing to the Windows directory, running Windows, and then returning to the root directory. Instead of having to type these three commands every time you run Windows, you can create a DOS batch file, called WI.BAT, which contains those exact same commands: 23 WIL TUTORIAL cd \windows win cd \ Now, to start Windows, you merely need to type the single command WI, which runs the WI.BAT batch file, which executes your three commands. WIL programs work basically the same way. Our First WIL Program Tutor Example 1. Open an editor, such as WinBatch Studio. 2. Type the line. 3. Save the program with a proper extension. (in WinBatch, this extension will be .WBT.) Name it 'tutor.wbt'. 4. Run tutor.wbt by double-clicking on the filename. Our first WIL program will simply run our favorite Windows application: Solitaire. If you are using a menu script-based implementation of the WIL Interpreter, refer to the section on Menu Files (pg. 619) for instructions on how to create and edit WIL menu items. If you are using a batch file-based implementation of the WIL Interpreter, you will be creating your batch files using an editor, such as WinBatch Studio, that is capable of saving text in pure ASCII format. In either case, let's create a WIL program containing the following line of text: Run("sol.exe", "") Save the program, and run it (refer to your product documentation, the User's Guide, for information on how to execute a WIL program). Presto! It's Solitaire. Functions and Parameters Now, let's look more closely at the line we entered: Run("sol.exe", "") The first part, Run, is a WIL function. As you might have guessed, its purpose is to run a Windows program. There are a 24 WIL TUTORIAL large number of functions and commands in WIL, and each has a certain syntax which must be used. The correct syntax for all WIL functions may be found in the WIL Function Reference (pg. 85). The entry for Run starts off as follows: Syntax: Run (program-name, parameters) Parameters: (s) program-name the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. (s) parameters optional parameters as required by the application. Like all WIL functions, Run is followed by a number of parameters, enclosed in parentheses. Parameters are simply additional pieces of information which are provided when a particular function is used; they may be either required or optional. Optional parameters are indicated by being enclosed in square brackets. In this case, Run has two required parameters: the name of the program to run, and the arguments to be passed to the program. WIL functions use several types of parameters. Multiple parameters are separated by commas. In the example Run("sol.exe", "") Notes: 1. Strings are delimited by quotes, ("", "") 2. '(s)' denotes the parameter requires a string. "sol.exe" and "" are both string constants. String constants can be identified by the quote marks which delimit (surround) them. You may use either double ("), single forward (') or single back (`) quote marks as string delimiters; the examples in this manual will use double quotes. In our shorthand method for indicating syntax the (s) in front of a parameter indicates that it is a string parameter. You may have noticed how we said earlier that the two parameters for the Run function are required, and yet the entry for Run in the WIL Function Reference describes the second parameter — "parameters" — as being optional. Which is correct? Well, from a WIL language standpoint, the second parameter is required. That is, if you omit it, you will get a syntax error, and your WIL program will halt. However, the program that you are running may not need parameters. Solitaire, for example, does not take parameters. The way we 25 WIL TUTORIAL handle this in our programs is to specify a null string — two quote marks with nothing in between — as the second parameter, as we have done in our example above. To illustrate this further, let's create a WIL program containing the following line: Run("notepad.exe", "") Example 2 1. Open Notepad. 2. Type in the line. 3. Save the file as notetest.wbt. 4. Close Notepad 5. Run the wbt by double-clicking on the filename. This is just like our previous file, with only the name of the program having been changed. Save the file, and run it. Is Notepad running? If it is - good. If not, check your script. WinBatch will look for Notepad.exe on the computer's search path. If it isn't there, you may need to locate it with the Windows Explorer. Add a complete pathname to the run statement and the script should work. Now, edit the WIL program as follows: Run("notepad.exe", "c:\autoexec.bat") Save the program and run the WIL program again. You should now be in Notepad, with AUTOEXEC.BAT loaded. As we've just demonstrated, Notepad is an example of a program which can be run with or without a file name parameter passed to it by WIL. It can often be helpful to add descriptive text to your WIL programs: ; This is an example of the Run function in WIL Run("notepad.exe", "c:\autoexec.bat") Note: semi-colons denote comments. The semi-colon at the beginning of the first line signifies a comment, and causes that line to be ignored. You can place comment lines, and/or blank lines anywhere in your WIL programs. In addition, you can place a comment on the same line as a WIL statement by preceding the comment with a semicolon. For example: Run("sol.exe", "") ;this is a very useful function Everything to the right of a semi-colon is ignored. However, if a semi-colon appears in a string delimited by quotes, it is treated as part of the string. 26 WIL TUTORIAL Displaying Text Now, let's modify our original WIL program as follows: ; solitare.program Display(5,"Good Luck!","Remember … it's only a game") Run("sol.exe", "") Tutor Example continued... And run it. Notice the little dialog box which pops up on the screen with words of encouragement: 1. Exit Solitaire. 2. Activate or open your editor. 3. Load tutor.wbt. 4. Add the new lines. 5. Save the file. 6. Run the wbt by double-clicking on the filename. That's done by the Display function in the second line above. Here's the reference for Display: Syntax: Display (seconds, title, text) Parameters: (i) seconds (s) title (s) text seconds to display the message (1-3600). Title of the window to be displayed. Text of the window to be displayed. The Display function has three parameters. The first parameter is the number of seconds which the display box will remain on the screen (you can make the box disappear before then by pressing any key or mouse button). This is a numeric constant, and — unlike string constants — it does not need to be enclosed in quotes (although it can be, if you wish, as WIL will automatically try to convert string variables to numeric variables when necessary, and vice versa). In our example above, we are displaying the box for 5 seconds. The second parameter is the title of the message box, and the third parameter is the actual text displayed in the box. Note: In our shorthand method for indicating syntax the (s) in front of a parameter indicates that it is a string. An (i) indicates that it is an integer, (f) indicates a floating point number parameter, (a) indicates an array, (r) indicates a COM object reference and (t) indicates special type information described in the function’s text. 27 WIL TUTORIAL Tutor Example continued... 1. Exit Solitaire. 2. Edit tutor.wbt Comment out the Run statement. 3. Save the file. 4. Run the wbt by double-clicking on the filename. Now, exit Solitaire (if you haven't done so already), and edit the WIL program by placing a semi-colon at the beginning of the line with the Run function. This is a handy way to disable, or "comment out," lines in your WIL programs when you want to modify and test only certain segments. Your WIL program should look like this: ; solitare.program Display(5,"Good Luck","Remember … it's only a game") ; Run("sol.exe", "") Feel free to experiment with modifying the parameters in the Display function. Try adjusting the value of the first parameter. If you look up Display in the WIL reference section, you will see that the acceptable values for this parameter are 1-3600. If you use a value outside this range, WIL will adjust it to "make it fit"; that is, it will treat numbers less than 1 as if they were 1, and numbers greater than 3600 as 3600. Also, try using a non-integer value, such as 2.9, and see what happens (it will be converted to an integer). Play around with the text in the two string parameters; try making one, or both, null strings (""). User Input Now, let's look at ways of getting input from a user and making decisions based on that input. The most basic form of input is a simple Yes/No response, and, indeed, there is a WIL function called AskYesNo: Syntax: AskYesNo (title, question) Parameters (s) title (s) question Returns: (i) title of the question box. question to be put to the user. @YES or @NO, depending on the button pressed. You should be familiar with the standard syntax format by now; it shows us that AskYesNo has two required parameters. The Parameters section tells us that these parameters both take strings, and tells us what each of the parameters means. You will notice that there is also a new section here, called 28 WIL TUTORIAL Returns. This section shows you the possible values that may be returned by this function. All functions return values. We weren't concerned with the values returned by the Run and Display functions. But with AskYesNo, the returned value is very important, because we will need that information to decide how to proceed. We see that AskYesNo returns an integer value. The integer value returned by AskYesNo is either 1 or 0. The equivalent predefined constants are @YES or @NO, @TRUE or @FALSE. You can test for any of these. They are equivalent. Therefore an integer is a whole (non-fractional) number, such as 0, 1, or 2 (the number 1.5 is not an integer, it is a floating point number). We also see that the integer value returned by AskYesNo is either @YES or @NO. @YES and @NO are predefined constants in WIL. All predefined constants begin with an @ symbol. You will find a list of all predefined constants in the Appendix (pg.626). Even though the words Yes and No are strings, it is important to remember that the predefined constants @YES and @NO are not string variables. (Actually, @YES is equal to 1, and @NO is equal to 0. Don't worry if this is confusing; you really don't need to remember or even understand it.) Now, let's modify our WIL program as follows: AskYesNo("Really?", "Play Solitaire now?") Run("sol.exe", "") Tutor Example continued... and run it. You should have gotten a nice dialog box which asked if you wanted to play Solitaire: 1. Edit tutor.wbt Delete the Display statement. Add AskYesNo statement. Delete semi-colon from the Run. 2. Save the file. 3. Run the wbt by double-clicking on the filename. but no matter what you answered, it started Solitaire anyway. This is not very useful. We need a way to use the Yes/No response to determine further processing. First, we need to 29 WIL TUTORIAL explore the concept and use of variables. Using Variables A variable is simply a placeholder for a value. The value that the variable stands for can be either a text string (string variable) or a number (numeric variable). Tutor Example continued... 1. Exit Solitaire. 2. Edit tutor.wbt Add variable name. 3. Save the file. 4. Run the wbt by double-clicking on the filename. You may remember from Algebra 101 that if X=3, then X+X=6. X is simply a numeric variable, which stands here for the number 3. If we change the value of X to 4 (X=4), then the expression X+X is now equal to 8. Okay. We know that the AskYesNo function returns a value of either @YES or @NO. What we need to do is create a variable to store the value that AskYesNo returns, so that we can use it later on in our WIL program. First, we need to give this variable a name. In WIL, variable names must begin with a letter, may contain any combination of letters or numbers, and may be from 1 to 30 characters long. So, let's use a variable called response. (We will distinguish variable names in this text by printing them in all lowercase letters; we will print function and command names starting with a capital letter. However, in WIL, the case is not significant, so you can use all lowercase, or all uppercase, or whatever combination you prefer.) We assign the value returned by AskYesNo to the variable response, as follows: response=AskYesNo("Really?", "Play Solitaire now?") Notice the syntax. The way that WIL processes this line is to first evaluate the result of the AskYesNo function. The function returns a value of either @YES or @NO. Then, WIL assigns this returned value to response. Therefore, response is now equal to either @YES or @NO, depending on what the user enters. Now, we need a way to make a decision based upon this variable. 30 WIL TUTORIAL Making Decisions WIL provides a way to conditionally execute a statement, and that is by using the If ... Endif command. Actually, there are several forms of the If statement -- the structured form and the single statement form. Structured Forms If expression series of statements Endif If expression series of statements Else series of statements Endif Single Statement Forms If expression Then statement. If expression Then statement Else statement (We refer to If ... Endif as a command, rather than a function, because functions are followed by parameters in parentheses, while commands are not. Commands tend to be used to control the flow of execution within the WIL Interpreter.) Tutor Example continued... 1. Exit Solitaire. 2. Edit tutor.wbt Add If/Endif command to check return of the variable. 3. Save the file. 4. Run the wbt by double-clicking on the filename. Experiment with The use of If ... Endif can easily be illustrated by going back to our WIL program and making these modifications: response=AskYesNo("Really?", "Play Solitaire now?") If response == @YES Run("sol.exe", "") Endif However, as this example is a single statement, rather than a series of statements, the single statement structure is more appropriate. There are generally many different ways to perform any task in WIL. With experience you will be able to decide the best way to do any task. response=AskYesNo("Really?", "Play Solitaire now?") If response == @YES Then Run("sol.exe", "") In this example, we are using If ... Then to test whether the 31 WIL TUTORIAL additional If structures. value of the variable response is @YES. If it is @YES, we start Solitaire. If it isn't @YES, we don't. The rule is: if the condition following the If keyword is true or works out to a non-zero value, then the statement(s) following are performed. If the condition following the If keyword is false or works out to a zero value, then the statement(s) following are ignored. There is something extremely important that you should note about the syntax of these If ... Endif commands: the double equal signs (==). In WIL, a single equal sign (=) is an assignment operator — it assigns the value on the right of the equal sign to the variable on the left of the equal sign. As in: response=AskYesNo("Really?", "Play Solitaire now?") This is saying, in English: "Assign the value returned by the AskYesNo function to the variable named response." But in the statement: If response == @YES Then Run("sol.exe", "") we do not want to assign a new value to response, we merely want to test whether it is equal to @YES. Therefore, we use the double equal signs (==), which is the equality operator in WIL. The statement above is saying, in English: "If the value of the variable named response is equal to @YES, then run the program SOL.EXE." If you used a single equal sign (=) here by mistake, you would get an error message: 32 WIL TUTORIAL Note: (=) this IS that (==) this EQUALS that Which is WIL's way of telling you to re-check your syntax. If you've become confused, just remember that a single equal sign (=) is an assignment operator, used to assign a value to a variable. Double equal signs (==) are an equality operator, used to test whether the values on both sides of the operator are the same. If you have a problem with one of your WIL programs, make sure to check whether you've used one of these symbols incorrectly. It's a very common mistake, which is why we emphasize it so strongly! We've seen what happens when the statement(s) following the If condition are true. But what happens when the condition is false? Remember we said that when the If condition is false, the following statement(s) are ignored. There will be times, however when we want to perform an alternate action in this circumstance. For example, suppose we want to display a message if the user decides that he or she doesn't want to play Solitaire. We could write: response=AskYesNo("Really?","Play Solitaire now?") If response == @YES Run("sol.exe", "") Else Display(5, "", "Game canceled") Endif Using the single statement If...Then...Else structure the same code would look like: response=AskYesNo("Really?", "Play Solitaire now?") If response == @YES Then Run("sol.exe", "") Else Display(5, "", "Game canceled") When you have only single statements to execute when conditions are true or false, the single statement form may be preferred. However, what would happen if you had several functions you wanted to perform if the user answered Yes? You would end up with something unwieldy: response=AskYesNo("Really?", "Play Solitaire now?") If response==@YES Then Display(5,"","On your mark") If response==@YES Then Display(5,"", "Get set ...") If response==@YES Then Display(5, "", "Go!") If response==@YES Then Run("sol.exe", "") If response==@NO Then Display(5,"","Game canceled") 33 WIL TUTORIAL Clearly, the best way of handling this is to use the If... Else... Endif structured form. response=AskYesNo("Really?", "Play Solitaire now?") If response == @YES Display(5, "", "On your mark ...") Display(5, "", "Get set ...") Display(5, "", "Go!") Run("sol.exe", "") Else Display(5, "", "Game canceled") Endif Control of Program Flow The linear flow of statements (executing one statement after another) is not always preferred or possible. WIL provides the standard set of flow control commands: For, While, Switch and GoSub. These commands give you the ability to redirect the flow of control in your programs. The For command controls the looping of a block of code based on an incrementing index. The While command conditionally and/or repeatedly executes a series of statements. The Switch statement allows selection among multiple blocks of statements. GoSub transfers control to another point in the WIL program and saves the location for a Return statement. Let’s explore the use of these commands further. Perhaps you need to break your Solitaire habit by limiting your time of play (it has, by now, become obvious to your boss and co-workers that, ever since you got this program, all you do is play Solitaire). First you need to ask yourself how long you would like to play by adding the following line to the top of your script. mins=AskLine("Solitaire","How many mins do you want to play?","", 0) This will display a message box which prompts you for the number of minutes you would like to play. Tutor Example continued... 34 Once you enter the desired number of minutes, you could display an additional message as a response to the specific amount of time entered. WIL TUTORIAL 1. Exit Solitaire. (If it is running.) 2. Edit tutor.wbt Add AskLine to the top of the script.Save the file. 3. Run the wbt by double-clicking on the filename. Switch, as you remember, allows selection from among multiple blocks of statements. Each block of statements is called a case. In the following sample, there are several case statement blocks. Selection of one of the cases is determined by the number of minutes stored in the variable mins. If the number is 3, then case 3 will be executed. All numbers not accounted for will be executed by the default case, mins. Type the following code into tutor.wbt. Test the Switch statement by entering a number into the AskLine dialog box. Try running it several times using various numbers. 1. Exit Solitaire. 2. Edit tutor.wbt to add the Switch statement. Your code should look like the following. Remove extra statements. mins = AskLine("Solitaire","How many mins do you want to play?","",0) mins = Int(mins) Switch mins case 0 Display(5, "", "Game canceled") exit break case 1 Message("Only a minute?", "Wow! You've got willpower.") break case 2 Message("2 Minutes?", "This isn't much of a break.") break case 3 Message("3 Minutes?", "You've barely got time to shuffle") break case 4 Message("HA,HA,HA", break "I dare you to try to beat me.") 35 WIL TUTORIAL case mins ;default case - must be last in the switch Message("THAT LONG!!!", "Where did you get all that time?") break EndSwitch Run("sol.exe", "") In our example, each case statement block is composed of three parts; a case statement followed by a number, a series of one or more statements and the break command. If the number behind the case statement matches the number behind the switch statement, then the case block is executed. Once the correct message has been displayed, break terminates the case block and transfers control to the EndSwitch statement. Now we need to create a timer to track the time elapsed and compare it to the time entered. The While command, which repeats execution of a series of statements by telling WIL, "Do the following while a condition is present," does this job nicely. First let’s set up a couple of variables. goal = mins * 60 timer = 0 Tutor Example continued... 1. Exit Solitaire. 2. Edit tutor.wbt Set up variables. Add the timing code below the Run statement. 3. Save the file. 4. Run the wbt by double-clicking on the filename. Now for the While statement. The first line sets the condition, "While the timer is less than the goal execute this series of statements." While timer < goal remain = goal - timer WinTitle("Solitaire","Solitaire (%remain% seconds left)") TimeDelay(10) timer = timer + 10 EndWhile The rest of our series of statements include: a computation of the time remaining (remain) to be displayed, a line to display the time remaining in the Solitaire window title bar, a TimeDelay statement to allow time to pass, and a statement to calculate the time elapsed. EndWhile marks the end of statements. WIL marches through the While loop until the variable timer exceeds the value of the variable goal. So what happens if suddenly your time is up and you’re four moves away from winning? Can’t have that happening. 36 WIL TUTORIAL We can give ourselves the opportunity to add more time by adding another Askline statement. mins=AskLine("More Time?","Enter additional minutes.", 0, 0) Tutor Example continued... 1. Exit Solitaire. 2. Edit tutor.wbt Add new line to bottom of script. 3. Save the file. 4. Run the wbt by double-clicking on the filename. If a time is entered the timer will need to be used again. Of course, it would be easy to copy that portion of the script and insert it after the new line. However, the same script can be utilized with the assistance of GoSub. GoSub causes the flow of control to go to another point in the WIL program while remembering its point of origin. The name GoSub is an abbreviation of "Go To Subroutine". You must specify where you want the flow of control to be transferred -the subroutine name, and you must mark this point with a label. A label is simply a destination address, or marker. The form of the GoSub command is: GoSub label where label is an identifier that you specify. (the first character must be a letter, the label name may consist of any combination of letters and numbers, and the label name may be up to 249 characters long). In addition, the label is preceded by a colon (:) at the point where it is being used as a destination address. "WaterHazard" Tutor Example continued... 1. Exit Solitaire. 2. Edit tutor.wbt Add :dumdedum label to bottom. Move timing loop below label. Add Return after loop. After Run statement add GoSub dumdedum. 3. Save the file. 4. Run the wbt by In our sample script, we move the timing loop to the bottom of the script, add a label marked :dumdedum above the timing script as the destination address. After EndWhile, add the statement, Return to allow the flow of control to return from the bottom of the GoSub. We’ll add a GoSub statement in after the Run statement. The GoSub statement is saying, in English "go to the line marked :dumdedum, and continue processing from there, but remember where you came from." When Return is reached, control will be transferred back to the statement after the original GoSub. Notice that the label dumdedum is preceded by a colon as the address, but not on the line where it follows the GoSub keyword. This is important. Although you can have multiple lines in your WIL program which say GoSub dumdedum, you can have only one line marked :dumdedum (just like you can have several people going to your house, but can have only one house with a particular address). Of course, you can use many different labels in a WIL program, just as you can use many different variables, as long as each has a unique name. 37 WIL TUTORIAL double-clicking on the filename. Tutor Example continued... 1. Exit Solitaire. 2. Edit tutor.wbt -Add check for return of AskLine. Add WinClose and Exit. (See code below) 3. Save the file. 4. Run the wbt by double-clicking on the filename. In addition to changing the message displayed in the "mins=AskLine" statement, a default time has been added. The value returned will need to be checked. In the example below, "!=" signifies "not equal to". Therefore the line reads, "If mins is not equal to zero then GoSub dumdedum." If mins!=0 then GoSub dumdedum If a time is returned, GoSub will send execution to the :dumdedum label and the waiting process will begin again. After the time has elapsed, control will be returned to the statement following the GoSub. The last thing we want to do is end the program with the WinClose function and display a final message. The Exit command is used to keep the processing from "falling through" to the subroutine at the end of the program. In this case, the dumdedum subroutine sits at the end. Exit causes a WIL program to end immediately and not fall into the dumdedum loop. Script Stop Our altered script has the following appearance from the Run statement to the bottom. Run("sol.exe", "") GoSub dumdedum mins=AskLine("More Time?", "Enter additional minutes", 0, 0) If mins!=0 then GoSub dumdedum WinClose("Solitaire") Message("Time's Up", "Get Back to Work!") Exit :dumdedum goal = mins * 60 timer = 0 While timer < goal remain = goal - timer WinTitle("Solitaire", "Solitaire (%remain% seconds left)") TimeDelay(10) timer = timer + 10 EndWhile Return 38 WIL TUTORIAL The sample script could be considered complete at this point. However, the For command has yet to be discussed. The For command is more complex than the previous commands. It controls the looping of a block of code based on an incrementing index. This command is handy if you want to perform a specific code block a particular number of times. The statement says, "Repeat the block of code for each value of a variable from the initial value to the final value, incrementing the variable after each pass of the loop" . In the sample below, the size of the Solitaire window is manipulated and displayed 10 times before the window is zoomed to full screen. Each time the loop is executed, the coordinate and size variables (j and k) are altered, and then used in a WinPlace statement ( it's time to start looking up functions in the reference yourself now) to affect the position and size of the Solitaire window. Run("sol.exe","") Tutor Example continued... 1. Edit tutor.wbt Add code for the For statement directly after the Run statement. 2. Save the file. 3. Run the wbt by double-clicking on the filename. for i = 0 to 9 j=100-i*10 k=300+i*70 WinPlace(j,j,k,k, "Solitaire") next WinZoom("Solitaire") Note: the case of the window title 'Solitaire' is important. If Solitaire is spelled with a lower case 's', the program will not work. This concludes the first part of our tutorial. You now have the building blocks you need to create useful WIL programs. In the second part, which follows, we will look in more detail at some of the WIL functions which are available for your use. See the Completed WIL file, tutor.wbt, at the end of the WIL TUTORIAL (pg. 60). Exploring WIL If you take a moment and flip through the WIL Function Reference that takes up most of the back of this manual, you will notice that WIL uses a very convenient naming convention. WIL functions are named so that the object affected by the function is the first word in the function name -- any function dealing with Files 39 WIL TUTORIAL starts with the word "File", and they can be found clumped together in the alphabetically arranged function reference. If you think you might want a function dealing with DDE, simply flip open the manual to the DDE section and scan the available functions. What follows is just quick overview of the many functions and commands available in WIL. These should be sufficient to begin creating versatile and powerful WIL programs. For complete information on these and all WIL functions and commands, refer to the WIL Function Reference (pg. 85). Running Programs There are several functions that you can use to start an application, most of which share a common syntax. 32 bit Windows platforms can use file names with embedded spaces. WIL understands long filenames, however if a long filename with spaces must be passed as an argument use quotation marks like this: Run( 'My Program' , '"C:\program files\path"' ) Notice: the use of single quotation marks outside of the double quotation marks. Run (program-name, parameters) We've already seen the Run function. This function starts a program in a "normal" window. Windows, or the application itself, decides where to place the application's window on the screen. Example: Run("notepad.exe", "myfile.txt") If the program has an EXE extension, its extension may be omitted: Run("notepad", "myfile.txt") Also, you can "run" data files if they have an extension in the Registry which is associated with an executable program. So, if TXT files are associated with Notepad: Run("myfile.txt", "") would start Notepad, using the file MYFILE.TXT. When you specify a file to run, WIL looks first in the current directory, and then in the directories on your system path. If the file is not found, WIL will return an error. You can also specify a full path name for WIL to use, as in: Run("c:\windows\notepad.exe", "") RunZoom (program-name, parameters) RunZoom is like Run, but starts a program as a full-screen window. 40 WIL TUTORIAL Example: RunZoom("excel", "bigsheet.xls") RunIcon (program-name, parameters) RunIcon starts a program as an icon at the bottom of the screen or in the Windows Taskbar. Example: RunIcon("notepad", "") All these Run functions simply launch the program and continue with WIL processing. If you need to wait until the program exits before continuing, then there are a number of other suitable functions also available. RunWithLogon(program-name, params, directory, display mode, waitflag, username, domain, password, logon-flags) Runs a program as a specified user. RunWait (program-name, parameters) RunWait starts a program and waits for it to exit before continuing. This is often required when the "program" is a DOS batch file. RunZoomWait (program-name, parameters) RunZoomWait starts a program as a full screen window and waits for it to exit before continuing. RunIconWait (program-name, parameters) RunIconWait starts a program as an icon at the bottom of the screen and waits for it to exit before continuing. If all these Run functions are too much for you, there is also the combination RunShell function, which combines all the capabilities of the Run functions and adds additional functionality. RunShell (program-name,parameters,target dir,view,waitflag) RunShell is an advanced form of the Run function that even allows the specification of a target/current working directory, along with the window view mode and whether or not to wait for completion of the run program in a single function. ShellExecute (program-name,parameters,target dir, display mode, operation) Runs a program via the Windows ShellExecute command. 41 WIL TUTORIAL Display and Input Here we have functions which display information to the user and prompt the user for information, plus a couple of relevant system functions. Display (seconds, title, text) Displays a message to the user for a specified period of time. The message will disappear after the time expires, or after any keypress or mouse click. Example: Display(2, "Please Wait", "Loading Solitaire Now") Message (title, text) This command displays a message box with a title and text you specify, which will remain on the screen until the user presses the OK button. Example: Message("Sorry", "That file cannot be found") Pause (title, text) This command is similar to Message, except an exclamation-point icon appears in the message box, and the user can press OK or Cancel. If the user presses Cancel, the WIL program ends (or goes to the label :cancel, if one is defined). Example: Pause("Delete Backups", "Last chance to stop!") ; if we got this far, the user pressed OK FileDelete("*.bak") 42 WIL TUTORIAL AskYesNo (title, question) Displays a dialog box with a given title, which presents the user with three buttons: Yes, No, and Cancel. If the user presses Cancel, the WIL program ends (or goes to the label :cancel, if one is defined). Otherwise, the function returns a value of @YES or @NO. See THINGS TO KNOW, (pg. 63) for more information on Cancel. Example: response = AskYesNo("End Session", "Really quit Windows?") AskLine (title, prompt, default, [format])) Displays a dialog box with a given title, which prompts the user for a line of input. Returns the default if the user just presses the OK button. Example: yourfile = AskLine("Edit File", "Filename:", "newfile.txt",0) Run("notepad", yourfile) 43 WIL TUTORIAL If you specify a default value (as we have with NEWFILE.TXT), it will appear in the response box, and will be replaced with whatever the user types. If the user doesn't type anything, the default is used. Beep Beeps once. Beep And if one beep isn't enough for you: Beep Beep Beep TimeDelay (seconds) Pauses WIL program execution. The TimeDelay function lets you suspend processing for a fixed period of time, which can be anywhere from 1 to 3600 seconds. Manipulating Windows There are a large number of functions which allow you to manage the windows on your desktop. Here are some of them: WinZoom (partial-windowname) Maximizes an application window to full-screen. WinIconize (partial-windowname) Turns an application window into an icon. WinShow (partial-windowname) Shows a window in its "normal" state. These three functions are used to modify the size of an already-running window. WinZoom is the equivalent of selecting Maximize from a window's control menu, WinIconize is like selecting Minimize, and WinShow is like selecting Restore. The window on which you are performing any of these functions does not have to be the active window. If the specified window is in the background, and a WinZoom or WinShow function causes the size of the window to change, then the window will be brought to the foreground. The WinZoom function has no effect on a window which is already maximized; likewise, WinShow has no effect on a window which is already "normal." 44 WIL TUTORIAL Each of these functions accepts a partial window name (pg.67) as a parameter. The windowname is the name which appears in the title bar at the top of the window. You can specify the full name if you wish, but it may often be advantageous not to have to do so. For example, if you are editing the file SOLITARE.WBT in a Notepad window, the windowname will be Solitaire.wbt - Notepad. You probably don't want to have to hard-code this entire name into your WIL program as: WinZoom("Solitaire.wbt - Notepad") Instead, you can specify the partial windowname "Notepad": WinZoom("~Notepad") Note: the tilde '~' character used in this statement, tells the script to search anywhere in the window title for the word 'Notepad'. For more information on partial window names see page 67. If you have more than one Notepad window open, WIL will use the one which was most recently used or started. Note that WIL matches the partial windowname beginning with the first character, so that while WinZoom("Sol") would be correct, WinZoom("Notepad") would not result in a match. Also, the case (upper or lower) of the title is significant, so WinZoom("solitare") 45 WIL TUTORIAL would not work either. WinActivate (partial-windowname) Makes an application window the active window. This function makes a currently-open window the active window. If the specified window is an icon, it will be restored to normal size; otherwise, its size will not be changed. WinClose (partial-windowname) Closes an application window. This is like selecting Close from an application's control menu. You will still receive any closing message(s) that the application would normally give you, such as an "unsaved-file" dialog box. WinExist (partial-windowname) Tells if a window exists. This function returns @TRUE or @FALSE, depending on whether a matching window can be found. This provides a way of insuring that only one copy of a given window will be open at a time. If you've been following this tutorial faithfully from the beginning, you probably have several copies of Solitaire running at the moment. (You can check by pressing Alt-Tab see how many instance are open. You say you've got five Solitaire windows open? Okay, close them all). Now, let's modify our WIL program. First, trim out the excess lines so that it looks like this: Run("sol.exe", "") Now, let's use the WinExist function to make sure that the WIL program only starts Solitaire if it isn't already running: If WinExist("~Solitaire") == @FALSE Then Run("sol.exe", "") Note: the tilde '~' character used in the WinExist statement, tells WinExist to search anywhere in the window title for the word 'Solitaire'. For more information on partial window names see page 67. And this should work fine. Run the WIL program twice now, and see what happens. The first time you run it, it should start Solitaire; the second (and subsequent) time, it should not do anything. However, it's quite likely that you want the WIL program to do something if Solitaire is already running — namely, bring the Solitaire window to the foreground. This can be accomplished by using the WinActivate function as follows: 46 WIL TUTORIAL If WinExist("~Solitaire") == @TRUE WinActivate("Solitaire") Else Run("sol.exe", "") Endif Note that we can change this to have WinExist check for a False value instead, by modifying the structure of the WIL program: If WinExist("~Solitaire") == @FALSE Run("sol.exe", "") Else WinActivate("~Solitaire") Endif Either format is perfectly correct, and the choice of which to use is merely a matter of personal style. The result is exactly the same. EndSession ( ) Ends the current Windows session. This does exactly what it says. It will not ask any questions (although you will receive any closing messages that your currently-open windows would normally display), so you may want to build in a little safety net: sure = AskYesNo("End Session", "Really quit Windows?") If sure == @YES Then EndSession( ) EndSession is an example of a WIL function which does not take any parameters, as indicated by the empty parentheses which follow it. The parentheses are still required, though. Note: For additional methods of rebooting or restarting Windows, see IntControl(66,…) , IntControl(67,…) and IntControl(68,…). Files and Directories DirChange (pathname) Changes the directory to the pathname specified. Use this function when you want to run a program which must be started from its own directory. "Pathname" may optionally include a drive letter Example: DirChange("c:\windows\winword") Run("winword.exe", "") 47 WIL TUTORIAL DirGet ( ) Gets the current working directory. This function is especially useful in conjunction with DirChange, to save and then return to the current directory. Example: origdir = DirGet( ) DirChange("c:\windows\winword") Run("winword.exe", "") DirChange(origdir) FileCopy (source-list, destination, warning) Copies files. If warning is @TRUE, WIL will pop up a dialog box warning you if you are about to overwrite an existing file, and giving you an opportunity to change your mind, along with selecting various options for copying the files. If warning is @FALSE, it will overwrite existing files with no warning. Example: FileCopy("win.ini", "*.sav", @TRUE) Run("notepad.exe", "win.ini") The asterisk (*) is a wildcard character, which matches any letter or group of letters in a file name. In this case, it will cause WIN.INI to be copied as WIN.SAV. FileDelete (file-list) Deletes files. Example: If FileExist("win.bak") == @TRUE Then FileDelete("win.bak") FileExist (filename) Determines if a file exists. This function will return @TRUE if the specified file exists, @FALSE if it doesn't exist, and the value 2 if the file is in read-deny mode. Example: If FileExist("win.bak") == @FALSE FileCopy("win.ini", "win.bak", @FALSE) endif Run("notepad.exe", "win.ini") 48 WIL TUTORIAL FileRename (source-list, destination) Renames files to another set of names. We can illustrate the use of these WIL program functions with a typical WIL application. Let's suppose that our word processor saves a backup copy of each document, with a BAK extension, but we want a larger safety net when editing important files. We want to keep the five most recent versions of the wonderful software manual we're writing. Here's a WIL program to accomplish this: If FileExist("wil.bak") == @TRUE FileDelete("wil.bk5") FileRename("wil.bk4", "wil.bk5") FileRename("wil.bk3", "wil.bk4") FileRename("wil.bk2", "wil.bk3") FileRename("wil.bk1", "wil.bk2") FileRename("wil.bak", "wil.bk1") Endif Run("winword.exe", "wil.doc") Exit If the file WIL.BAK exists, it means that we have made a change to WIL.DOC. So, before we start editing, we delete the oldest backup copy, and perform several FileRename functions, until eventually WIL.BAK becomes WIL.BK1. However, this still isn't quite right. What would happen if the file WIL.BK5 didn't exist? We would get a FileRename error. There are two ways that we can handle this. We could use an If FileExist test before every file operation, and test the returned value for a @TRUE before proceeding. But this is clumsy, even with such a small WIL program, and would become unwieldy with a larger one. The other way is by using the ErrorMode function. Handling Errors The ErrorMode function lets you decide what will happen if an error occurs during WIL processing. It is designed to be used around an isolated function, such as the FileRename function above, to turn off errors which would prevent a script from continuing. See Also: IntControl 73, IntControl 38. ErrorMode (mode) Specifies how to handle errors. Parameters: (i) mode @CANCEL, @NOTIFY, or @OFF. 49 WIL TUTORIAL Returns: (i) previous error setting. Use this command to control the effects of runtime errors. The default setting is @CANCEL, meaning the execution of the WIL program will be canceled for any error. @CANCEL: All runtime errors will cause execution to be canceled. The user will be notified which error occurred. @NOTIFY: All runtime errors will be reported to the user, and they can choose to continue if it isn't fatal. @OFF: Minor runtime errors will be suppressed. Moderate and fatal errors will be reported to the user. User has the option of continuing if the error is not fatal. As you can see, the default mode is @CANCEL, and it's a good idea to leave it like this. However, it is quite reasonable to change the mode for isolated sections of your WIL program where you anticipate errors occurring. This is just what we've done in our modified WIL program: Please read examples very carefully before running. If FileExist("wil.bak") == @TRUE FileDelete("wil.bk5") ErrorMode(@OFF) ;turn ErrorMode off FileRename("wil.bk4", "wil.bk5") FileRename("wil.bk3", "wil.bk4") FileRename("wil.bk2", "wil.bk3") FileRename("wil.bk1", "wil.bk2") FileRename("wil.bak", "wil.bk1") ErrorMode(@CANCEL) ;reset ErrorMode to default Endif Run("winword.exe", "wil.doc") Exit Notice how we've used ErrorMode(@OFF) to prevent errors in the If statement section from aborting the WIL program, and then used ErrorMode(@CANCEL) at the end of the that section to change back to the default error mode. This is a good practice to follow. In general, you should ONLY put error mode around SINGLE statements where you are handling the errors yourself. If it is obvious that there is no way a statement could fail it should be run with ErrorMode(@CANCEL) Note: Pay close attention when suppressing errors with the ErrorMode function. When an error occurs, the processing of the ENTIRE line is canceled. Setting the ErrorMode( ) to @OFF or @NOTIFY allows execution to resume at the next line. Various parts of the original line may have not been executed. 50 WIL TUTORIAL Please read examples very carefully before running. ErrorMode(@OFF) ; The FileCopy will cause a file not found error, ; canceling the execution of the whole line. ; The variable A is set to @FALSE by default A = FileCopy( "xxxxxxxxx", "*.*", @FALSE); ; ; ; ; ; Now there is a NOT symbol in front of the FileCopy. Nonetheless, if an error occurs A is still set to @FALSE not @TRUE as might be assumed. When an error is suppressed with ErrorMode the line is canceled, and any assignment is simply set to the default @FALSE value. A = !FileCopy("yyyyyyyyy", "*.*", @FALSE) For this reason, ErrorMode( ) must be used with a great deal of care. The function for which the errors are being suppressed should be isolated from other functions and operators as much as possible. e.g. ; INCORRECT USAGE of ErrorMode( ) ; In this instance, when the copy has an error, the entire if ; statement is canceled. ; Execution begins (erroneously) at the next line, and states ; that the copy succeeded. Next a fatal error occurs as the ; "else" is found, since it does not have a matching if ErrorMode(@OFF) if FileCopy(file1,file2,@FALSE) == @TRUE Message("Info", "Copy worked") else Message("Error", "Copy failed") endif ; CORRECT USAGE ; In this case, the FileCopy is isolated from other statements ; and flow control logic. When the statement fails, execution ; can safely begin at the next line. The variable "a" will ; contain the default value of zero that a failed assignment ; returns. ; Results are not confused by the presence of other operators. ; ErrorMode(@OFF) a = FileCopy(file1,file2,@FALSE) ErrorMode(@CANCEL) if a == @TRUE Message("Info", "Copy worked") else Message("Error", "Copy failed") endif 51 WIL TUTORIAL Debugging WIL Scripts Apparently, there have been sightings of bug free code. However, chances are you will need to exterminate at least one of your WIL scripts. Luckily, WIL has a handy debug utility which comes with the WIL Interpreter. DebugTrace, a WIL function, is invaluable in determining logic errors. When DebugTrace is initialized, a file is created which logs the execution of each statement. DebugTrace works line by line through the script, logging the current statement and its return value. Initialize DebugTrace by adding DebugTrace(1,"trace.txt") or DebugTrace(@ON,"trace.txt") to a specific point in your script. Note: For specific instructions see Debug or DebugTrace in the WIL Function Reference. Example: DebugTrace(@on,"trace.txt") a=TimeYmdHms( ) b=TimeJulianDay(a) c=(b+5) mod 7 day=ItemExtract(c+1, "Sun Mon Tue Wed Thu Fri Sat", " ") line=StrCat("Julian Date= ",b,@CRLF,"Day of week= ",day) Message(TimeDate( ), line) Selection Methods So far, whenever we have needed to use a file name, we've hard-coded it into our WIL programs. For example: Run("notepad.exe", "agenda.txt") Naturally, there should be a way to get this information from the user "on the fly", so that we wouldn't have to write hundreds of different WIL programs. And there is a way. Three or four ways, actually. Consider, first, a function that we have already seen, AskLine: file = AskLine("", "Enter Filename to edit?", "", 0) Run("notepad.exe", file) This will prompt for a filename, and run Notepad on that file: 52 WIL TUTORIAL There are only three problems with this approach. First, the user might not remember the name of the file. Second, the user might enter the name incorrectly. And finally, modern software is supposed to be sophisticated and user-friendly enough to handle these things the right way. And WIL certainly can. There are several functions we can use for an improved file selection routine. FileItemize (file-list) Returns a delimited list of files. This function compiles a list of filenames and separates the names with a delimiter. There are several variations we can use: FileItemize("*.doc") would give us a list of all files in the current directory with a DOC extension, FileItemize("*.com|*.exe") would give us a list of all files in the current directory with a COM or EXE extension. FileItemize("*.*") would give us a list of all files in the current directory. Of course, we need to be able to use this list, and for that we have: AskItemList (title, list, delimiter, sort mode, select mode [, selectionrequired] ) Displays a list box filled with items from a list you specify in a string. The items are separated in your string by a delimiter. 53 WIL TUTORIAL This is the function which actually displays the list box. Remember that FileItemize returns a file list delimited by a character. If the delimiter is a TAB, the list will look something like this: FILE1.DOC{TAB}FILE2.DOC{TAB}FILE3.DOC When we use AskItemList, we need to tell it that the delimiter is a TAB. We do this as follows: files = FileItemize("*.doc|*.txt") afile = AskItemList("Select File to edit", files, @TAB, @unsorted, @single, @false) Run("notepad.exe", afile) which produces: First, we use FileItemize to build a list of filenames with DOC and TXT extensions. We assign this list to the variable files. Then, we use the AskItemList function to build a list box, passing it the variable files as its second parameter. The third parameter we use for AskItemList is simply the @TAB constant; this tells AskItemList that the list in variable files is delimited by tabs. Using the fourth parameter, set the sort mode to choose how to display the text, sorted or unsorted. The fifth parameter sets the select mode allowing you to choose a single item or multiple items from the list. The sixth parameter is optional, it allows you to specify whether an item must be selected or not. Finally, we assign the value returned by AskItemList to the variable afile, and run Notepad using that file. 54 WIL TUTORIAL In the list box, if the user presses Enter or clicks on the OK button without a file being highlighted, AskItemList returns a null string. If you want, you can test for this condition: files = FileItemize("*.doc|*.txt") while @TRUE afile = AskItemList("Select File to edit", files, @TAB, @unsorted, @single, @false) If afile != "" Then break ;break terminates the While structure transferring ;control to the statement following the endwhile. endwhile Run("notepad.exe", afile) DirItemize (dir-list) Returns a delimited list of directories. This function is similar to FileItemize, but instead of returning a list of files, it returns a list of directories. Remember we said that FileItemize only lists files in the current directory. Often, we want to be able to use files in other directories as well. One way we can do this is by first letting the user select the appropriate directory, using the DirItemize and AskItemList combination: DirChange("C:\") subdirs = DirItemize("*.*") targdir = AskItemList("Select dir", subdirs, @TAB, @sorted, @single, @false) if targdir != "" then DirChange(targdir) files = FileItemize("*.*") afile = AskItemList("Select File to edit",files, @TAB, @sorted, @single, @false) Run("notepad.exe", afile) First we change to the root directory. Then we use DirItemize to get a list of all the sub-directories off of the root directory. Next, we use AskItemList to give us a list box of directories from which to select. Finally, we change to the selected directory, and use FileItemize and AskItemList to pick a file. Although this WIL program works, it needs to be polished up a bit. What happens if the file we want is in the \WINDOWS\BATCH directory? Our WIL program doesn't go more than one level deep from the root directory. We want to continue down the directory tree, but we also need a way of telling when we're at the end of a branch. As it happens, there is such a way: DirItemize will return a null string if there are no directories to process. Given this knowledge, we can improve our file selection logic: DirChange("C:\") ; Directory selection loop while @TRUE ; Loop forever til break do us part dirs = DirItemize("*") If dirs == "" Then break 55 WIL TUTORIAL targ = AskItemList("Select dir", dirs, @TAB, @sorted, @single, @false) If targ == "" Then break DirChange(targ) endwhile ; ; File selection loop while @TRUE ; Loop forever til break do us part files = FileItemize("*.*") afile = AskItemList("Select File to edit", files, @TAB, @sorted, @single, @false) If afile != "" Then break endwhile Run("notepad.exe", afile) First of all, we set up a repeating while loop. While @TRUE statements EndWhile The "While @TRUE" will repeat the loop forever. In the loop itself we use the break statement to exit the loop. After we use the DirItemize function to try to get a list of the directories at the current level, we test the returned value for a null string. If we have a null string, then we know that the current directory has no sub-directories, and so we proceed to the file selection logic by breaking out of the directory selection loop. If, however, DirItemize returns a non-blank list, then we know that there is, in fact, at least one sub-directory. In that case, we use AskItemList to present the user with a list box of directories. Then, we test the value returned by AskItemList. If the returned value is a null string, it means that the user did not select a directory from the list, and presumably wants a file in the current directory. We happily oblige by breaking out of the directory selection loop. On the other hand, a non-blank value returned by AskItemList indicates that the user has selected a sub-directory from the list box. In that case, we change to the selected directory, and the endwhile causes the directory selection loop to be repeated. We continue this process until either (a) the user selects a directory, or (b) there are no directories left to select. Eventually, we move to the file selection loop. Nicer File Selection The function AskFileName is the equivalent of a standard Common Dialog FileOpen or a FileSave dialog box. An even more elegant way of selecting a file name is provided by the Dialog Editor, which also allows the user to select various options via check boxes and radio buttons from a custom designed dialog box. The Dialog Editor is installed in the directory with the Winbatch.exe. 56 WIL TUTORIAL Nicer Messages Have you tried displaying long messages, and found that WIL didn't wrap the lines quite the way you wanted? Here are a couple of tricks. @CRLF @TAB @CRLF and @TAB are string constants containing, respectively, a carriage-return line-feed pair and a tab character. We want to be able to insert a carriage return/line feed combination at the end of each line in our output, and the @CRLF string constant will let us do that. For example, let's say we want to do this: Message("", "This is line one This is line two") If we just inserted the variables into the string, as in: Message("", "This is line one @crlf This is line two") We would not get the desired effect. WIL would simply treat it as ordinary text: However, WIL does provide us with a method of performing variable and string constant substitution such as this, and that is by delimiting the variables or string constants with percentage signs (%). If we do this: Message("", "This is line one%@crlf%This is line two") we will get what we want: 57 WIL TUTORIAL Note that there is no space after %@crlf%; this is so that the second line will be aligned with the first line (every space within the delimiting quote marks of a string variable is significant). Running DOS Programs WIL can run DOS programs, just like it runs Windows programs: DirChange("c:\game") Run("scramble.exe", "") If you want to use an internal DOS command, such as DIR or TYPE, you can do so by running the DOS command interpreter, COMMAND.COM or CMD.EXE, with the /c program parameter, as follows: Run("cmd.exe", "/c type readme.txt") Everything that you would normally type on the DOS command line goes after the /c in the second parameter. Here's another example: Run("cmd.exe ", "/c type readme.txt | more") These examples assume that CMD.EXE is in a directory on your DOS path. If it isn't, you could specify a full path name for it: Run("c:\cmd.exe", "/c type readme.txt | more") Or, better still, you could use the WIL Environment function. Environment (env-variable) Gets a DOS environment variable. Since DOS always stores the full path and filename of the command processor in the DOS environment variable COMSPEC, it is an easy matter to retrieve this information, it can be handled as follows: coms = Environment("COMSPEC") and use it in our WIL program: coms = Environment("COMSPEC") Run(coms, "/c type readme.txt") 58 WIL TUTORIAL To get a DOS window, just run COMMAND.COM with no parameters: coms = Environment("COMSPEC") Run(coms, "") Sending Keystrokes to Programs Here we come to one of the most useful and powerful features of WIL: the ability to send keystrokes to your programs, just as if you were typing them directly from the keyboard. SendKeysTo (parent-windowname, sendkey string) Activates the specified window and sends keystrokes to it. This is an ideal way to make the computer automatically type the keystrokes that you enter every time you start a certain program. For example, to start up Notepad and have it prompt you for a file to open, you would use: Run("notepad.exe", "") SendKeysTo("Notepad", "!fo") The parameters you specify for SendKeysTo are the windowname (or at least the first unique part of it), and the string that you want sent to the program. This string consists of standard characters, as well as some special characters which you will find listed under the entry for SendKey in the WIL Function Reference (pg. 516). In the example above, the exclamation mark (!) stands for the Alt key, so !f is the equivalent of pressing and holding down the Alt key while simultaneously pressing the f key. The o in the example above is simply the letter o, and is the same as pressing the o key by itself: Here's another example: RunZoom("sol.exe", "") SendKeysTo("Solitaire", "!gc{RIGHT}{SP}~") 59 WIL TUTORIAL This starts up Solitaire, brings up the Game menu (!g), and selects Deck (c) from that menu: Then it moves the cursor to the next card back style on the right ({RIGHT}), selects that card back ({SP}), and then selects OK (~). The tilde sign (~) is SendKey shorthand for the Enter key. And voila! A different card design every time you play! Our Completed WIL File Here is the final working version of the WIL program that we've slowly been building throughout this tutorial. It incorporates many of the concepts that we've discussed so far, as well as using some arithmetic ( *, -, +, / ) and relational (<) operators that are covered in the section on the WIL Language (pg. 71). It can also be improved and customized in a number of ways, but we'll leave that up to you. 60 WIL TUTORIAL If you can understand and follow the structures and processes illustrated in this sample file, and can begin to incorporate them into your own WIL programs, you are well on your way to becoming a true WIL guru! Clubhouse Congratulations! You've finished the course. Let's take a look at the completed script we've been writing, tutor.wbt. A few things have been added to polish it up, but the majority of the code should match your example. ; tutor.wbt mins = AskLine("Solitaire", "How many mins do you want to play?", "5", 0) mins = Int(mins) Switch mins case 0 Display(5, "", "Game canceled") exit break case 1 Message("Only a minute?", "Wow! You've got willpower.") break case 2 Message("2 Minutes?", "This isn't much of a break.") break case 3 Message("3 Minutes?", "You're barely got time to shuffle") break case 4 Message("HA,HA,HA", "I dare you to try to beat me.") break case mins ;default case - must be last in the switch Message("THAT LONG!!!", "Where did you get all that time?") break EndSwitch ;;ADDED to demonstrate checking for the existence of a program ;;before running a second occurrence. If WinExist("Solitaire") == @TRUE WinActivate("Solitaire") WinShow("Solitaire") Else 61 WIL TUTORIAL Run("sol.exe", "") Endif for i = 0 to 9 j=100-i*10 k=300+i*70 WinPlace(j,j,k,k,"Solitaire") next WinZoom("Solitaire") ;;ADDED to show an example of sending keystrokes. SendKeysTo("Solitaire", "!gc{RIGHT}{SP}~") GoSub dumdedum mins=AskLine("More Time?", "Enter additional minutes", 0, 0) If mins!=0 then GoSub dumdedum ;;ADDED as an example of a while loop. while WinExist("Solitaire") WinClose("Solitaire") ;Make sure it closes endwhile Message("Time's Up", "Get Back to Work!") Exit :dumdedum goal = mins * 60 timer = 0 While timer < goal remain = goal - timer if WinExist("Solitaire") WinTitle("Solitaire", "Solitaire (%remain% seconds left)") else exit endif TimeDelay(10) timer = timer + 10 EndWhile Return 62 THINGS TO KNOW THINGS TO KNOW This section covers some miscellaneous items, of a more advanced nature. If you've been having trouble with your WIL scripts, or have a question that's not answered elsewhere, there's a pretty good chance we've answered it here. Please reference the Windows Interface Language help file for the most current documentation. Recovering from Cancel By default, if a user cancels out of a dialog, the label :CANCEL will be searched for in the WIL program, and, if found, control will be transferred there. If no label :CANCEL is found, processing simply stops. This allows the program developer to perform various bits of cleanup processing after a user presses Cancel. The function IntControl 72 lets you specify what should happen when the next Cancel event occurs in the script. This allows the program developer to perform cancel processing, if a user presses Cancel, in any dialog. When processing goes to :CANCEL, the following WIL variables are automatically set: Variable wberrorhandlerline wberrorhandleroffset wberrorhandlerassignment wberrorhandlerfile wberrortextstring wberroradditionalinfo wberrorinsegment wberrorhandlerlinenumber Meaning (s) Cancel line (i.e., line in script that caused Cancel) (i) offset into script of Cancel line, in bytes (s) variable being assigned on Cancel line, or "" if none (s) name of the currently-executing script (s) description of the WIL error (s) delimited string of additional error information, if any. ASCII 160 is delimiter character between each error incident. (s) name of the currently-executing UDF, or a blank string ("") if not in a UDF. (i) line number in the currently executing script or 0 if the cancel cannot be matched to a particular line. 63 THINGS TO KNOW wberrorarray (a) WIL array with the following elements: wberrorarray[0] = LastError() wberrorarray[1] = wberrorhandlerline wberrorarray[2] = wberrorhandleroffset wberrorarray[3] = wberrorhandlerassignment wberrorarray[4] = wberrorhandlerfile wberrorarray[5] = wberrortextstring wberrorarray[6] = wberroradditionalinfo wberrorarray[7] = wberrorinsegment wberrorarray[8] = wberrorhandlerlinenumber wberrorarray[9] = line number in the UDF where the cancel occurred or 0. wberrorarray[10] = a positive number if reported line numbers are accurate, zero (0) if possibly inaccurate or -1 if run from WinBatch Studio, in which case both wberrorarray[8] and wberrorarray[9] will contain the line number of the cancel in the UDF. wberrorarray[11] = used to set return value of the function the cancel occurred on. Note: The Windows operating system offers many alternatives, for canceling a dialog: pressing the Cancel button, typing Esc, Alt-F4, and some others. See the Basic Script Template for an example of trapping more than one :CANCEL label. Basic Script Template Here is a suggested template of a script handling multiple cancels: ;TITLE: ;DATE: ;AUTHOR: ;VERSION: ;UPDATED: ;PURPOSE: IntControl(72,2,0,0,0) abc=Pause("Pause","one") Message("ABC is",abc) Exit :CANCEL %wberrorhandlerassignment% = 9999 IntControl(72,2,0,0,0) return Extenders: Networking, Novell, TCP/IP, Microsoft WIL language extenders enhance Microsoft, Novell and TCP/IP networking. They are among the most useful parts of the WIL language. Network connectivity, special arithmetic operations, and other capabilities can be added to WIL with extenders. 64 THINGS TO KNOW Other extenders are often available on the web site: http://www.winbatch.com. They may be downloaded from there. The most widely used extenders are included on the distribution CD-ROM. Software developers who want to create custom extensions to the WIL language may utilize a development kit called “WIL Extender SDK”. The actual extender must be written as a DLL using C or C++. Each individual extender has its own help file, that explains how to use the functions in it. The example here, comes from the Win32 network extender. It changes a password under Windows NT: Syntax: wntChgPswd(server/domain, user-name, old-password, new-password) Parameters: (s) server/domain either a server name (e.g., "\\MYSERVER") or domain name (e.g., "SALES") on which the password will be changed, or a blank string ("") for the current user's login domain. (s) user-name the name of the user whose password will be changed, or a blank string ("") for the current user's login name. (s) old-password the user's password on "server/domain" or "*UNKNOWN*"(see below). (s) new-password the new password to be set or a blank string ("")to indicate no password is desired. Returns: (i) @TRUE if successful. Old-password wntChgPswd can be used to specify a new password without knowing the old password, if you are a member of the Administrators or Account Operators local group. To do this, specify "*UNKNOWN*" as the old password. In this case, the "user" parameter must specify an actual user name (i.e., it cannot be a blank string). Example: AddExtender("wwwnt34i.dll") old=AskPassword("Change Password","Enter old password") while @TRUE new1=AskPassword("Change Password","Enter new password") new2=AskPassword("Change Password","Enter new password again") if new1==new2 then break Message("Try Again","The new passwords you entered do not match") endwhile rslt=wntChgPswd("", "", old, new1) if rslt 65 THINGS TO KNOW Message("Password","Successfully changed") else Message("Password","Not changed") endif Terminating WIL processing A currently-executing WIL program can be terminated immediately by pressing the <Ctrl-Break> key combination. You may need to hold it a second or two. IntControl 12 can be used to suppress the ability of the user to terminate the batch file. We suggest the batch file is completely debugged before doing this. Carriage Return Line Feed A commonly asked question is, "How do I get my long lines to wrap to the next line?". One way, besides using the built in @CRLF and @TAB string constants is to use the functions Num2Char or StrCat to accomplish this. Example: cr=Num2Char(13) ; 13 is a carriage-return lf=Num2Char(10) ; 10 is a line feed Message("", "This is line one %cr% %lf% This is line two") or... cr=Num2Char(13) lf=Num2Char(10) crlf=StrCat(cr, lf) Message("", "This is line one %crlf% This is line two") Note: @CRLF and @TAB are explained in more detail in the WIL Tutorial section under the heading Nicer Messages. Extension Associations and the Run Functions The Run function (and most of the related members of the Run... family of functions) allow you to run a data file if it is associated with a program. They do not support running programs with unknown extensions. Debug WIL has a handy debug utility which comes with the WIL Interpreter. DebugTrace, a WIL function, is invaluable in determining logic errors. When DebugTrace is initialized, a file is created which logs the execution of each statement. DebugTrace works line by line through the script, logging the current statement and its return value. 66 THINGS TO KNOW Initialize debug by adding DebugTrace(@ON,"trace.txt") to a specific point in your script. Note: For specific instructions see DebugTrace, in the WIL Function Reference. (pg. 194) Internal Control Functions WinBatch has several Internal Control functions, IntControl, which permit numerous internal operations. If you are having trouble finding a specific command, you may find a solution here. For example, IntControl 66, 67, 68 can log a user out, perform a reboot, and shutdown windows. Check out the versatility of IntControl in the WIL Function Reference. (pg. 361 ) Partial Window Names When using partial window names as parameters, you can specify the full name if you wish, but in most circumstances, it isn't necessary. Specify enough characters so that "partial-windowname" matches only one existing window. If it matches more than one window, the most recently accessed window which it matches will be used. The windowname "" may be used as a shorthand way of referring to the WIL parent application window. Remember that the case (upper or lower) of the title is significant. If the case is not correct, a match will not be made. There are a total of four distinct ways to define a partial window name. Decide which option is best for your particular needs. Window Name A partial windowname can be the first few defining characters of a window title. For example, WinShow("Notepad") would match any window whose title begins with "Notepad". Exact Match Those WIL functions which take a partial windowname as a parameter can be directed to accept only an exact match by ending the window name with a tilde (~). A tilde (~) used as the last character of the window name indicates that the name must match the window title through to the end of the title. For example, WinShow("Note~") would only match a window whose title was "Note"; it would not match "Notepad". Match Any Window A tilde (~) used as the first character of the window name, will match any window containing the specified string anywhere in its title. For example, WinShow("~Notepad") will match a window title of "(Untitled) - Notepad" and 67 THINGS TO KNOW a window title of "My Notepad Application", as well as a window title of "Notepad - (Untitled)". Window Name Ends With… A tilde (~) used as the first and last character of the window name, will match any window containing the specified string anywhere in its title, except at the beginning. For example, WinShow("~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)". System.ini and its device= lines The "device=" lines in the System.ini cannot be edited using the normal IniWritePvt function. See BinaryPokeStr (pg.145) for a complete example of how to write "device=" lines into the System.ini. Dividing Floating Point Numbers This example might not work exactly how you think it will. If you take two integers, for example, 32 and 37, and divide 32 by 37, you will not necessarily get a floating point answer. This integer divide will result in an answer of 0. Add 0.0 to one of the numbers to get a true floating point answer. Another way to deal with this situation is to first declare floating point variables with statements like this: x=0.0 Example: ;Problem.wbt a1= "An unexpected problem can occur when dividing numbers." a2= "The problem is in deciding between an integer divide " a3= "(where the remainder, if any, is discarded) and a floating " a4= "point divide (where a floating point number is returned)." a5= "" a6= "" a7= "Let's assume a test. There are 42 questions." a8= "A student gets 37 of them correct," a9= "what is the student's score." a10= " " a11= "iQuestions = 42" a12= "iCorrect = 37" a13= "Score = iCorrect / iQuestions" iQuestions = 42 iCorrect = 37 Score = iCorrect / iQuestions a14= a15= a16= a17= a18= 68 " " "The unexpected result is that the score is %Score%" "Reasonable problem? The trap is that WIL will perform an" "integer divide and return the unexpected answer of Zero." " " THINGS TO KNOW a19= "To dig your code out of this trap, simply use floating point" a20= "numbers when you want a floating point answer." a21 = " " a22= "fQuestions = 42.0" a23= "fCorrect = 37.0" fQuestions = 42.0 fCorrect = 37.0 Score = fCorrect / fQuestions a24= "Score = fCorrect / fQuestions" a25= "The correct score is %Score%" a26= " " a27= "Or make the answer look nicer by using the Decimals function" a28= "and a little formatting." a29= "" a30= "Decimals(0) a31= "Score=Score*100" Decimals(0) Score=Score*100 a32= "" ;;;;;;;;use two %'s to get a single % ;;;;;;;;;;; a33= "The correct score is %Score%%%" text="" for i=1 to 15 text=strcat(text,a%i%,@crlf) next text2="" for i=16 to 33 text2=strcat(text2,a%i%,@crlf) next Message("Integer Divide Problem",text) Message("Floating point solution",text2) File Delimiters The default file delimiter, used to delimit lists of files and directories, is a TAB. The following functions, which take file or directory lists as input parameters, expect the lists to be delimited by the current file delimiter character. However, they also accept lists delimited with a vertical bar ("|"), which may be easier to code in a WIL script: DiskFree DirItemize DirRemove DiskScan FileAppend 69 THINGS TO KNOW FileAttrSet FileCopy FileDelete FileItemize FileMove FileRename FileSize FileSizeEx FileTimeSet FileTimeTouch Note: DiskFree and DiskSize continue to accept space-delimited lists as input. Sounds If you have Windows Multimedia extensions, and hardware capable of playing WAV waveform files, there can be sounds audible at various points in the execution of WIL programs. By default, these sounds are disabled. You can also use the Sounds function to turn sounds on and off from within a WIL program. 70 WIL LANGUAGE WIL LANGUAGE Language Components A program written in Windows Interface Language (WIL) consists of a series of statements. WIL statements are constructed from constants, variables, operators, functions, commands, and comments. In addition, WIL scripts can take advantage of advanced techniques such as substitution, passing parameters, and error handling. Note: Each line in a WIL program can be up to 2048 characters long. Constants Windows Interface Language (WIL) supports three types of constants: floating point, integer and string constants. In addition, there is an extensive list of predefined constants to make your scripts easier to read. Floating Point Constants Floating Point constants are built from the digits 0 through 9, the plus and minus signs, a period ‘.’ and the letter ‘E’. They can range in magnitude from negative to positive 1.0E+300 (a very large number). Constants larger than these permissible magnitudes will produce unpredictable errors. Floating point constants must begin with a digit. Examples of floating point constants: 3.14159 -8.92E-45 0.0001724 8.95e294 Integer Constants Integer constants are built from the digits 0 through 9. They can range in magnitude from negative to positive 231 - 1 (approximately two billion). Constants larger than these permissible magnitudes will produce unpredictable results. Examples of integer constants: 1 -45 377849 -1999999999 71 WIL LANGUAGE String Constants String constants are comprised of displayable characters bounded by quote marks. You can use double quotes ("), single quotes ('), or back quotes (`) to enclose a string constant, as long as the same type of quote is used to both start and end it. Examples of string constants: "a" 'Betty Boop' `Look at these backquotes` NOTE: If you need to embed a quote mark inside the string constant, use a different type of quote mark to delimit the string. 'This constant has an embedded "quote" mark' If you need to embed the delimiting quote mark inside the string constant, use the delimiting quote mark twice. "This constant has an embedded ""quote"" mark" Predefined Constants WIL has a number of built-in constants that can be used for various purposes, including making your scripts easier to read. These start with the @-sign, and are not case-sensitive. Some predefined constants: @FALSE @NO @STACK @TRUE @YES @TILE A list of all the predefined constants can be found in the Appendix (pg. 626). Identifiers Identifiers are the names supplied for variables, functions, and commands in your program. An identifier is a sequence of one or more letters or digits that begins with a letter. Identifiers may have up to 30 characters. All identifiers are case insensitive. Upper-case and lower-case characters may be mixed at will inside variable names, commands or functions. For example, these statements all mean the same thing: AskLine(MyTitle, Prompt, Default, 0) ASKLINE(MYTITLE, PROMPT, DEFAULT, 0) aSkLiNe(MyTiTlE, pRoMpT, dEfAuLt, 0) 72 WIL LANGUAGE Variables A variable may contain an integer, a floating point number, a string, a list, an array, object reference or a string representing an integer or a floating point number. Automatic conversions between numbers and strings are performed as a matter of course during execution. If a function requires a string parameter and a numeric parameter is supplied, the variable will be automatically modified to include the representative string. If a function requires a numeric parameter and a string parameter is supplied, an attempt will be made to convert the string to the required numeric parameter. If it does not convert successfully, an error will result. Arrays are created using the function ArrDimension. Variable Substitution The WIL language has a powerful substitution feature which inserts the contents of a string variable into a statement before the line is parsed. However, substitution should be used with caution. In general, do not use variable substitution. Many problems can be created, simply by using variable substitution. For example, if you have a large string variable, and you attempt variable substitution, you will receive an error that the line is too long. This occurs because the contents of the string variable are substituted into the line before the line gets executed. No single line can exceed 2048 characters. It is a better idea, to build a string variable using the function StrCat or the ' :' operator. Example: MyName="George" NewStr=StrCat("Hello, My name is: ", MyName) Message("Name Tag",NewStr) Or MyName="George" NewStr= "Hello, My name is " : MyName Message("Name Tag",NewStr) If it is absolutely necessary to substitute the contents of a variable in the statement, simply put a percent-sign (%) on both sides of the variable name. Example: mycmd = "DirChange('c:\')" ;set mycmd to a command %mycmd% ;execute the command 73 WIL LANGUAGE Or consider this one: IniWrite("PC", "User", "Richard") name = IniRead("PC", "User", "somebody") message("", "Thank you, %name%") will produce this message box: To put a single percent-sign (%) on a source line, specify a double percent sign(%%). This is required even inside quoted strings. Note: The length of a line, after any substitution occurs, may not exceed 2048 characters. If you choose to put a comment at the end of a line, that includes a percent sign, you must specify %%. percent = value * 0.5 ; 50%% of value is Lists Explained A list is a string variable which itself contains one or more strings, each of which is delimited (separated) by a common character. For example, both FileItemize and WinItemize functions return a list of window names, delimited by tabs. In order to use functions which accept a list as a parameter, such as AskItemList, you will need to know what character is being used to delimit the list. In order to support long file names, which can contain embedded spaces, the default file delimiter used to delimit lists of files and directories is a TAB. To change the file delimiter to a character of your own choosing, use IntControl (29,p1,0,0,0). Notes: Single item null lists ("") are not a valid list, therefore many of the following functions will have no affect. However, if you pass a null string to ItemInsert, it will insert a value. Trailing delimiters are significant. This means that the comma-delimited list "a,b,c," has 4 items in it. Functions that accept an 'index' allow you to specify -1 to represent the last item in the list. 74 WIL LANGUAGE If the function is passed a Unicode list then it will return a Unicode list. Here are a few functions designed to deal with 'lists'. ItemCount ( list, delimiter ) Returns the number of items in a list. ItemExtract ( index, list, delimiter ) Returns the selected item from a list. ItemInsert ( item, index, list, delimiter ) Adds an item to a list. ItemLocate ( item, list, delimiter ) Returns the position of an item in a list. ItemRemove ( index, list, delimiter ) Removes an item from a list. ItemReplace ( item, index, list, delimiter) Replaces an item in a list. ItemSort ( list, delimiter ) Sorts a list. Keywords Keywords are the predefined identifiers that have special meaning to the programming language. These cannot be used as variable names. WIL keywords consist of the functions, commands, and predefined constants. Some examples of reserved keywords: Beep DirChange @Yes FileCopy Operators Windows Interface Language operators take one operand ("unary operators") or two operands ("binary operators"). Unary operators (integers and floating point numbers) Arithmetic Negation (Two's complement) + Identity (Unary plus) Unary operators (integers only) ~ Bitwise Not. Changes each 0 bit to 1, and vice-versa. ! Logical Not. Produces 0 (@FALSE) if the operand is 75 WIL LANGUAGE nonzero, else 1 (@TRUE) if the operand is zero. Unary operators (variable reference) & Creates a pointer. * References variable via a pointer. Binary logical operators (integers only) << Left Shift >> Right Shift & Bitwise And | Bitwise Or ^ Bitwise Exclusive Or (XOR) && Logical And || Logical Or Binary arithmetic operators (integers and floating point numbers) ** Exponentiation * Multiplication / Division mod Modulo + Addition Subtraction Binary string operators : Concatenation Binary relational operators > Greater-than >= Greater-than or equal < Less-than <= Less-than or equal == Equality != or <> Inequality Assignment operator = Assigns evaluated result of an expression to a variable Precedence and Evaluation Order The precedence of the operators affect the evaluation of operands in expressions. Operands associated with higher-precedence operators are evaluated before the lower-precedence operators. The table below shows the precedence of the operators. Where operators have the same precedence, they are evaluated from left to right. Description Operator ( ) Parenthetical grouping & * Unary pointer operators ~ ! - + Unary operators ** Exponentiation * / mod Multiplication,, Division & Modulo 76 WIL LANGUAGE + << >> : < <= == >= > != <> & ^ | && || Addition & Subtraction Shift operators Concatenation Relational operators Bit manipulation operators Logical operators Comments A comment is a sequence of characters that are ignored when processing a command. A semi-colon (not otherwise part of a "string constant") indicates the beginning of a comment. All characters to the right of the semi-colon are considered comments, and are ignored. Except for percent-signs (%). If you choose to put a comment at the end of a line, that includes a percent sign, you must specify %%. Blank lines are also ignored. Examples of comments: ; This is a comment abc = 5 ; This is also a comment Assignment Statements Assignment statements are used to set variables to specific or computed values. Variables may be set to integers or strings or floating point numbers. Examples: a = 5 value = Average(a, 10, 15) location = "Northern Hemisphere" world = StrCat(location, " ", "Southern Hemisphere") Control Statements Control statements are generally used to execute system management functions and consist of a call to a command without assigning any return values. Examples: Exit Yield Break While Switch Select For EndSwitch EndSelect ForEach Continue Return Beep Next Goto Case Endwhile GoSub 77 WIL LANGUAGE Function Parameters Most of the functions and commands in the language require parameters. These come in several types: Array Integer Floating point number Huge number String List Variable name The interpreter performs automatic conversions between strings, integers and floating point numbers, so that you can use them interchangeably. In general, the only case to be careful of is comparing two floating point numbers -- floating point numbers have a habit of never being quite equal when you want them to. Integer parameters may be any of the following: An integer (i.e. 23) A string representing an integer (i.e. "23") A variable containing an integer A variable containing a string representing an integer Floating point parameters may be any of the following: A floating point number (i.e. 3.141569) A string representing an integer (i.e. "314.1569E-2") A variable containing a floating point number A variable containing a string representing a floating point number Huge number parameters: A huge number is a long decimal number string, which may represent a number too large to be converted to an integer. String parameters may be any of the following: A string An integer A variable containing a string A variable containing a list A variable containing an integer A variable containing a floating point number 78 WIL LANGUAGE User Defined Functions WIL support's User-Defined Functions (UDF's). There are two types of User Defined Functions (UDF's): • #DefineFunction UDF's, variables are local to the UDF • #DefineSubroutine UDF's, variables are global, to the caller. A #DefineFunction UDF is defined as follows: #DefineFunction functname(param1, param2, param3, param4,…param16) <code> Return retval #EndFunction "#DefineFunction" and "#EndFunction" are the keywords indicating the beginning and end of the UDF. "functname" is a placeholder for the name of the function. The function name must begin with a letter, can contain letters, numbers, and underscores, and can be up to 30 characters long. You may not use a function name that is the same as the name of a WIL DLL function, but you may override a function name that's in an extender DLL. You may specify up to 16 optional parameters. "param1" - "param16" are placeholders for your actual variable names. These are the names of the variables that your UDF will receive when it is called. Between the "#DefineFunction" and "#EndFunction" keywords is the code that will get executed when the UDF is called. It may contain a Return command followed by a value (or an expression that evaluates to a value), in which case the UDF will end and return this value. If you specify a Return command without a value, the UDF will return 0. If a UDF does not contain a Return command, it will execute to the end of the UDF and return 0. An Exit command in a UDF will cause the entire script to end, not just the UDF. A UDF may be defined anywhere in a script, as long as it is defined prior to being used for the first time. A UDF may be defined or used in a separate script that is called with the Call command, as long as it is defined before it is used. You may not have nested UDF definitions (i.e., each "#DefineFunction" must be followed by an "#EndFunction" as a pair). A #DefineFunction UDF will not have access to any variables in the main WIL script, other than the variables passed as param1 - param16. Any variables set in a UDF will be destroyed when the UDF returns, other than the return value of the UDF. Any percent signs in the UDF code will be expanded at runtime (when the code is called), not at define time. 79 WIL LANGUAGE You may return a file handle or binary buffer or COM/OLE object from a UDF using the Return command. However, if you open one of these types of handles in your UDF and do not return it using the Return command, you are responsible for freeing it before the UDF returns, using the appropriate WIL function (i.e., FileClose or BinaryFree or ObjectClose); otherwise, the object represented by the handle will become an "orphan" and will no longer be accessible and may not be automatically freed when the script exits. Example: ; Define three UDF's #DefineFunction Done() Message("All done", "Script processing is complete") #EndFunction #DefineFunction Square(number) Return (number * number) #EndFunction #DefineFunction AddListItem(list, newitem, delimiter) list = ItemInsert(newitem, -1, list, delimiter) list = ItemSort(list, delimiter) Return list #EndFunction ; Now use them list = "apples,bananas,peaches" list = AddListItem(list, "cherries", ",") Message("New list", list) Message("The square of 5 is", Square(5)) Done() Exit See Also: Call, Return A #DefineSubroutine UDF is defined as follows: #DefineSubRoutine functname(param1, param2, param3, param4,…param16) <code> Return retval #EndSubRoutine The #DefineSubroutine UDF is similar, in most respects, to the #DefineFunction UDF, except that the variables are global to the calling routine. This means that it will be able to access and change variables in the calling routine, and any variables it sets will not be destroyed when it returns. WARNING: Use at your own risk. The variables used within the #DefineSubroutine have 'caller' scope, which means the variables are shared with the calling routine. We suggest using a special naming convention on the variables 80 WIL LANGUAGE inside the #DefineSubroutine. The Drop and DropWild functions, can be used to dispose of any unwanted variables at the end of the routine. UDF/ UDS Special Notes: • Maximum number of UDF's allowed is 512 • If you call GoSub from within a User Defined Function, the 'label' must be defined within the User Defined Function • If you want to debug the User Defined Function, then the debug function (Debug or Debugtrace), must be defined within the User Defined Function • To include cancel/error handling in a User Defined Function, then IntControl 72 / IntControl 73 must either: 1) Be defined within the User Defined Function. The :CANCEL / :WBERRORHANDLER label must also be contained within the User Defined Function 2) Or p1 must be the value of 3 and p2 must specify the name of the cancel / error handler UDF. Example: #DefineSubRoutine LogErrors(loc_ErrNum) lastlogtime = TimeYMDHMS() loc_fh = FileOpen("Errorlog.txt","APPEND") loc_text = StrCat("Error",@TAB,loc_ErrNum,": ", Err%loc_ErrNum%, @TAB, "occured at ", lastlogtime) FileWrite(loc_fh, loc_text) FileClose(loc_fh) DropWild("loc_*") Return lastlogtime #EndSubRoutine ;Error String Constants Err1008 = "FileCopy: Failed" Err1009 = "FileCopy: FROM file open failed" Err1010 = "FileCopy: TO file open failed" Err1011 = "FileCopy: I/O error" starttime = TimeYMDHMS() ErrorMode(@off) ret = FileCopy("C:\zippideedodah.txt","C:\temp\zippideedodah.txt",@FALSE) ErrorMode(@cancel) errtime = LogErrors(LastError()) Message("Last error logged at",errtime) exit 81 WIL LANGUAGE Arrays Arrays are created using the new ArrDimension function. An array may have from 1 to 5 dimensions, and Arrays can now contain at least 10 million total elements, although this may be constrained by available memory. Array elements are referenced with their subscripts enclosed in square brackets. If an array has more than one dimension, the subscripts are separated with commas. arrayvar[1] arrayvar[1, 1] arrayvar[0, 5, 2] Array subscripts are 0-based. Therefore, the first element in an array is array[0]. Array elements can contain any type of WIL value: string, integer, float, etc. You can have different types of values within an array. You may not pass an array as a parameter to a WIL function (except for functions which state they accept an array), or use it in any sort of operation. For example: Message("Value is", arrayvar) ; NOT legal On the other hand, the following are all supported: arrayvar[0] = 5 x = arrayvar[0] Message("Value is", arrayvar[0]) arrayvar = 5 ; Redefines the array to integer type variable x = arrayvar ; Creates a second variable that points to the array You can pass arrays to user-defined functions, and you can return arrays with the Return command. When you pass an array name (i.e., not an array element) as a parameter to a function, the array gets passed "by reference". That is, the function receives a pointer to the array, and is therefore able to make changes to it "in place". This is similar to passing a binary buffer handle to a function, where the function is then able to make wholesale changes to the binary buffer. In contrast, passing an array element (i.e., with a subscript) to a function is like passing a regular string or integer parameter to a function -- it gets passed "by value". i.e., the function receives the value of the array element, but is not able to modify the array itself. By the same token, when you pass a string to a function like StrUpper: newstring = StrUpper(oldstring) The function does not modify the variable "oldstring" at all. If you want to modify the existing variable, you can assign to it the return value of the function, e.g.: mystring = StrUpper(mystring) array[2] = StrUpper(array[2]) 82 WIL LANGUAGE For more information see the following Array functions: Arrayize, ArrDimension, ArrInfo, ArrInitialize Error Handling There are three types of errors that can occur while processing a WIL program: Minor, Moderate, and Fatal. What happens when an error occurs depends on the current error mode setting, which is set with either the ErrorMode function or IntControl 73 function. Using ErrorMode There are three possible modes you can specify: @CANCEL User is notified when any error occurs, and then the WIL program is canceled. This is the default. @NOTIFY User is notified when any error occurs, and has the option to continue unless the error is fatal. @OFF User is only notified if the error is moderate or fatal. User has the option to continue unless the error is fatal. The function LastError returns the code of the most-recent WIL error encountered during the currently-executing WIL program. Minor errors are numbered from 1000 to 1999. Moderate errors are numbered from 2000 to 2999. Fatal errors are numbered from 3000 to 3999. Error handling is reset to @CANCEL at the start of each WIL program. For an example of trapping an error message, see the function LastError. Note: You must read the section on the ErrorMode function completely before attempting to use the function to suppress run-time errors. For an example of using ErrorMode, see the function LastError. Using IntControl 73 Regardless of the type of the error, IntControl 73 lets you specify what should happen when the next error occurs in the script. For more information see IntControl 73 (pg. 382). 83 Introduction WIL FUNCTION REFERENCE Introduction The WIL programming language consists of a large number of functions and commands, which we describe in detail in this section. We use a shorthand notation to indicate the syntax of the functions. Function names and other actual characters you type are in boldface. Optional parameters are enclosed in square brackets "[ ]". When a function takes a variable number of parameters, the variable parts will be followed by ellipses ("..."). Take, for example, string concatenation: StrCat (string[, string...]) This says that the StrCat function takes at least one string parameter. Optionally, you can specify more strings to concatenate. If you do, you must separate the strings with commas. For each function and command, we show you the Syntax, describe the Parameters (if any), the value it Returns (if any), a description of the function, Example code (shown in Courier type), and related functions you may want to See Also. The following symbols will be used to indicate a function or a section of the manual which applies only to a specific implementation of the WIL Interpreter. {*Explorer} For use with the Microsoft Explorer. {*M} menu-based implementations of WIL Interpreter. Note: WinBatch and Clock Manager are batch file applications, FileMenu, PopMenu and WinBatch Studio are menu file applications. Additional Symbols (i) indicates an integer parameter or return value. (s) indicates a string parameter or return value. (f) indicates a floating point parameter or return value. (a) indicates an array parameter or return value. (r) indicates a COM object reference. 85 Abs (t) indicates a special type described in the function’s text. About Displays the about message box which gives program information. Syntax: About( ) Parameters: (none) Returns: (i) always 1. This function displays a message box containing copyright and version information. Example: About( ) See Also: Version, VersionDLL Abs Returns the absolute value of an integer. Syntax: Abs (integer) Parameters: (i) integer integer whose absolute value is desired. Returns: (i) absolute value of integer. This function returns the absolute (positive) value of the integer which is passed to it, regardless of whether that integer is positive or negative. If a floating point number is passed as a parameter, it will be converted to an integer. Example: y1 = 2003 y2 = 1996 dy = Abs(y1 - y2) Message("Years", "There are %dy% years between %y1% and %y2%") See Also: Average, Fabs, IsNumber, Max, Min 86 AddExtender Acos Calculates the arccosine. Syntax: Acos(x) Parameters: (f) x floating point number whose arccosine is desired. Returns: (f) the Acos function returns the arccosine result of x. The Acos function returns the arccosine of x. The value of x must be between -1 and 1; otherwise, a domain error will occur. Example: real=AskLine("ArcCos","Enter a real number between -1 and 1","0.5",0) answer=Acos(real) Message("Arccos of %real% is",answer) See Also: Asin, Atan, Cos, Sin, Tan AddExtender Installs a WIL extender Dll. Syntax: AddExtender(filename [,version…]) Parameters: (s) filename (s) extender version WIL extender Dll filename [optional] minimum required extender version number. Returns: (i) @TRUE if function succeeded Note: optional parameters are enclosed in square brackets "[ ]". When a function takes a variable number of parameters, the variable parts will be followed by ellipses ("..."). WIL extender Dlls are special Dlls designed to extend the built-in function set of the WIL processor. These Dlls typically add functions not provided in the basic WIL set, such as network commands for particular networks (Novell, Windows, LAN Manager and others), MAPI, TAPI, and other important Application Program Interface functions as may be defined by the various players in the computer industry from time to time. These Dlls may also include custom built function libraries either by the original authors, or by independent third party developers. (An Extender SDK 87 AddExtender is available). Custom extender Dlls may add nearly any sort of function to the WIL language, from the mundane network, math or database extensions, to items that can control fancy peripherals, including laboratory or manufacturing equipment. Use this function to install extender Dlls as required. Up to 10 extender Dlls may be added. The total number of added items may not exceed 500 functions and constants. The AddExtender function must be executed before attempting to use any functions in the extender library. The AddExtender function only needs to be executed once for each extender Dll, in each WIL script that requires it. If you attempt to load the same extender Dll twice, using the AddExtender function, the operation will be ignored. The documentation for the functions added are supplied either in a separate manual or disk file that accompanies the extender Dll. Example: ; Add vehicle radar processing Dll controlling billboard visible to ; motorists, and link to enforcement computers. ; The WIL Extender SPEED.DLL adds functions to read a radar speed ; detector(GetRadarSpeed) , put a message on a billboard visible to ; the motorist (BillBoard), take a video of the vehicle (Camera), and ; send a message to alert enforcement personnel (Alert) that a ; motorist in violation along with a picture id number to help ; identify the offending vehicle and the speed which it was going. ; AddExtender("SPEED.DLL") BillBoard("Drive Safely") While @TRUE ; Wait for next vehicle while GetRadarSpeed( )<5 ; if low, then just radar noise Yield ; wait a bit, then look again endwhile speed=GetRadarSpeed( ) ; Something is moving out there if speed < 58 BillBoard("Drive Safely") ; Not too fast. else if speed < 63 BillBoard("Watch your Speed") ; Hmmm a hot one else if speed < 66 BillBoard("Slow Down") ; Tooooo fast else BillBoard("Violation Pull Over") pictnum = Camera( ) ; Take Video Snapshot Alert(pictnum, speed); Pull this one over endif endif endif endwhile 88 AppExist See Also: DllCall AppExist Tells if an application is running. Syntax: AppExist (program-name [, flags [, retries]] ) Parameters: (s) program-name (i) flags (i) retries Returns: (i) name of a Windows EXE or DLL file. [optional] a bitmask of values that may be combined using the bitwise OR ('|')operator. See below. [optional] number of retries. Default is 7 retries (with a halfsecond delay between retries) before returning, if the specified application doesn't exist. You can override this by specifying different value for "retries", which may be >= 0 (0 = no retries). @TRUE if the specified application is running; @FALSE if the specified application is not running. Flags The following values may be specified: Value 1 2 Meaning current-session-only. "program-name" specifies a process ID instead of a program name Use this function to determine whether a specific Windows application is currently running. Unlike WinExist, you can use AppExist without knowing the title of the application's window. "Program-name" is the name of a Windows EXE or DLL file, including the file extension (and, optionally, a full path to the file). Note: In 32-bit versions of WIL, only 32-bit applications will be detected AppExist and AppWaitClose are not able to detect the existence of 16-bit DOS or Windows applications. In the 32-bit version under Windows NT, this function accepts module names instead of full program names. The module name is usually the same as the root name of the program, without the extension. With AppExist and AppWaitClose, any file 89 AppWaitClose extension or path information which is part of the 'program-name' parameter is ignored; so, for example, AppExist("c:\temp\notepad.exe") will return TRUE, if Notepad is running, regardless of what directory NOTEPAD.EXE is actually located in. Windows Vista or newer: This function may require an Administrator level account, because it relies on performance monitoring. Example: If AppExist("notepad.exe")==@FALSE Then Run("notepad.exe", "") See Also: AppWaitClose, RunWait, RunShell, WinExeName, WinExist AppWaitClose Suspends WIL program execution until a specified application has been closed. Syntax: AppWaitClose (program-name [, flags [, retries]] ) Parameters: (s) program-name (i) flags (i) retries Returns: (i) name of a Windows EXE or DLL file. [optional] a bitmask of values that may be combined using the bitwise OR ('|')operator. See below. number of retries. Default is 7 retries (with a half-second delay between tries) before returning, if the specified application doesn't exist. You can override this by specifying different value for "retries", which may be >= 0 (0 = no retries). @TRUE if the specified application is running; @FALSE if the specified application is not running. Flags The following values may be specified: Value 1 2 Meaning current-session-only. "program-name" specifies a process ID instead of a program name Use this function to suspend the WIL program's execution until the user has finished using a given application and has manually closed it. Unlike WinWaitClose, you can use AppWaitClose without knowing the title of the application's window. 90 ArrayFileGet "Program-name" is the name of a Windows EXE or DLL file, including the file extension (and, optionally, a full path to the file). Note: In 32-bit versions of WIL, only 32-bit applications will be detected AppExist and AppWaitClose are not able to detect the existence of 16-bit DOS or Windows applications. In the 32-bit version under Windows NT, this function accepts module names instead of full program names. The module name is usually the same as the root name of the program, without the extension. 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\notepad.exe",@FALSE) will return TRUE, if Notepad is running, regardless of what directory NOTEPAD.EXE is actually located in. Windows Vista or newer: This function may require an Administrator level account, because it relies on performance monitoring. Example: Run("notepad.exe", "") Display(4, "Note", "Close Notepad to continue") AppWaitClose("notepad.exe",@FALSE) Message("Continuing...", "Notepad closed") See Also: AppExist, TimeDelay, RunShell, RunWait, WinExeName, WinWaitClose, WinWaitExist, Yield ArrayFileGet Converts a file to a one-dimension array. Syntax: ArrayFileGet (filename [, null-char [, extra-alloc]]) Parameters: (s) filename (s) null-char (i) extra-alloc Returns: (a) path and file name of the file. [optional] specifies the character which NULL bytes in the file will be replaced with in the array. If omitted or a blank string(""), then NULL bytes will be removed. [optional] specifies the number of additional elements to add to the end of the array. If omitted, it will be 0. a one dimensional array. 91 ArrayFileGetCsv By default, the maximum supported file line length is 4096. This can be increased using IntControl 65. Example: filename = "c:\temp\test.txt" array = ArrayFileGet (filename , "" , 0) linecount = ArrInfo(array,6) Message("Number of lines in the file",linecount) See Also: Arrays, ArrayFileGetCsv, ArrayFilePut, ArrayFilePutCsv, Arrayize, ArrDimension, ArrInfo, ArrInitalize, Drop, IntControl 39 ArrayFileGetCsv Converts a Comma Seperated Values (.CSV) file to a two-dimension array. Syntax: ArrayFileGetCsv(filename, flags [, delimiter [, extra-rows [, extra-columns]]]) Parameters: (s) filename (i) flags (s) delimiter (i) extra-rows (i) extra-columns Returns: (a) path and file name of the file. see below. [optional] specifies the character used to separate values on each line of the file. It can be any single character except a space, null, carriage return, line feed or quotation mark (double quote). If omitted, a comma will be used as the delimiter. [optional] specifies the number of additional elements to add to the end of dimension 1 of the array. If omitted, it will be 0. [optional] specifies the number of additional elements to add to the end of dimension 2 of the array. If omitted, it will be 0. a two dimensional array. Note: A Comma Separated Values (.CSV) file is a file format used as a portable representation of a database. Each line is one entry or record and the fields in a record are separated by commas. Commas may be followed by arbitrary space and/or tab characters which are ignored. If field includes a comma, the whole field must be surrounded with double quotes. Line break handling within CSV files: WinBatch will not handle a line break within a field. WinBatch considers a line feed to be the end of a line. In this case, the layout of the CSV file will be disrupted or broken. 92 ArrayFilePut Flags can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value 1 Meaning treat leading and trailing whitespace as significant This function creates a two-dimension array and stores each line of the specified CSV file as rows and columns in the array. The first item on line 1 of the file is stored as array[0, 0], the second item on line 1 of the file is stored as array[0, 1], the first item on line 2 of the file is stored as array[1, 0], and so on. By default, the maximum supported file line length is 4096. This can be increased using IntControl 65. The file may not contain any NULL characters. Example: filename = "c:\temp\test.csv" array = ArrayFileGetCsv(filename, 0, ",", 0, 0) rowcount = ArrInfo(array,1) colcount = ArrInfo(array,2) Message(StrCat("Number of Rows in the file ",rowcount) StrCat("Number of Columns in the file ",colcount)) Message(StrCat("Number of Columns in the file ", colcount) See Also: Arrays, ArrayFileGet, ArrayFilePut, ArrayFilePutCsv, Arrayize, ArrDimension, ArrInfo, ArrInitalize, Drop, IntControl 39 ArrayFilePut Writes a one-dimension array to a file. Syntax: ArrayFilePut (filename, array [, write-undef]) Parameters: (s) filename (a) array (i) write-undef path and file name of the file to create. specifies an array. [optional] see below. Returns: (i) the number of bytes written to the file. If "write-undef" is @TRUE, then uninitialized elements in the array will be written as blank lines in the file. If "write-undef" is @FALSE, then uninitialized elements will not be written. 93 ArrayFilePutCsv This function writes a one-dimension array to a file, one element per line. If "filename" exists, it will be overwritten. By default, each line in the file will be terminated with a CR/LF. This can be changed using IntControl 53. Example: outputfile = "c:\temp\output.txt" filelist = FileItemize(StrCat(DirWindows(0),"*.*")) array = Arrayize(filelist,@tab) ArrayFilePut(outputfile, array, @TRUE) Message("Done","one-dimension array written to file") See Also: Arrays, ArrayFileGet, ArrayFileGetCsv, ArrayFilePutCsv, Arrayize, ArrDimension, ArrInfo, ArrInitaliz, Drop, IntControl 40 ArrayFilePutCsv Writes a two-dimension array to a Comma Seperated Values (.CSV) file. Syntax: ArrayFilePutCsv (filename, array [, delimiter [, write-undef [, flags]]) Parameters: (s) filename (a) array (s) delimiter (i) write-undef (i) flags Returns: (i) path and file name of the file to create. specifies an array. [optional] specifies the character used to separate values on each line of the file. It can be any single character except a space, tab, null, carriage return, line feed or quotation mark (double quote). If omitted, a comma will be used as the delimiter. [optional] see below. [optional] see below. the number of bytes written to the file. If "write-undef" is @TRUE, then uninitialized elements in the array will be written as blank values in the file. If "write-undef" is @FALSE, then uninitialized elements will not be written. "flags" can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value 94 Meaning Arrayize 2 Do not do CSV file double quote type processing. This should only be used in cases where you are sure the 'delimiter' will be found nowhere in the data. By default, each line in the file will be terminated with a CR/LF. This can be changed using IntControl 53. Line break handling within CSV files: WinBatch will not handle a line break within a field. WinBatch considers a line feed to be the end of a line. In this case, the layout of the CSV file will be disrupted or broken. Example: outputfile = "c:\temp\output.csv" array = ArrDimension(10,10) For x = 0 to 9 For y = 0 to 9 array[x,y] = x*y Next Next ArrayFilePutCsv(outputfile, array, ",",@TRUE,0) Message("Done","Two-dimension array written to file") See Also: Arrays, ArrayFileGet, ArrayFileGetCsv, ArrayFilePut, Arrayize, ArrDimension, ArrInfo, ArrInitalize, Drop, IntControl 40 Arrayize Converts a delimited list to an array. Syntax: Arrayize(list, delimiter) Parameters: (s)list (s)delimiter delimited list. list delimiter. Returns: (a) a one dimensional array. This function takes a delimited list, and creates a one-dimension array with the same number of elements as the number of items in the list, setting each element to the value of the corresponding item in the list. i.e., it converts a delimited list to an array. Example: list=FileItemize("*.*") array=Arrayize(list,@tab) For request = 1 to 6 95 ArraySwapElements info = ArrInfo (array, request) Message("Array info: Request %request%", info ) Next See Also: Arrays, ArrDimension, ArrInfo, ArrInitalize, Drop ArraySwapElements Swaps elements in an array. Syntax: ArraySwapElements( array, subA1, subA2, subA3, subA4, subA5, subB1, subB2, subB3, subB4, subB5 ) Parameters: (a) array (i) subA1 (i) subA2 (i) subA3 (i) subA4 (i) subA5 (i) subB1 (i) subB2 (i) subB3 (i) subB4 (i) subB5 specifies an array. subscript (dimension 1) of element 'A' or zero. subscript (dimension 2) of element 'A' or zero. subscript (dimension 3) of element 'A' or zero. subscript (dimension 4) of element 'A' or zero. subscript (dimension 5) of element 'A' or zero. subscript (dimension 1) of element 'B' or zero. subscript (dimension 2) of element 'B' or zero. subscript (dimension 3) of element 'B' or zero. subscript (dimension 4) of element 'B' or zero. subscript (dimension 5) of element 'B' or zero. Returns: (i) returns 1. This function swaps the values of two elements in an array. "subA1" to "subA5" specify the subscripts of element "A". "subB1" to "subB5" specify the subscripts of element "B". Specify "0" for unused dimensions. For example, to identify the array element "arr[1,5]", subA1 is 1 and subA2 is 5. Example: myarray=ArrDimension(2) myarray[0] = 1 myarray[1] = 2 ArraySwapElements( myarray,0,0,0,0,0,1,0,0,0,0 ) Message("ArraySwapElements","myarray[0] = ": myarray[0] :@CRLF: "myarray[1] = ":myarray[1]) See Also: Arrays, ArrDimension, ArrInfo, ArrInitalize, Drop 96 ArrDimension ArrDimension Creates an array. Syntax: ArrDimension(dim1 [, dim2] [,dim3] [,dim4] [,dim5]) Parameters: (i) "dim1"- "dim5" Returns: (a) an array of up to 5 dimensions. array that was created. Optional parameters are enclosed in square brackets "[ ]". ArrDimension takes a variable number of parameters, the variable parts will be followed by ellipses ("..."). The ArrDimension function takes at least one parameter. Optionally, you can specify up to five. If you do, you must separate the integers with commas. For example: 1-dimension array: 2-dimension array: 3-dimension array: 4-dimension array: 5-dimension array: array1 = ArrDimension(10) array2 = ArrDimension(10, 10) array3 = ArrDimension(10, 10, 10) array4 = ArrDimension(10, 10, 10, 10) array5 = ArrDimension(10, 10, 10, 10, 10) ArrDimension(10) creates a 1-dimension array with a size of 10 (10 elements). Since array subscripts are 0-based, the first element is arrayvar[0] and the last element is arrayvar[9]. An array can theoretically contain up to 200,000,000 elements in total. Of course this will be further limited by your available system memory. You can not create embedded arrays (i.e., an array within an array). You can use the Drop command to free an array. This will also Drop any COM/OLE object handles within the array, as well as any WIL string variables. It will NOT close any file handles or binary buffers. Example: totalfortunes=10 fortune=ArrDimension(totalfortunes) fortune[0] = "All your hard work will soon pay off." fortune[1] = "Winbatch will save you time." fortune[2] = "Your present plans are going to succeed." fortune[3] = "You will live a long time." fortune[4] = "One learns when teaching others." fortune[5] = "Success means competition." fortune[6] = "Your example will inspire others." fortune[7] = "One must be available, alert, active, and adaptable." fortune[8] = "If you have many best friends, you have no friends." 97 ArrInfo fortune[9] = "Mountains can move, but not your character." :Start ;Initialize the dialog BoxesUp("200,200,800,800", @zoomed) BoxCaption(1, "Pick a Fortune cookie") BoxColor(1,"201,200,150",0) BoxDrawRect(1,"0,0,1000,1000",2) dice=0 retry=0 ONCANCEL="Goto Shutdown" dice=askline("Pick a Fortune cookie","Enter a number between 1 and %totalfortunes%",1,0) If (dice >= 1 && dice <= totalfortunes) ;Display the fortune BoxCaption(1, "Your Fortune cookie says") BoxTextColor(1, "128,0,128") BoxTextFont(1, "Book Antiqua", 50, 10, 16) BoxDrawText(1, "0,200,1000,800", fortune[dice-1], @TRUE, 1) Timedelay(2) Else message("Your Fortune cookie says","Unfortunately...%@CRLF%You picked a wrong number.") Endif retry=AskYesNo("Pick a Fortune cookie","Do you want to try again") if retry == 1 then goto start exit :Cancel IntControl(72, 2, 0, 0, 0);Sets cancel processing %ONCANCEL% return :Shutdown retry=AskYesNo("Pick a Fortune cookie","Do you really want to EXIT?") if retry == 1 then exit Goto start SeeAlso: Arrays, Arrayize, ArrInfo, ArrInitalize, Drop ArrInfo Gets information about an array. Syntax: ArrInfo (array, request) Parameters: (a) array (i) request 98 specifies an array. a flag specifying the information to retrieve (see below). ArrInitialize Returns: (i) Request -1 0 1 2 3 4 5 6 depends on request. Returns checks if array is valid. Returns @TRUE if valid, @FALSE if invalid. number of dimensions in the array number of elements in dimension 1 number of elements in dimension 2 (or 0 if unused) number of elements in dimension 3 (or 0 if unused) number of elements in dimension 4 (or 0 if unused) number of elements in dimension 5 (or 0 if unused) number of elements in the entire array Example: myarray=ArrDimension(1,2,3,4,5) For request = 0 to 6 info = ArrInfo (myarray, request) Message("Array info: Request %request%", info ) Next See Also: Arrays, Arrayize, ArrDimension, ArrInitalize, Drop ArrInitialize Initializes an array. Syntax: ArrInitialize(array, value) Parameters: (a) array (i/f/s) value Returns: (i) specifies an array. specifies an integer, floating point, or string value. always @TRUE. This function sets all elements of "array" to "value". Example: myarray=ArrDimension(1,0,0,0,0) ArrInitialize(myarray, 0) message("Array","Initialized") 99 AskColor See Also: Arrays, Arrayize, ArrDimension, ArrInfo, Drop Asin Calculates the arcsine. Syntax: Asin(x) Parameters: (f) x floating point number whose arcsine is desired. Returns: (f) the Asin function returns the arcsine result of x. The Asin function returns the arcsine of x in the range -Π/2 to Π/2 radians. The value of x must be between -1 and 1 otherwise a domain error will occur. Example: real=AskLine("ArcSin", "Enter a real number between -1 and 1", "0.5",0) answer=Asin(real) Message("Arcsin of %real% is", answer) See Also: Acos, Atan, Cos, Sin, Tan AskColor Displays a color selection dialog box, and returns the selected color. Syntax: AskColor(default-color, reg-key, format) Parameters: (s) default-color (s) reg-key (i) format Returns: (s) 100 specifies an RGB color value in the form "#RRGGBB". specifies the name of a user-defined registry key under "HKEY_CURRENT_USER\Software\Wilson WindowWare" where persistent state information will be stored. It will be created if it does not already exist. If "" is specified, persistent state information will not be stored. specifies the format in which the selected color will be returned. See below. RGB color value in requested format. AskDirectory default-color Specifies an RGB color value in the form "#RRGGBB", where "RR" is the red component in hex (00-FF), "GG" is the green component in hex (00-FF), and "BB" is the blue component in hex (00-FF). This will be the color initially selected in the dialog. You may specify "" for a default of gray. Format 0 1 Meaning RGB color value in the form "#RRGGBB" (see above). RGB color value in the form "R|G|B", where "R", "G", and"B" are the respective red, green, and blue components, in decimal. Example: color0=AskColor("","test",0) Message("Color in #808080 format",color0) color1=AskColor("","test",1) Message("Color in 128|128|128 format",color1) See Also: AskFont AskDirectory Displays a directory browse dialog box, and returns the selected directory name. Syntax: AskDirectory(prompt, browse-root, start-dir, confirm-prompt, flags) Parameters: (s) prompt Prompt to be displayed in the dialog box above the list of directories. This can be a blank string ("") if no prompt is desired. Note that the title of the dialog box ("Browse for Folder") cannot be changed. (s) browse-root Directory under which the user can browse for directories. The user will not be able to browse above this level. You can specify a blank string ("") to allow the entire file system (all drives, directories, and network shares) to be browsed. (s) start-dir Directory which will be selected by default when the dialog box is initially displayed. This can be a blank string (""), in which case the top of the tree will be selected (same as 'browse-root'). (s) confirm-prompt The title of the confirmation message box (see 'flags' #2, below). 101 AskDirectory (i) flags Returns: (s) Flags One or more of the optional flags (see below), combined using the binary OR ("|") operator, or 0 if none are desired. the string containing the directory path selected in the browse dialog. If the user presses "Cancel", standard WIL ":cancel" processing will be performed. Meaning 0 None of the following apply. 1 Display an edit field in the dialog box, in which the user can type the name of a directory which may or may not exist. This name will be relative to the currently selected directory name in the browse list. If the user types a name in the edit field (see flag #1), of a directory which does not exist, this flag causes a confirmation message box to be displayed, showing the name of the directory that would be returned by the function, and containing three buttons: Yes, No, and Cancel. If the user selects 'Yes', the function returns. If the user selects 'No', the directory browse dialog remains displayed, and the user can re-edit the name or select a different directory. 'Cancel' causes the function to return, and standard WIL ":cancel" processing to be performed. Use the new user interface. Setting this flag provides the user with a larger dialog box that can be resized. The dialog box has several new capabilities including: drag and drop capability within the dialog box, shortcut menus, new folders, delete, and other shortcut menu commands. Do not include the "New Folder" button in the browse dialog box NOTE: This is supported only in Windows XP or newer. In older versions of Windows, this flag is ignored. Suppress "Drive not ready" errors. 2 4 8 16 The title of the message box is specified by 'confirm-prompt'. Example: flags=1|2 dir1=AskDirectory("Select Working Directory for Winbatch", "C:\Program Files\WinBatch", "","Are you sure?",flags) Message("Directory Path selected was", dir1) exit 102 AskFileName and then: See Also: AskFileText, AskItemList, AskLine, AskFileName AskFileName Returns the filename as selected by a File Open dialog box. Syntax: AskFileName(title, directory, filetypes, default filename, flag) Parameters: (s) title (s) directory (s) filetypes title of the file name select box. initial drive and directory. file type selection definition (see below). 103 AskFileName (s) default filename (i) flag Returns: (s) default filename or mask. 0 for Save style 1 for Open style 2 for Open style, allowing multiple files to be selected. 3 for Save style, with no "Replace" confirmation. a string containing the filename and path. This function is the equivalent of a standard Common Dialog File Open or a File Save dialog box. The initial drive and directory is logged, and either a File Save or a File Open dialog box is presented to the user. The default filename or mask is filled in, as well as a selection of filetypes. The user can either type in a filename or select one via the file list box. File types displayed may be selected from the File Type drop down list box. The File Type drop down list box is specified via the filetypes parameter. The filetype parameter is defined as follows: filetypes := Description|Mask| [ Description|Mask| ...] Description := Any human readable string Mask := filespec [; filespec ...] filespec := DOS File wildcard mask Basically, a description - visible to the user in the drop down list box, followed by the vertical bar symbol(|), followed by a file mask - for the computer, followed by another vertical bar. This description may be repeated for each desired file type selection. Note: If the "flag" specified is 2 (Open Style, allowing multiple files to be selected), the selected files will be returned as a tab delimited list. The combined file names selected cannot exceed 2048 characters, otherwise the AskFileName dialog will be re-displayed. In other words, the number of files that can be selected is limited. Do not use this function to select multiple files, if the potential number of files to be selected, could exceed this maximum. AskFileName changes the current working directory to that of the selected file. Example: types="All Files|*.*|WIL Files|*.wbt;*.mnu|Text Files|*.txt|" fn1=AskFileName("SelectFile", "C:\WinBatch", types, "Sol.wbt", 1) Message("File selected was", fn1) which produces: 104 AskFileText and then: See Also: AskFileText, AskItemList, AskLine, AskDirectory AskFileText Allows the user to choose an item from a list box initialized with data from a file. Syntax: AskFileText(title, filename, sort mode, select mode [, selection-required] ) Parameters: (s) title (s) filename (i) sort mode (i) select mode title of the list box. path and filename of file to display. @sorted for an alphabetic list. @unsorted to display the text as is. @single to limit selection to one item. @multiple allow selection of more than one item. @extended to allow selection of multiple items by extending the selection with the mouse or shift key. 105 AskFont (i) selection-required [optional] @TRUE the OK button will be greyed out until an item is selected in the listbox, @FALSE default. Returns: (s) the selected item or items. If more than one item is selected it will be returned as a tab delimited list. This function loads a file into a Windows list box, either as is or sorted alphabetically, and displays the list box to the user. The line or lines highlighted by the user (if any) will be returned to the program as a tab delimited list. AskFileText has two primary uses: First, it can be used to display multi-line messages to the user. In addition, because of its ability to return selected lines, it may be used as multiple choice question box. If the user does not make a selection, a null string ("") is returned. If disk drive and path are not part of the filename, the current directory will be examined first, and then the Environment PATH path will be searched to find the desired file. The function IntControl 63 can be used to set the coordinates for AskFileText, AskItemList and AskTextBox windows. AskItemList and AskFileText support multiple selection up to 32,767 items. AskFileText uses the line length set by IntControl 65 (4096 characters by default). Example: A=AskFileText("win.ini", "c:\windows\win.ini", @unsorted, @single, @false) Message("The line chosen was", A) See Also: AskItemList, AskFileName, AskLine, AskDirectory AskFont Displays a font selection dialog box, and returns information on the selected font. Syntax: AskFont( type, flags, reg-key, format) Parameters: (i) type (i) flags (s) reg-key 106 specifies the type of fonts to be listed. restricts the fonts that are listed. specifies the name of a user-defined registry key under "HKEY_CURRENT_USER\Software\Wilson WindowWare" where persistent state information will be stored. It will be created if it does not already exist. If "" is specified, persistent state information will not be stored. AskFont (i) format specifies the format in which the selected font will be returned. See below. Returns: (s) RGB color value in requested format. Type Specifies the type of fonts to be listed, and can be one of the following values: Value 0 1 2 Meaning Screen fonts Printer fonts Both screen and printer fonts If "type" is 1 or 2, a default printer must be installed, otherwise an error will occur. Flags restricts the fonts that are listed, and can be 0 or more of the following values combined with the bitwise OR ('|') operator. Value 1 2 4 8 16 32 64 Meaning List only script fonts (exclude OEM and Symbol character sets) List only non-vector fonts List only fixed-pitch fonts List only fonts available on both the printer and the display List only scalable fonts List only TrueType fonts List only horizontally oriented fonts If flag 8 is specified, "type" will automatically be set to 2. Format specifies the format in which information about the selected font will be returned: Value 0 Meaning Tab-delimited string in the format: LogFont[@TAB]PointSize[@TAB]Color[@TAB]FontType LogFont a vertical-bar delimited string containing font attributes. See the Windows Interface Language help file for a description of the LOGFONT format string. PointSize 107 AskItemList the font size in 1/10 of a point. Color the font color, as an RGB color value in the form "#RRGGBB". See the AskColor function for a description. FontType a bitmask specifying the font type, consisting of one or more of the following values which can be extracted with the bitwise AND ('&') operator: Value 256 512 1024 8192 16384 32768 Meaning The font weight is bold The italic font attribute is set The font weight is normal The font is a screen font The font is a printer font The font is simulated by the graphics device interface (GDI) Example: type=0 flags=0 customkeyword="test" format=0 MyFont=AskFont( type, flags, customkeyword, format ) Message("AskFont return value is",MyFont) See Also: AskColor AskItemList Allows the user to choose an item from a list box initialized with a list variable. Syntax: AskItemList(title, list variable, delimiter, sort mode, select mode [,selection-required] ) Parameters: (s) title (s) list variable (s) delimiter (i) sort mode 108 title of the list box. a string containing a list of items. a character to act as a delimiter between items in the list. @sorted for an alphabetic list. @unsorted to display the list of items as is. AskItemList (i) select mode @single to limit selection to one item. @multiple to allow selection of more than one item. @extended to allow selection of multiple items by extending the selection with the mouse or shift key. (i) selection-required [optional] @TRUE the OK button will be greyed out until an item is selected in the listbox, @FALSE default. Returns: (s) blank string if no items were selected, or the selected item(s). This function displays a list box. The list box is filled with a list of items, sorted or unsorted, taken from a string you provide to the function. Each item in the string must be separated ("delimited") by a character, which you also pass to the function. The user selects one of the items by either double clicking on it, or single-clicking and pressing OK. The item is returned as a string. If you create the list with the FileItemize or DirItemize functions your delimiter will be a tab-delimited list. For more information on delimiters see File Delimiters, (pg. 69). The line(s) highlighted by the user (if any) will be returned to the program. If multiple lines are selected, they will be separated by the specified delimiter. If the user does not make a selection, a null string ("") is returned. The function IntControl 45 can be used to set the coordinates for AskFileText, AskItemList and AskTextBox windows. AskItemList and AskFileText support multiple selection up to 32,767 items. To change the file delimiter to a character of your own choosing, using IntControl (29,p1,0,0,0). The function IntControl 63 can be used to set the coordinates for AskFileText, AskItemList and AskTextBox windows. Example: ;Prompts user to chose a color from a list list = StrCat("Red",@tab,"Blue",@tab,"Yellow",@tab,"Green") A = AskItemList("Colors", list, @tab, @sorted, @single, @false) Message("The item selected is", A) 109 AskLine produces: See Also: AskFileText, AskFileName, AskDirectory AskLine Prompts the user for one line of input. Syntax: AskLine (title, prompt, default [,format]) Parameters: (s) title (s) prompt (s) default (i) format title of the dialog box. question to be put to the user. default answer. [optional] specifies the format of the returned string. Returns: (s) user response. 'Format' specifies the format of the returned string. Format 0 1 2 Meaning ANSI string (default) Unicode string hex string, with four hex bytes per Unicode character. Use this function to query the user for a line of data. The entire user response will be returned if the user presses the OK button or the Enter key. If the user presses the Cancel button or the Esc key, the processing of the WIL program is canceled. 110 AskLine Example: name = AskLine("Game", "Please enter your name", "", 0) game = AskLine("Game", "Favorite game?", "Solitaire",0) message(StrCat(name,"'s favorite game is "), game) produces: And then… And then, if Richard types "Scramble" and clicks on the OK button: See Also: AskPassword, AskYesNo, Dialog, Display, AskItemList, Message, Pause, AskFileText, AskDirectory 111 AskTextBox AskPassword Prompts the user for a password. Syntax: AskPassword (title, prompt) Parameters: (s) title (s) prompt title of the dialog box. question to be put to the user. Returns: (s) user response. Pops up a special dialog box to ask for a password. An asterisk (*) is echoed for each character that the user types; the actual characters entered are not displayed. The entire user response will be returned if the user presses the OK button or the Enter key. If the user presses the Cancel button or the Esc key, the processing of the WIL program is canceled. Example: pw = AskPassword("Security check", "Please enter your password") If StriCmp(pw, "Erin") == 0 Run(Environment("COMSPEC"), "") Exit else Pause("Security breach", "Invalid password entered") endif exit See Also: AskLine, AskYesNo, Dialog, AskDirectory AskTextBox Prompts the user for multiple lines of input. Syntax: AskTextBox( title, prompt, default, flags, reserved) Parameters: (s) title (s) prompt (s) default (i) flags (i) reserved title of the dialog box. question to be put to the user. default answer. see below. reserved for future use, should be set to 0. Returns: (s) the text input by user. 112 AskYesNo "default" can contain multiple lines of text, using embedded @CRLF's. "flags" can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value 0 1 2 Meaning none of the following apply do not automatically wrap text place cursor at end of default text (instead of highlighting it) The return value is whatever the user enters in the edit box. If multiple lines of text are entered, they will be delimited in the returned string with @CRLF's. Note: a horizontal scroll bar is added if "flag" number 1 is specified. Also, the cursor is scrolled into view if "flag" number 2 is specified. The function IntControl 63 can be used to set the coordinates for AskFileText, AskItemList and AskTextBox windows. Example: ret=AskTextBox( "User satisfaction","Please type any comments here", "NOCOMMENT", 0, 0) if ret=="NOCOMMENT" message("User input","Default returned. No user input" ) else message("User input",ret) endif exit See Also: AskLine, AskYesNo, Dialog AskYesNo Prompts the user for a Yes or No answer. Syntax: AskYesNo (title, question) Parameters (s) title (s) question title of the question box. question to be put to the user. Returns: (i) @YES or @NO, depending on the button pressed. This function displays a message box with three pushbuttons - Yes, No, and Cancel. 113 Atan Example: q = AskYesNo('Testing', 'Please press "YES"') If q == @YES Then Exit Display(3, 'ERROR', 'I said press "YES"') exit produces: ... and then, if the user presses No: See Also: AskLine, AskPassword, Dialog, Display, AskItemList, Message, Pause, AskFileText Atan Calculates the arc tangent. Syntax: Atan(x) Parameters: (f) x floating point number whose arc tangent is desired. Returns: (f) the arc tangent result of x. The Atan function calculates the arc tangent of x. If x is 0 a domain error occurs. Example: real=AskLine("ArcTan", "Enter a real number ", "34.6", 0) answer=Atan(real) Message("ArcTan of %real% is", answer) See Also: Acos, Asin, Cos, Sin, Tan 114 Beep Average Returns the average of a list of numbers. Syntax: Average(list) Parameters: (f) list comma delimited floating point numbers to be averaged. Returns: (f) the average of the numbers. Use this function to compute the mean average of a series of numbers, delimited by commas. It adds the numbers provided as parameters, and then divides by the number of parameters. This function returns a floating point value. Example: avg = Average(1.7, 2.6, 3, 4, 5, 6, 7, 8, 9, 10.6, 11, 12) Message("The average is", avg) See Also: Abs, Fabs, Max, Min, Random Beep Beeps once. Syntax: Beep Parameters: (none) Returns: (not applicable) Use this command to produce a short beep, generally to alert the user to an error situation or to get the user's attention. Example: Beep Pause("WARNING!!!", "You are about to destroy data!") See Also: PlayMedia, PlayMidi, PlayWaveForm, Sounds 115 BinaryAlloc Binary Operations WIL contains a number of functions designed to allow direct access to areas - buffers - of computer memory. By managing and working with these buffers using the assorted Binary functions provided, you can implement a number of operations that otherwise would be tedious and time consuming. Using the Binary functions, you can perform edits on any sort of file, build new files, build data structures, and do high-speed editing of multiple files. If you understand the structure of a data file, you can perform fast look-ups of data with these functions. The principal, required Binary functions are BinaryAlloc and BinaryFree. The BinaryAlloc function allows you to allocate a buffer of almost any size. You may have up to 128 separate buffers allocated at one time. When operations are complete with a particular buffer, the BinaryFree function is used to return it to the system. There are BinaryRead and BinaryWrite functions to read files into allocated buffers, and to write the contents of buffers back to files. A BinaryCopy function can move sections of one buffer to another, allowing buffers to be broken up and recombined in different fashions. A set of peek and poke functions, BinaryPeek, BinaryPeekStr, BinaryPoke, and BinaryPokeStr allow direct editing and modification of the buffers. These functions can initialize a buffer that can be passed to a third party Dll via the DllCall function. A BinaryIndex function is available to assist in searching buffers for known data patterns. Some of these functions require you pass an offset parameter. Please note: The offset is a 'pointer' that represents some distance from the start of the binary buffer (which is zero). The BinaryStrCnt function can quickly scan a buffer and return the number of occurrences of particular data patterns. A couple of functions to get and set the End-of-Data point of each buffer (which is automatically tracked), BinaryEodGet and BinaryEodSet, and the average unreconstructed hacker has all the tools necessary to become a real hazard to the community at large. BinaryAlloc Allocates a memory buffer of the desired size. Syntax: BinaryAlloc(size) Parameters: (i) size Returns: (i) 116 size in bytes of the desired memory buffer. a handle to a buffer of the desired size, or @FALSE if the allocation fails. BinaryAllocArray Use this function to allocate a memory buffer for Binary operations. Up to 128 separate buffers may be allocated concurrently. Nearly any reasonably sized buffer may be allocated. Windows users may allocate over 10 million bytes, assuming sufficient system memory and page file space is available. While users of 32 bit Windows versions may allocate, theoretically, over 2 billion bytes, the real, practical bounds are not established and will vary with system configuration. When operations on a particular buffer are complete, it should be released with the BinaryFree function. Example: ; This example edits the Config.sys file ; by adding a new line to the bottom of the file. ; fs=FileSize("C:\CONFIG.SYS") ; Allocate a buffer the size of your file + 100 bytes. binbuf = BinaryAlloc(fs+100) if binbuf == 0 Message("Error", "BinaryAlloc Failed") else ; Read the file into the buffer. BinaryRead(binbuf, "C:\CONFIG.SYS") ; Append a line to the end of the file in buffer. BinaryPokeStr(binbuf, fs, "DEVICE=C:\FLOOGLE.SYS%@crlf%") ; Write modified file back to the file from the buffer. BinaryWrite(binbuf, "C:\CONFIG.SYS") binbuf=BinaryFree(binbuf) endif Message("BinaryAlloc", "Done.") See Also: BinaryAllocArray, Binary Operations, BinaryBufInfo, BinaryCopy, BinaryFree, BinaryRead, DllCall BinaryAllocArray Allocates a memory buffer and copies the contents of an array. Syntax: BinaryAllocArray( Array) Parameters (a) Array Specifies an array. Returns: (i) a handle to a buffer that contains a copy of the array. This function is intended to convert binary data from an array of binary data, such as an image returned by a OLE/COM function to it's original form, so that it may be subsequently written to disk. 117 BinaryAllocArray Use this function to allocate a memory buffer that contains a copy of the contents of an array. The memory buffer’s size is automatically set to hold a copy of the entire array. The array elements must be integers, floating point numbers or one of the COM Automation types from the list below: Variant-type I1 I2 I4 R4 R8 BOOL CY DATE UI1 UI2 UI4 INT UINT DECIMAL Value to specify A 1-byte character value A 2-byte integer value A 4-byte integer value 32-bit IEEE floating point value. 64-bit IEEE floating point value. A Boolean (True/False) value A currency value, specified as a string in the form "#CURRENCY:value". A date/time value, specified as a string in Ymd or YmdHms format 1-byte unsigned integer. 2-byte unsigned integer. 4-byte unsigned integer. 4-byte signed integer value (equivalent to I4). 4-byte unsigned integer (equivalent to VT_UI4). A decimal value, specified as a string in the form "#DECIMAL:value". You can use the ObjectTypeGet function to determine the type of a COM array element. All array elements must be of the exact same type. For example, the function will fail, if the array elements are both integers and floating point numbers. Text array elements are not supported. If you want to create an integer array from scratch where each array element is treated as a one or two byte value, use ObjectType with the first parameter set to "U1" or "U2" respectively. For example, aBytes = ArrDimension(2) aBytes[0] = ObjectType("U1",65 ) aBytes[1] = ObjectType("U1", 90) will create a byte array with two elements. This function only accepts single dimensional arrays. 118 BinaryAnd The following example uses the BinaryAllocArray function to copy an image to a binary buffer so that it can be saved to a local file. The image is retrieved from a host internet site as an array of bytes or “ARRAY|U1” as returned by ObjectTypeGet. Example: ; Create a local file name. path = "c:\temp\" imagefile = "http://www.google.com/images/logo.gif" localname = StrCat(path, ItemExtract(ItemCount(imagefile, "/"), imagefile, "/")) ; Get an image from the internet. WinHttpReq = ObjectCreate("WinHttp.WinHttpRequest.5.1");WinXP SP 1 WinHttpReq.Open("GET", imagefile, @FALSE) WinHttpReq.Send x = WinHttpReq.ResponseBody ; Convert to binary buffer. BinBuf = BinaryAllocArray(x) ; Write binary buffer to a file. BinaryWrite(BinBuf, localname) ; Cleanup WinHttpReq = 0 BinaryFree(BinBuf) See Also: BinaryAlloc, BinaryWrite, Binary Operations, ObjectType, ObjectTypeGet BinaryAnd Performs a bitwise AND on portions of two binary buffers. Syntax: BinaryAnd(target-handle, target-offset, source-handle, source-offset, count) Parameters: (i) target-handle: (i) target-offset: (i) source-handle: (i) source-offset: (i) count: Returns: (i) handle of target buffer. zero-based offset into the target buffer specifying where the data to be processed starts, and where the result of the operation should be placed. handle of source buffer. zero-based offset into the source buffer specifying where the data to be processed starts. the number of bytes to process. always 1. 119 BinaryBufInfo The specified sections of the buffers are processed on a byte-by-byte basis, and the results are written to the buffer specified by "target-handle". i.e., the byte at "sourceoffset" is AND'ed with the byte at "target-offset", and the result of the AND operation is stored in the byte at "target-offset", then the bytes at "source-offset + 1" and "target-offset + 1" are AND'ed, and so on. "target-handle" and "source-handle" may both reference the same buffer, in which case two sections of the buffer can be processed. Example: buf1 = BinaryAlloc(10) buf2 = BinaryAlloc(10) for i = 0 to 9 BinaryPoke(buf1, i, 5) BinaryPoke(buf2, i, 6) next ; this stuffs 5's into buf1 ; this stuffs 6's into buf2 rc = BinaryAnd(buf1, 0, buf2, 0, 3) a=BinaryPeek( b=BinaryPeek( c=BinaryPeek( d=BinaryPeek( e=BinaryPeek( buf1, buf1, buf1, buf1, buf1, 0 1 2 3 4 ; This replaces values in buf1 ) ) ) ) ) binaryWrite(buf1, "zzbin1.txt") ; if you want to see the values ; you can write it out with BinaryWrite binaryWrite(buf2, "zzbin2.txt") ; ; ; ; ; AND LOGIC: 5 = 0101 6 = 0110 ======== 4 = 0100 = result Message("Variables a, b, and c should now = 4", "a = %a%%@crlf%b = %b%%@crlf%c = %c%%@crlf%") See Also: Binary Operations, BinaryAlloc, BinaryCopy, BinaryFree, BinaryRead, DllCal, BinaryCompare BinaryBufInfo Returns information about the binary buffer. Syntax: BinaryBufInfo( handle, request) 120 BinaryCheckSum Parameters: (i) handle (i) request handle of binary buffer. -1,0,1, or 2. see below. Returns: (i) depends on request. Request -1 0 1 2 Description Checks if binary buffer handle is valid. Returns @TRUE if valid, @FALSE if invalid. Get the size of the allocated binary buffer. Get the address of a pointer to a binary buffer. See also IntControl 42. Get a pointer to the beginning of the free area just past the already initialized data in a buffer. See also BinaryEodGet. Example: fs = FileSize( "C:\CONFIG.SYS" ) binbuf = BinaryAlloc( fs ) size = BinaryBufInfo(binbuf, 0) BinaryFree(binbuf) Message("Size of Binary Buffer", size) See Also: Binary Operations, BinaryAlloc, BinaryEodGet, IntControl 42 BinaryCheckSum Returns the MD5 digest (fingerprint) or simple CRC of a binary buffer. Syntax: BinaryCheckSum(handle, request) Parameters: (i) handle (i) request handle of buffer. specifies the type of digest or CRC to generate. See below. Returns: (s) a hex-value string. request specifies the type of digest or CRC to generate, and can be one of the following values: Request 0 1 Meaning MD5 digest 16-bit CRC Return String Format (x=hex character) "xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx" "xxxx" 121 BinaryClipGet 2 32-bit CRC "xxxxxxxx" Example: fn="C:\testfile.txt" fs=FileSize(fn) bb=BinaryAlloc(fs) BinaryRead(bb,fn) MD5=BinaryChecksum(bb,0) BinaryFree(bb) Message("MD5 Fingerprint",strcat(fn,@crlf,MD5)) See Also: BinaryAlloc, BinaryFree BinaryClipGet Reads the contents of the Windows clipboard into a binary buffer. Syntax: BinaryClipGet ( handle, format) Parameters: (i) handle: (i) format: handle of buffer. format of clipboard data. Returns: (i) the number of bytes read from the clipboard. Note: 0 in the first parameter of BinaryClipGet returns the size of buffer needed for a subsequent BinaryAlloc, but doesn't attempt to place the contents of clipboard into a buffer. The following is a list of possible clipboard formats. Note that some of them may not be supported, because the clipboard contains a pointer or handle to external data instead of the data itself. 1 2 3 4 5 6 7 8 9 10 11 12 122 F_TEXT F_BITMAP (not supported) F_METAFILEPICT F_SYLK F_DIF CF_TIFF CF_OEMTEXT CF_DIB CF_PALETTE CF_PENDATA CF_RIFF CF_WAVE BinaryClipPut 13 14 15 16 128 129 130 131 142 CF_UNICODETEXT CF_ENHMETAFILE CF_HDROP CF_LOCALE CF_OWNERDISPLAY CF_DSPTEXT CF_DSPBITMAP CF_DSPMETAFILEPICT CF_DSPENHMETAFILE Example: ;Takes a bitmap snapshot of the screen and pastes it to the clipboard. Snapshot(0) ;returns the size of buffer needed for a subsequent BinaryAlloc, ;but doesn't attempt to place the contents of clipboard into a buffer size=BinaryClipGet(0,8) ;allocates a data buffer bb=BinaryAlloc(size) ;read file format type CF_DIB BinaryClipGet(bb,8) ; need to add first 14 bytes to make it ; a BMP file format bmpdatasize=14 bb2=BinaryAlloc(size + bmpdatasize) ;The characters identifying the bitmap.'BM' BinaryPokeStr(bb2, 0, "BM") ;Complete file size in bytes. BinaryPoke4(bb2,2,size + bmpdatasize) ;Reserved BinaryPoke4(bb2,6,0) ;Data offset headersize=BinaryPeek4(bb,0) dataoffset = headersize + bmpdatasize BinaryPoke4(bb2,10,dataoffset) BinaryCopy(bb2,bmpdatasize,bb,0,size) BinaryWrite(bb2,"c:\temp\screenshot.bmp") BinaryFree(bb) BinaryFree(bb2) Message("All","Done") See Also: BinaryClipPut, BinaryPoke, BinaryAlloc, ClipGet, ClipGetEx BinaryClipPut Writes a binary buffer to the Windows clipboard. Syntax: BinaryClipPut(handle, format) 123 BinaryClipPut Parameters: (i) handle: (i) format: handle of buffer. format of clipboard data. Returns: (i) returns 1. Note: that this function destroys the previous contents of the clipboard. The following is a list of possible clipboard formats. Note that some of them may not be supported, because the clipboard contains a pointer or handle to external data instead of the data itself. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 128 129 130 131 142 F_TEXT F_BITMAP (not supported) F_METAFILEPICT F_SYLK F_DIF CF_TIFF CF_OEMTEXT CF_DIB CF_PALETTE CF_PENDATA CF_RIFF CF_WAVE CF_UNICODETEXT CF_ENHMETAFILE CF_HDROP CF_LOCALE CF_OWNERDISPLAY CF_DSPTEXT CF_DSPBITMAP CF_DSPMETAFILEPICT CF_DSPENHMETAFILE Example: file = "c:\b\1clip.bmp" format = 8 size = FileSize(file) buf = BinaryAlloc(size) BinaryRead(buf, file) rc = BinaryClipPut(buf, format) Message("BinaryClipPut returned", rc) See Also: BinaryClipGet, BinaryPoke, BinaryAlloc 124 BinaryConvert BinaryCompare Compares portions of two binary buffers. Syntax: BinaryCompare ( handle1, offset1, handle2, offset2, count) Parameters: (i) handle1 (i) offset1 (i) handle2 (i) offset2 (i) count Returns: (i) handle of first buffer. zero-based offset into the first buffer specifying where the data to be compared starts. handle of second buffer. zero-based offset into the second buffer specifying where the data to be compared starts. the number of bytes to compare. @TRUE if the sections are identical; @FALSE otherwise. The specified sections of the buffers are compared on a byte-by-byte basis. This function is case-sensitive. "handle1" and "handle2" may both reference the same buffer, in which case two sections of the buffer can be compared. Example: buf1 = BinaryAlloc(10) buf2 = BinaryAlloc(10) BinaryPokeStr(buf1, 0, "Hello") BinaryPokeStr(buf2, 0, "Hello") rc = BinaryCompare(buf1, 0, buf2, 0, 4) Message("BinaryCompare returned", rc) See Also Binary Operations, BinaryAlloc, BinaryCopy, BinaryFree, BinaryRead, DllCall BinaryConvert Converts a binary buffer. Syntax: BinaryConvert(handle, source-type, target-type, code-page, flags) Parameters: (i) handle (i) source-type (i) target-type (i) code-page handle of buffer. format of existing data in buffer. format of data which the buffer will be converted to. any valid code page on your system. 125 BinaryConvert (i) flags Returns: (i) additional options. the new binary EOD (end of data) for the buffer. This function can be used to perform the following types of conversions: 8-bit <-> Unicode Multibyte <-> Unicode ANSI <-> OEM -> Uppercase -> Lowercase "Source-type" and "target-type" can be one of the following: Type 0 1 2 3 Meaning 8-bit ANSI 8-bit OEM Multibyte (e.g., double-byte) Unicode Conversions from 8-bit (types 0 or 1) to or from multibyte (type 2) are not supported. If you need to perform this type of conversion, you can do it in two steps, using Unicode as an intermediate stage (e.g., ANSI to Unicode, then Unicode to multibyte). For conversions to or from Unicode, a code page must be specified for the 8-bit (non-Unicode) character set. "Code-page" can be any valid code page on your system, or one of the following default code pages: Type 0 1 2 Meaning ANSI OEM Macintosh For conversions which don't involve Unicode, "code-page" is ignored. "Flags" can be one of the following: Flag 1 2 Meaning Convert to uppercase Convert to lowercase Note: that Unicode uses two bytes for each character. Therefore, for conversions to Unicode, the binary buffer must be large enough to hold at least twice as much data 126 BinaryCopy as is currently in the buffer. i.e., if you are trying to convert a buffer which contains a 40-character string to Unicode, the buffer must be at least 80 bytes in size, because the resulting Unicode string will be 80 bytes long. Example: buf = BinaryAlloc(20) BinaryPokeStr(buf, 0, "Helloß") rc = "" string = BinaryPeekStr(buf, 0, BinaryEodGet(buf)) Message(rc, string) rc = BinaryConvert(buf, 2, 3, 0, 1) string = BinaryPeekStr(buf, 0, BinaryEodGet(buf)) Message(rc, string) See Also: Binary Operations, BinaryAlloc, BinaryCopy, BinaryFree, BinaryRead, DllCall BinaryCopy Copies bytes of data from one binary buffer to another. Syntax: BinaryCopy(handle targ, offset targ, handle src, offset src, count) Parameters: (i) handle targ (i) offset targ (i) handle src (i) offset src (i) count Returns: (i) handle of target buffer. zero-based offset into the target buffer specifying where the data to be copied should be placed. handle of the source buffer. zero-based offset into the source buffer specifying where the data to be copied starts. the number of bytes to copy. number of bytes actually copied. The byte count may be lower than that specified in the command if the source block does not contain sufficient data. Use this function to move blocks of data from one binary buffer to another one. "Count" bytes are transferred from the "handle-src" buffer starting at "offset-src" to the "handle-targ" buffer starting at "offset-targ". Example: ; This example edits the config.sys file ; and adds a new line at the top of the file. fs1 = FileSize("C:\CONFIG.SYS") binbuf1 = BinaryAlloc(fs1) BinaryRead(binbuf1, "C:\CONFIG.SYS") binbuf2=binaryalloc(fs1 + 200) n = BinaryPokeStr(binbuf2, 0, "Rem Note new line at top") 127 BinaryEodSet a2=BinaryCopy(binbuf2, n, binbuf1, 0, fs1) BinaryWrite(binbuf2, "C:\CONFIG.SYS") binbuf2 = BinaryFree(binbuf2) binbuf1 = BinaryFree(binbuf1) Message("BinaryCopy", "Done.") See Also: Binary Operations, BinaryAlloc, BinaryFree, BinaryRead, BinaryReadEx BinaryWrite, BinaryWriteEx BinaryEodGet Returns the offset of the free byte just after the last byte of stored data. Syntax: BinaryEodGet(handle) Parameters: (i) handle handle of buffer. Returns: (i) offset of the free byte just after the last byte of stored data. Use this function to determine the beginning of the free area just past the already initialized data in a buffer. This value is automatically set by any Binary function that modifies the buffer. Example: ; This example adds three lines to the ; config.sys file. fs1 = FileSize( "C:\CONFIG.SYS" ) binbuf1 = BinaryAlloc( fs1 + 100 ) BinaryRead( binbuf1, "C:\CONFIG.SYS" ) a = BinaryEodGet( binbuf1 ) BinaryPokeStr( binbuf1, a, "REM ADDING a = BinaryEodGet( binbuf1 ) BinaryPokeStr( binbuf1, a, "REM ADDING a = BinaryEodGet( binbuf1 ) BinaryPokeStr( binbuf1, a, "REM ADDING BinaryWrite( binbuf1, "C:\CONFIG.SYS") BinaryFree( binbuf1 ) Message("BinaryEODGet", "Done.") end of the FIRST NEW LINE TO END%@CRLF%") SECOND LINE TO END%@CRLF%" ) THIRD LINE TO END%@CRLF%") See Also: Binary Operations, BinaryAlloc, BinaryEodSet, BinaryIndex, BinaryIndexNc BinaryEodSet Sets the EOD (end of data) value of a buffer. 128 BinaryFree Syntax: BinaryEodSet(handle, offset) Parameters: (i) handle (i) offset handle of buffer. desired offset to set the end-of-data value to. Returns: (i) previous value. Use this function to update the EOD value. This can be done when data at the end of a buffer is to be discarded, or when the buffer has been modified by an external program - such as via a DllCall. Example: ; This function extracts the first line from the ; config.sys file and writes it to a new file. fs1 = FileSize("C:\CONFIG.SYS") binbuf1 = binaryalloc( fs1 + 100) BinaryRead(binbuf1, "C:\CONFIG.SYS") a = BinaryIndex(binbuf1, 0, @CRLF, @FWDSCAN) ; we just found the end of first line a = a + 2 ; add 2 to skip crlf BinaryEodSet(binbuf1, a) BinaryWrite(binbuf1, "firstlin.txt") binbuf1 = BinaryFree(binbuf1) Message("BinaryEODSet", "Done.") See Also: Binary Operations, BinaryAlloc, BinaryEodGet, BinaryIndex, DllCall BinaryFree Frees a buffer previously allocated with BinaryAlloc. Syntax: BinaryFree(handle) Parameters: (i) handle handle of buffer to free. Returns: (i) always 0. Use this function to free a binary buffer previously allocated by the BinaryAlloc function. After freeing the buffer, no further operations should be performed on the buffer or its handle. Example: fs=FileSize("C:\CONFIG.SYS") binbuf = BinaryAlloc(fs+100) 129 BinaryHashRec if binbuf == 0 Message("Error", "BinaryAlloc Failed") else BinaryRead(binbuf, "C:\CONFIG.SYS") BinaryPokeStr(binbuf, fs, "DEVICE=C:\FLOOGLE.SYS%@crlf%") BinaryWrite(binbuf, "C:\CONFIG.SYS") binbuf=BinaryFree(binbuf) endif Message("BinaryFree", "Done.") See Also: Binary Operations, BinaryAlloc BinaryHashRec Returns a pointer to a record in a binary buffer. Syntax: BinaryHashRec(handle, recsize, key offset, key size, key value) Parameters: (i) handle (i) recsize (i) key offset (i) key size (i) key value Returns: (i) handle of buffer. specifies the fixed length of each record. the offset within a record of the key field (where the first byte in the record is 0). specifies the size of the key field, in bytes. the value of the key field to be searched for. the starting position of a record in a binary buffer. This function uses a hashing algorithm to calculate a hash value for the specified "key value", which provides an offset into the binary buffer. It starts searching at that offset for either (1) a record with a key field whose first byte is a 0, or (2) a record with a key field whose value is the same as "key value". For case (1), it stores "key value" in the key field of the found record, and returns the offset of the beginning of that record. For case (2), the offset of the record is returned but not stored. If an appropriate record cannot be found (i.e., if the buffer is full), it returns an error. Note: The binary buffer must consist of fixed-length records. Each record must contain a fixed-length key field in a fixed position. Example: ; In this example, we are going to choose a bunch of fruits ; at random, look the fruit up in a hash table, increment how many ; times each fruit occurs, sort the table when we are done, and write ; a report to a file. fruits="apple pear banana apricot kiwi orange peach grape grapefruit" fruitcount=ItemCount(fruits," ")-1 namesize=20 130 BinaryIncr countsize=4 recsize=namesize+countsize nameoffset=0 countoffset=20 tableentries=100 ; note hash tables should be 20-40 percent bigger than your data tablesize=tableentries*recsize hash=BinaryAlloc(tablesize) For x=1 to 1000 afruit=ItemExtract(Random(fruitcount)+1,fruits," ") offset=BinaryHashRec(hash,recsize,nameoffset,namesize,afruit) BinaryIncr4(hash,offset+countoffset) next BinarySort(hash,recsize,countoffset,countsize,@WORD4|@ASCENDING) offset=0 Report="" While offset<tablesize if offset==0 if BinaryPeek(hash,0)==0 offset=BinaryIndex(hash,recsize,"",@FWDSCAN) endif else offset=BinaryIndex(hash,offset,"",@FWDSCAN) endif if offset==0 then break afruit=BinaryPeekStr(hash,offset,namesize) acount=BinaryPeek4(hash,offset+countoffset) offset=offset+recsize Report=strcat(report,afruit," ",acount,@crlf) endwhile BinaryFree(hash) Message("Random Fruit Report",Report) See Also: BinarySort, BinaryIncr, BinaryPeek, BinaryPoke BinaryIncr Peeks at a value, increments the value by 1 then pokes the value back into the buffer. Syntax: BinaryIncr(handle, offset) BinaryIncr2(handle, offset) BinaryIncr4(handle, offset) BinaryIncrFlt(handle, offset) Parameters: (i) handle Incr an 8 bit value. Incr a 16 bit value. Incr a 32 bit value. Incr a 64 bit floating point number. handle of buffer. 131 BinaryIndex (i) offset Returns: (i/f) offset in the buffer to obtain bytes from. new byte value. BinaryIncr is equivalent to doing a BinaryPeek, incrementing the extracted value by 1, and then doing a BinaryPoke to store the new value. Example: Binbuf=BinaryAlloc(10) BinaryPoke( binbuf, 5, -14 ) ;Pokes a new value into the buffer. a=BinaryPeek( binbuf, 5 ) ;Finds the value of a byte. Message("Hmmm", "Returned value is %a%" ) ; Value will be 242 which is (256 - 14). 242 and -14 map ; to the same 8bit number. See Also: Binary Operations, BinaryCopy, BinaryPeekStr, BinaryPoke, BinaryPokeStr BinaryIndex Searches a buffer for a string. (case sensitive) Syntax: BinaryIndex(handle, offset, string, direction) Parameters: (i) handle (i) offset (s) string (i) direction Returns: (i) handle of buffer. zero-based offset in the buffer to begin search. the string to search for within the buffer. the search direction. @FWDSCAN searches forwards, while @BACKSCAN searches backwards. offset of string within the buffer, or 0 if not found. This function searches for a "string" within a buffer. Starting at the "offset" position, it goes forwards or backwards depending on the value of the "direction" parameter. It stops when it finds the "string" within the buffer and returns the string's beginning offset. Notes: BinaryIndex has been superseded with the function BinaryIndexEx. The string parameter may be composed of any characters except the null (00) character. A blank string ("") can be specified for the "string" parameter, in which case the function will return the offset of the first non-NULL character found, starting at "offset". 132 BinaryIndexBin The return value of this function is possibly ambiguous. A zero return value may mean the string was not found, or it may mean the string was found starting at offset 0. If there is a possibility that the string to be searched for could begin at the beginning of the buffer, you must determine some other way of resolving the ambiguity, such as using BinaryPeekStr. The string being searched for has to appear in the file 'as is'. In some files, such as word processing documents or spreedsheets the string you see in the application may not exist in searchable form in the file. This function does not support Unicode files. Example: ; Find line number of line in config.sys where HIMEM occurs fs1 = FileSize( "C:\CONFIG.SYS" ) binbuf1 = binaryalloc( fs1 ) a1 = BinaryRead( binbuf1, "C:\CONFIG.SYS" ) a = BinaryIndexNc( binbuf1, 0, "HIMEM", @FWDSCAN ) ; find HIMEM if a == 0 Message("Hmmm", "HIMEM not found in CONFIG.SYS file") else c = BinaryStrCnt( binbuf1, 0, a, @CRLF) + 1 Message("Hmmm", "HIMEM found on line %c%") endif See Also: Binary Operations, BinaryCopy, BinaryEodGet, BinaryEodSet, BinaryIndexBin, BinaryIndexEx, BinaryIndexNc, BinaryStrCnt BinaryIndexBin Searches a buffer for an item. Syntax: BinaryIndexBin(handle, offset, item, direction, match-case) Parameters: (i) handle (i) offset (s/i) item handle of buffer. zero-based offset in the buffer to begin search. specifies the item to be searched for. It may be either a hex string indicating the bytes to search for (two hex characters per byte), or the handle of a binary buffer containing the bytes to search for. If "item" is a blank string or an empty binary buffer, "offset" will be returned. 133 BinaryIndexEx (i) direction (i) match-case Returns: (i) offset the search direction. @FWDSCAN searches forwards, while @BACKSCAN searches backwards. specify 1 for a case-sensitive search, or 0 for a caseinsensitive search. offset where the item was found, or -1 if not found. This function is like BinaryIndexEx, but can search for strings containing NULL bytes. Example: ; Search a (Unicode) .REG file for a string regfile = "C:\TEST.REG" lookfor = "00" fs1 = FileSize( regfile ) binbuf1 = binaryalloc( fs1 ) a1 = BinaryRead( binbuf1, regfile ) a = BinaryIndexBin( binbuf1, 0, lookfor, @FWDSCAN ,0);find HIMEM if a == -1 Message("Hmmm", StrCat("String not found in ", regfile," file")) else c = BinaryStrCnt( binbuf1, 0, a, @CRLF) + 1 Message("Hmmm", StrCat(lookfor," found on line ",c)) endif See Also: BinaryCopy, BinaryIndex, BinaryIndexNc BinaryEodGet, BinaryEodSet, BinaryStrCnt. BinaryIndexEx Searches a buffer for a string. This function is very similar to BinaryIndex and BinaryIndexNc, except this function will return -1, if the specified string was not found. Syntax: BinaryIndexEx(handle, offset, string, direction, match-case) Parameters: (i) handle (i) offset (s) string (i) direction (i) match-case 134 handle of buffer. zero-based offset in the buffer to begin search. the string to search for within the buffer. the search direction. @FWDSCAN searches forwards, while @BACKSCAN searches backwards. This function is almost the same as BinaryIndex (if "match-case" = 1) and BinaryIndexNc (if "match-case" =0). BinaryIndexNc Returns: (i) offset of string within the buffer, if the specified string is not found, this function returns -1 (unlike BinaryIndex and BinaryIndexNc , which return 0). Note: This function is almost the same as BinaryIndex (if "match-case" = @TRUE) and BinaryIndexNc (if "match-case" = @FALSE). The one difference: if the specified string is not found, this function returns -1 (unlike those other functions, which return 0). The string parameter may be composed of any characters except the null (00) character. A blank string ("") can be specified for the "string" parameter, in which case the function will return the offset of the first non-NULL character found, starting at "offset". The string being searched for has to appear in the file 'as is'. In some files, such as word processing documents or spreedsheets the string you see in the application may not exist in searchable form in the file. This function does not support Unicode files. Example: ; Find line number of line in config.sys where HIMEM occurs fs1 = FileSize( "C:\CONFIG.SYS" ) binbuf1 = binaryalloc( fs1 ) a1 = BinaryRead( binbuf1, "C:\CONFIG.SYS" ) a = BinaryIndexEx( binbuf1, 0, "HIMEM", @FWDSCAN ,0);find HIMEM if a == -1 Message("Hmmm", "HIMEM not found in CONFIG.SYS file") else c = BinaryStrCnt( binbuf1, 0, a, @CRLF) + 1 Message("Hmmm", "HIMEM found on line %c%") endif See Also: Binary Operations, BinaryCopy, BinaryEodGet, BinaryEodSet, BinaryIndex, BinaryIndexBin, BinaryIndexNc, BinaryStrCnt BinaryIndexNc Searches a buffer for a string, ignoring case. Syntax: BinaryIndexNc(handle, offset, string, direction) Parameters: (i) handle (i) offset (s) string handle of buffer. zero-based offset in the buffer to begin search. the string to search for within the buffer. 135 BinaryOleType (i) direction Returns: (i) the search direction. @FWDSCAN searches forwards, while @BACKSCAN searches backwards. offset of string within the buffer, or 0 if not found. This function is like BinaryIndex, but performs a case-insensitive search for a "string" within a buffer. Starting at the "offset" position, it goes forwards or backwards depending on the value of the "direction" parameter. It stops when it finds the "string" within the buffer and returns the string's beginning offset. Notes: BinaryIndexNc has been superseded with the function BinaryIndexEx. The string parameter may be composed of any characters except the null (00) character. A blank string ("") can be specified for the "string" parameter, in which case the function will return the offset of the first non-NULL character found, starting at "offset". The return value of this function is possibly ambiguous. A zero return value may mean the string was not found, or it may mean the string was found starting at offset 0. If there is a possibility that the string to be searched for could begin at the beginning of the buffer, you must determine some other way of resolving the ambiguity, such as using BinaryPeekStr. The string being searched for has to appear in the file 'as is'. In some files, such as word processing documents or spreedsheets the string you see in the application may not exist in searchable form in the file. This function does not support Unicode files. Example: ; Find line number of line in config.sys where HIMEM occurs fs1 = FileSize( "C:\CONFIG.SYS" ) binbuf1 = binaryalloc( fs1 ) a1 = BinaryRead( binbuf1, "C:\CONFIG.SYS" ) a = BinaryIndexNc( binbuf1, 0, "HIMEM", @FWDSCAN ) ; find HIMEM if a == 0 Message("Hmmm", "HIMEM not found in CONFIG.SYS file") else c = BinaryStrCnt( binbuf1, 0, a, @CRLF) + 1 Message("Hmmm", "HIMEM found on line %c%") endif See Also: Binary Operations, BinaryCopy, BinaryIndex, BinaryIndexBin, BinaryIndexEx, BinaryEodGet, BinaryEodSet, BinaryStrCnt BinaryOleType Specifies how a binary buffer will be used by COM/OLE functions. 136 BinaryOleType Syntax: BinaryOleType(handle, type, reserved-1, reserved-2, reserved-3) Parameters: (i) handle (i) type (i) reserved-1 (i) reserved-2 (i) reserved-3 Returns: (i) handle of buffer. specifies what type of parameter the buffer will represent, see below. reserved for future use, specify as 0. reserved for future use, specify as 0. reserved for future use, specify as 0. @TRUE if successful. @FALSE if unsuccessful. BinaryOleType defines the attributes of the binary buffer specified by "handle", which determines what happens when you use the binary buffer handle as a parameter to an COM/OLE object (i.e., one created with the ObjectOpen function). 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 COM/OLE object. This function does not modify any data in the binary buffer itself. When an COM/OLE object is called, and one of the parameters is a binary buffer handle, the following actions are automatically taken: 1. An internal COM/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" parameter), any data in the binary buffer (up to the binary EOD) is converted as necessary to the specified format and copied to the COM/OLE buffer. 3. The COM/OLE buffer is passed to the COM/OLE object. When the COM/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 COM/OLE buffer is copied back to the binary buffer. If it is possible to determine how much data was returned in the COM/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 COM/OLE buffer is freed. 137 BinaryOleType TYPE "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 1 2 3 4 5 6 7 8 9 10 11 undefined BSTR (VT_BSTR) BSTR* (VT_BSTR | VT_BYREF) byte array (VT_UI1 | VT_ARRAY) I1 pointer (VT_I1 | VT_BYREF) I2 pointer (VT_I2 | VT_BYREF) I4 pointer (VT_I4 | VT_BYREF) UI1 pointer (VT_UI1 | VT_BYREF) UI2 pointer (VT_UI2 | VT_BYREF) UI4 pointer (VT_UI4 | VT_BYREF) R4 pointer (VT_R4 | VT_BYREF) R8 pointer (VT_R8 | VT_BYREF) direction: 100 200 300 input parameter output parameter input/output parameter Example: ;Wake on LAN example #DefineFunction Hex2Dec(hex) str="0123456789ABCDEF" hex=StrTrim(StrUpper(hex)) hexlen=StrLen(hex) dec=0 for x=1 to hexlen dec=(dec*16) + StrIndex(str,strsub(hex,x,1),0,@fwdscan) -1 next return(dec) #EndFunction BCastAddr="10.10.10.255" ; Set network broacast address here MacAddress="11:22:33:44:55:66" ; Set MAC address of machine to wake up here bbpacket=BinaryAlloc( (6*33) + 6) BinaryOLEType(bbpacket,103,0,0,0) BinaryPoke(bbpacket,0,255) BinaryPoke(bbpacket,1,255) BinaryPoke(bbpacket,2,255) BinaryPoke(bbpacket,3,255) BinaryPoke(bbpacket,4,255) 138 BinaryOr BinaryPoke(bbpacket,5,255) For yy=0 to 15 For xx=1 to 6 mm=ItemExtract(xx,MacAddress,":") mm=Hex2Dec(mm) BinaryPoke(bbpacket,5+xx+(yy*6),mm) next next ;The WinSock OCX has a distribution problem in that ;it sometimes is not installed properly. This is ;reported to fix it... if RegExistKey(@REGCLASSES,"Licenses\2c49f800-c2dd-11cf-9ad60080c7e7b78d") == @FALSE ErrorMode(@off) flag=RegSetValue(@REGCLASSES,"Licenses\2c49f800-c2dd-11cf-9ad60080c7e7b78d","mlrljgrlhltlngjlthrligklpkrhllglqlrk") ErrorMode(@cancel) if flag==0 Message("Error","Admin access required to set registry key.") exit endif endif objSocket = ObjectOpen("MSWinsock.Winsock") objSocket.Protocol = 1 ;UDP objSocket.RemoteHost = BCastAddr objSocket.SendData(bbpacket) ObjectClose(objSocket) BinaryFree(bbpacket) Message("All","Doned") exit See Also: Binary Operations, BinaryAlloc, BinaryCopy, BinaryFree, BinaryRead, BinaryReadEx, DllCall BinaryOr Performs a bitwise OR on portions of two binary buffers. Syntax: BinaryOr(target-handle, target-offset, source-handle, source-offset, count) Parameters: (i) target-handle: (i) target-offset: (i) source-handle: handle of target buffer. zero-based offset into the target buffer specifying where the data to be processed starts, and where the result of the operation should be placed. handle of source buffer. 139 BinaryPeek (i) source-offset: (i) count: Returns: (i) zero-based offset into the source buffer specifying where the data to be processed starts. the number of bytes to process. always 1. The specified sections of the buffers are processed on a byte-by-byte basis, and the results are written to the buffer specified by "target-handle". i.e., the byte at "sourceoffset" is OR'ed with the byte at "target-offset", and the result of the OR operation is stored in the byte at "target-offset", then the bytes at "source-offset + 1" and "targetoffset + 1" are OR'ed, and so on. "target-handle" and "source-handle" may both reference the same buffer, in which case two sections of the buffer can be processed. Example: buf1 = BinaryAlloc(10) buf2 = BinaryAlloc(10) for i = 0 to 9 BinaryPoke(buf1, i, 5) ; this stuffs 5's into buf1 BinaryPoke(buf2, i, 6) ; this stuffs 6's into buf2 next BinaryOr(buf1, 0, buf2, 0, 3) ; This replaces values in buf1 a=BinaryPeek( buf1, 0 ) b=BinaryPeek( buf1, 1 ) c=BinaryPeek( buf1, 2 ) d=BinaryPeek( buf1, 3 ) e=BinaryPeek( buf1, 4 ) ;binaryWrite(buf1, "zzbin1.txt") ; if you want to see the values ;binaryWrite(buf2, "zzbin2.txt") ; you can write it out with BinaryWrite ; OR LOGIC: ; 5 = 0101 ; 6 = 0110 ; ======== ; 7 = 0111 Message("Variables a, b, and c should now = 7", "a = %a%%@crlf%b = %b%%@crlf%c = %c%%@crlf%") See Also: Binary Operations, BinaryAlloc, BinaryCopy, BinaryFree, BinaryRead, BinaryReadEx, BinaryCompare, BinaryAnd BinaryPeek Returns the value of a byte from a binary buffer. 140 BinaryPeekHex Syntax for BinaryPeek Functions: BinaryPeek(handle, offset) BinaryPeek2(handle, offset) BinaryPeek4(handle, offset) BinaryPeekFlt(handle, offset) Peeks an 8 bit value. Peeks a 16 bit value. Peeks a 32 bit value. Peeks a 64 bit floating point number. Parameters: (i) handle (i) offset handle of buffer. zero-based offset in the buffer to obtain bytes from. Returns: (i/f) new byte value. Use these functions to return the value of a number in the binary buffer. The BinaryPeek's extract 8, 16, or 32 bytes (respectively) beginning at "offset". BinaryPeekFlt treats the 64 bytes it extracts as a 8 byte floating point number. Example: binbuf=BinaryAlloc(10) BinaryPoke( binbuf, 5, -14 ) ;Pokes a new value into the buffer. a=BinaryPeek( binbuf, 5 ) ;Finds the value of a byte. Message("Hmmm", "Returned value is %a%" ) ; Value will be 242 which is (256 - 14). 242 and -14 map ; to the same 8bit number. See Also: Binary Operations, BinaryCopy, BinaryPeekStr, BinaryPoke, BinaryPokeStr BinaryPeekHex Extracts data from a binary buffer as a hex string. Syntax: BinaryPeekHex(handle, offset, count) Parameters: (i) handle (i) offset (i) count Returns: (s) handle of buffer. zero-based offset in the buffer to obtain byte from. specifies the number of bytes to read from the buffer. a hex string, containing 2 hex characters for each byte read from the buffer.. Example: binbuf=BinaryAlloc(1) BinaryPokeStr( binbuf, 0, "A" ) ;Pokes a new value into the buffer ret=BinaryPeekHex( binbuf, 0, 1) ;Finds the hex value of the letter A 141 BinaryPeekStr Message("Hmmm", "Hex value of A is %ret%" ) exit See Also: Binary Operations, BinaryPokeHex, BinaryCopy, BinaryIncr, BinaryPeekStr, BinaryPoke, BinaryPokeStr BinaryPeekStr Extracts a string from a binary buffer. Syntax: BinaryPeekStr(handle, offset, maxsize) Parameters: (i) handle (i) offset (i) maxsize Returns: (s) handle of buffer. offset in the buffer the string starts at. maximum number of bytes in string. string starting at "offset" location in binary buffer. String consists of all non-zero bytes up to the first zero byte or "maxsize" number of bytes. This function is used to extract string data from a binary buffer. The desired starting "offset" and a "maxsize" are passed to the function. The function returns a string of bytes, starting at the specified "offset", and continuing until either a zero byte is found (which terminates the string) or the "maxsize" number of bytes have been copied into the return string. Example: ; This example searches the Config.sys for the first ; occurrence of the string HIMEM. It then extracts ; the line containing the string and prints it out. fs = FileSize( "C:\CONFIG.SYS" ) binbuf = BinaryAlloc( fs ) BinaryRead( binbuf, "C:\CONFIG.SYS" ) ; Search for first occurrence of HIMEM. himem = BinaryIndex( binbuf, 0, "HIMEM", @FWDSCAN) ; Single out beginning of line which contains HIMEM string, ; skipping over the @crlf. linebegin = BinaryIndex( binbuf, himem, @CRLF, @BACKSCAN) + 2 ; Search for the end of the line which contains the HIMEM string. lineend = BinaryIndex( binbuf, himem, @CRLF, @FWDSCAN) linelen = lineend-linebegin+1 ; Extract the line with HIMEM string. linedata=BinaryPeekStr(binbuf, linebegin, linelen) binbuf=BinaryFree(binbuf) Message("Himem.sys line in config.sys reads", linedata) 142 BinaryPoke See Also: Binary Operations, BinaryCopy, BinaryPeek, BinaryPeekStrW, BinaryPoke, BinaryPokeStr BinaryPeekStrW Extracts a Unicode string from a binary buffer. Syntax: BinaryPeekStrW( handle, offset, maxsize [,reverse-bytes]) Parameters: (i) handle (i) offset (i) maxsize (i) reverse bytes Returns: (s) handle of buffer. zero-based offset in the buffer where the string starts. maximum number of bytes in string. Must be an even number. @FALSE default. @TRUE the bytes in each Unicode character are reversed from the normal byte order. Unicode string. This function is used to extract Unicode string data from a binary buffer. The desired starting offset and a maxsize are passed to the function. The function returns a Unicode string of bytes, starting at the specified offset and continuing until the end of the string is reached, when a Unicode NULL character is found (which terminates the string) or the maxsize number of bytes have been copied into the return string. Example: unicodestr = ChrHexToUnicode("480065006C006C006F00");Hello bytecnt = StrByteCount ( unicodestr, 1) buf = BinaryAlloc(bytecnt) BinaryPokeStrW( buf, 0, unicodestr) unicodestr = BinaryPeekStrW( buf, 0, bytecnt ) BinaryFree(buf) Message("Unicode String", unicodestr) See Also: Binary Operations, BinaryCopy, BinaryPeek, BinaryPeekStrBinaryPoke, BinaryPokeStr BinaryPoke Pokes a new value into a binary buffer at offset returning the previous value. 143 BinaryPokeHex Syntax for BinaryPoke Functions: BinaryPoke(handle, offset, value) BinaryPoke2(handle, offset, value) BinaryPoke4(handle, offset, value) BinaryPokeFlt(handle, offset, value) Pokes an 8 bit value. Pokes a 16 bit value. Pokes a 32 bit value. Pokes a 64 bit floating point number. Parameters: (i) handle (i) offset (i) or (f) value handle of buffer. zero-based offset in the buffer to store byte(s). value to store. Returns: (i/f) previous value. This function pokes a value into the binary buffer at the offset specified. Example: BinaryPoke( binbuf, 5, -14 ) ;Pokes a new value into the buffer. a=BinaryPeek( binbuf, 5 ) ;Finds the value of a byte. Message("Hmmm", "Returned value is %a%" ) ; Value will be 242 which is (256 - 14). 242 and -14 map ; to the same 8bit number. See Also: Binary Operations, BinaryPokeHex, BinaryPokeStr, BinaryPokeStrW BinaryPokeHex Writes data in a hex string form into a binary buffer. Syntax: BinaryPokeHex( handle, offset, hex-string) Parameters: (i) handle (i) offset (s) hex-string Returns: (i) handle of buffer. zero-based offset in the buffer to store string. is a hex string, containing 2 hex characters for each byte that will be written to the buffer. number of bytes stored. Example: binbuf=BinaryAlloc(1) BinaryPokeHex( binbuf, 0, "41" ) ret=BinaryPeekStr( binbuf, 0, 1) Message("Hmmm", "String value of hex 41 is %ret%" ) exit 144 BinaryPokeStr See Also: Binary Operations, BinaryPoke, BinaryPoke2, BinaryPoke4, BinaryPokeFlt, BinaryPokeStr, BinaryPokeStrW BinaryPokeStr Writes a string into a binary buffer. Syntax: BinaryPokeStr(handle, offset, string) Parameters: (i) handle (i) offset (s) string handle of buffer. offset in the buffer to store string. string to store into buffer. Returns: (i) number of bytes stored. This function is used to write string data into a binary buffer. There must be sufficient space in the buffer between the offset and the allocated end of the buffer to accommodate the string. Note: The string parameter may be composed of any characters except the null (00) character. If a null character is found, it will be assumed that the string ends at that point. If you need to store a null character into a binary buffer, use the BinaryPoke function. Example: ; This example writes a new device= line to SYSTEM.INI ; It is *very* fast NewDevice = "DEVICE=COOLAPP.386"; ; Change to the Windows Directory DirChange(DirWindows(0)) ; Obtain filesize and allocate binary buffers fs1=FileSize("SYSTEM.INI") srcbuf = BinaryAlloc(fs1) editbuf = BinaryAlloc(fs1+100) ; Read existing system.ini into memory BinaryRead( srcbuf, "SYSTEM.INI") ; See if this change was already installed. If so, quit a = BinaryIndexNc( srcbuf, 0, "COOLAPP.386", @FWDSCAN) if a != 0 then goto AlreadyDone ; Find 386Enh section. a = BinaryIndexNc( srcbuf, 0, "[386Enh]", @FWDSCAN) ; Find beginning of next line ( add 2 to skip over our crlf ) cuthere = BinaryIndexNc( srcbuf, a, @CRLF, @FWDSCAN) + 2 ; Copy data from beginning of file to just after [386Enh} ; to the edit buffer BinaryCopy( editbuf, 0, srcbuf, 0, cuthere) 145 BinaryPokeStrW ; Add the device= line to the end of the edit buffer, and add a CRLF BinaryPokeStr(editbuf,BinaryEodGet(editbuf), Strcat(NewDevice,@CRLF)) ; Copy remaining part of source buffer to the edit buffer a = BinaryEodGet(editbuf) b = BinaryEodGet(srcbuf) BinaryCopy( editbuf, a, srcbuf, cuthere, b-cuthere); ; Save file out to disk. Use system.tst until it is ; completely debugged BinaryWrite( editbuf, "SYSTEM.TST") ; Close binary buffers :AlreadyDone BinaryFree(editbuf) BinaryFree(srcbuf) Message("BinaryPokeStr", "Done.") See Also: Binary Operations, BinaryPoke, BinaryPoke2, BinaryPoke4, BinaryPokeFlt, BinaryPokeHex, BinaryPokeStrW BinaryPokeStrW Writes a Unicode string into a binary buffer. Syntax: BinaryPokeStrW(handle, offset, string [, reverse-bytes]) Parameters: (i) handle (i) offset (s) string (i) reverse bytes Returns: (i) handle of buffer. zero-based offset in the buffer to store string. string to store into buffer. @FALSE default. @TRUE the bytes in each Unicode character are reversed from the normal byte order. number of bytes stored. This function is used to write Unicode string data into a binary buffer. There must be sufficient space in the buffer between the offset and the allocated end of the buffer to accommodate the string. Each character in a Unicode-string requires 2 bytes in the buffer. The return value is the number of bytes written. Example: unicodestr = ChrHexToUnicode("480065006C006C006F00");Hello bytecnt = StrByteCount ( unicodestr, 1) buf = BinaryAlloc(bytecnt) BinaryPokeStrW( buf, 0, unicodestr) unicodestr = BinaryPeekStrW( buf, 0, bytecnt ) BinaryFree(buf) Message("Unicode String", unicodestr) 146 BinaryReadEx See Also: Binary Operations, BinaryPoke, BinaryPoke2, BinaryPoke4, BinaryPokeFlt, BinaryPokeHex, BinaryPokeStr BinaryRead Reads a file into a binary buffer. Syntax: BinaryRead(handle, filename) Parameters: (i) handle (s) filename handle of buffer. file to read into buffer. Returns: (i) the number of bytes read. This function reads the entire contents of a file into a buffer then returns the number of bytes read. The buffer must be large enough to hold the entire file. The file is placed into the buffer starting at offset 0. Example: ; This example edits the Config.sys file by adding a line ; to the bottom of the file. fs=FileSize("C:\CONFIG.SYS") binbuf = BinaryAlloc(fs+100) if binbuf == 0 Message("Error", "BinaryAlloc Failed") else BinaryRead(binbuf, "C:\CONFIG.SYS") BinaryPokeStr(binbuf, fs, "DEVICE=C:\FLOOGLE.SYS%@crlf%") BinaryWrite(binbuf, "C:\CONFIG.SYS") binbuf=BinaryFree(binbuf) endif Message("BinaryRead", "Done.") See Also: Binary Operations, BinaryAlloc, BinaryFree, BinaryReadEx, BinaryWrite, BinaryWriteEx, IntControl 39 BinaryReadEx Reads a portion of a file into a binary buffer. Syntax: BinaryReadEx ( handle, binary-offset, filename, file-offset, count) 147 BinaryReadEx Parameters: (i) handle (i) binary-offset (i) filename (i) / (t) file-offset: (i) count Returns: (i) handle of buffer. zero-based offset into the buffer specifying where the data should be stored. file to read into buffer. zero-based offset into the file specifying where the data to be read starts. This parameter accepts a huge number data type. the number of bytes to read. the number of bytes read. This function reads "count" bytes from "filename", beginning at "file-offset". It then writes the data to the buffer specified by "handle", beginning at "binary-offset". Any existing data in the buffer within the range "binary-offset + count" is overwritten with the new data; any existing data outside that range is left untouched. If "file-offset" + "count" is larger than the file size, or if "count" is -1, "count" will be ignored and it will be treated as a request to read from "file-offset" to the end of the file. file-offset BinaryReadEx and BinaryWriteEx accept a huge number for the "file-offset". A huge number is a long decimal number string, which may represent a number too large to be converted to an integer. Example: file = "hello.txt" buf = BinaryAlloc(100) BinaryPokeStr(buf, 0, "12345") rc = BinaryReadEx(buf, 2, file, 4, 1) Message("BinaryReadEx returned", rc) eod = BinaryEodGet(buf) Message("BinaryEod is", eod) string = BinaryPeekStr(buf, 0, eod) Message("BinaryPeekStr returned", string) See Also: Binary Operations, BinaryAlloc, BinaryFree, BinaryWrite, BinaryWriteEx, BinaryRead, IntControl 39 148 BinarySort BinaryReplace Replaces strings in a binary buffer. Syntax: BinaryReplace( handle, search-string, replace-string, match-case) Parameters: (i) handle (s) search string (s) replace-string (i) match-case Returns: (i) handle of buffer. specifies the string to be replaced. Specify a blank string ("") to indicate that the search string is a NULL character. specifies the string with which "search-string" will be replaced. Specify a blank string ("") to indicate that "search-string" should be removed and not replaced with anything. @TRUE to indicate that "search-string" is case-sensitive, or @FALSE if case should be ignored. number of occurrences of "search-string" that were replaced. This function searches a binary buffer, and replaces all occurrences of "searchstring" with "replace-string". Each time an occurrence of "search-string" is replaced, processing continues right after the replacement string that was inserted in its place. If "replace-string" is longer than "search-string", the binary buffer must be large enough for all the new strings to fit. Example: str="hello" rep="goodbye" dafile="C:\Temp\myfile.txt" fs = FileSize( dafile ) binbuf = binaryalloc( fs+100 ) ret = BinaryRead( binbuf, dafile ) num = BinaryReplace( binbuf, str, rep ,0) Message( "Number of '%str%' strings replaced", num ) BinaryWrite( binbuf, dafile ) BinaryFree( binbuf) exit See Also: BinaryAlloc, BinaryIndexEx, BinaryIndexNC BinarySort Sorts records in a binary buffer. 149 BinarySort Syntax: BinarySort(handle, recsize, key offset, key size, flags) Parameters: (i) handle (i) recsize (i) key offset (i) key size (i) flags Returns: (i) handle of buffer. specifies the size of each record. the offset within a record of the key field (where the first byte in the record is 0). specifies the size of the key field, in bytes. see below. @TRUE if successful. @FALSE if unsuccessful. BinarySort sorts records in a binary buffer in place, updating the existing buffer. String sorts are case-insensitive. The flags consist of a maximum of one value from each of the following groups, combined with the binary OR ("|") operator. If either (or both) is not specified, the default value will be used: Flags: Sort sequence: @ASCENDING (default) @DESCENDING Key type: @STRING @WORD1 @WORD2 @WORD4 @FLOAT8 (default) BYTE - 8 bit integer WORD - 16 bit integer DWORD - 32 bit integer 8 byte floating point number Note: The binary buffer must consist of fixed-length records. Each record must contain a fixed-length key field in a fixed position. Example: fh=FileOpen("test.in","WRITE") ; Note: Each record is 40 chars (recsize+crlf) ; offsets.....0000000000111111111122222222223333333333 ; offsets.....0123456789012345678901234567890123456789 FileWrite(fh,"0001 Flintstone Fred (111)222-1334") FileWrite(fh,"0002 Duck Donald (271)333-2334") FileWrite(fh,"0003 Duck Daffy (222)444-3334") FileWrite(fh,"0004 Hedgehog Sonic (215)555-4334") FileWrite(fh,"0005 Mario Super (212)666-5334") FileWrite(fh,"0006 Kent Clark (234)777-6334") FileWrite(fh,"0007 Lane Lois (987)888-7334") FileWrite(fh,"0008 Mouse Mickey (765)999-8334") FileWrite(fh,"0009 Coyote Wiley (853)111-9334") ; length......0000000001111111111222222222233333333334 150 BinaryStrCnt ; length......1234567890123456789012345678901234567890 ; Note that offset position and ordinal position are not the same. FileClose(fh) RecSize=40 NameOffset=5 NameSize=20 dbsize=FileSize("test.in") db=BinaryAlloc(dbsize) BinaryRead(db,"test.in") BinarySort(db,RecSize,NameOffset,NameSize,@STRING|@ASCENDING) BinaryWrite(db,"test.out") BinaryFree(db) Message("Sort Complete","Launching Notepad") Run("Notepad.exe","test.in") Run("Notepad.exe","test.out") ExitSee Also: BinaryHashRec BinaryStrCnt Counts the occurrences of a string in some or all of a binary buffer. Syntax: BinaryStrCnt(handle, start-offset, end-offset, string) Parameters: (i) handle (i) start-offset (i) end-offset (s) string handle of buffer. zero-based offset for start of search. zero-based offset for end of search. string to search for. Returns: (i) number of occurrences of string found. This function will search all or a portion of a binary buffer for a string and will return a count of the occurrences of the string found. The buffer will be searched from the start-offset to the end-offset. Note: The string parameter may be composed of any characters except the null (00) character. This function cannot process a null character. Example: ; Find number of Device, DEVICE= and device= lines in config.sys fs1 = FileSize( "C:\CONFIG.SYS" ) binbuf1 = binaryalloc( fs1 ) BinaryRead( binbuf1, "C:\CONFIG.SYS" ) a = BinaryStrCnt( binbuf1, 0, fs1, "Device=") b= BinaryStrCnt( binbuf1, 0, fs1, "DEVICE=") 151 BinaryTagExtr c= BinaryStrCnt( binbuf1, 0, fs1, "device=") BinaryFree( binbuf1 ) d = a + b + c Message( "Hmmm", "Total Device= lines found in Config.Sys is %d% " ) See Also: Binary Operations, BinaryEodGet, BinaryEodSet, BinaryIndex, BinaryPeek, BinaryPeekStr, BinaryPoke, BinaryPokeStr BinaryTagExtr Returns the text between the last-returned pair of binary tags. Syntax: BinaryTagExtr(tag-struct, flags) Parameters: (s) tag-struct (i) flags Structure returned from BinaryTagInit. see below. Returns: (s) the text, or "" on failure. Flags 0 1 Meaning Default. Strip out tabs, carriage returns, and line feeds. Note: This function is useful for editing HTML. Example: ;BinaryTag Example 3 - Replace <b>xxx</b> in HTML files with ;<strong>xxx</strong> per html style guidelines ;Set up test case ;Setup input and output file names filedata=AskFilename("HTML file to convert","","HTML files|*.html;*.htm","*.html",1) filerslt=FileMapName(filedata,"*.new") ; Allocate a buffer much larger than required. fsize=Filesize(filedata) bb=BinaryAlloc(fsize+10000) ;Find <b> and </b> for open and close tags around strings. ;Note BinaryTagFind is NOT case sensitive structure=BinaryTagInit(bb,"<b>","</b>") ;Not necessary in this example, but allows reuse of a ;BinaryBuffer if this code is placed in a loop editing ;multiple files. BinaryEODSet(bb,0) 152 BinaryTagFind ;Read data into the BinaryBuffer BinaryRead(bb,filedata) while 1 structure=BinaryTagFind(structure) if structure=="" then break ; All done strongdata=BinaryTagExtr(structure,1) Value=strcat("<STRONG>",strongdata,"</STRONG>") structure = BinaryTagRepl(structure,Value) endwhile BinaryWrite(bb,filerslt) BinaryFree(bb) Message("Result in",filerslt) exit See Also: BinaryTagInit, BinaryTagFind, BinaryTagRepl BinaryTagFind Finds the next binary tag. Syntax: BinaryTagFind(tag-struct) Parameters: (s) tag-struct Structure returned from BinaryTagInit. Returns: (s) a binary tag structure string, or "" on failure. Note: This function is useful for editing HTML. Example: ;BinaryTag Example 2 - Substitution in GoSubs ;Set up test case ;Setup input and output file names filedata=strcat(DirGet(),"filedata.txt") filerslt=strcat(DirGet(),"filerslt.txt") ;Set up a sample file for this example. ;Presumably you could have a library of these ;to choose from, making form letters easy to ;automate. fhandle=FileOpen(filedata,"WRITE") FileWrite(fhandle,"{{date}}") FileWrite(fhandle,"") FileWrite(fhandle,"Dear {{name}}") FileWrite(fhandle,"Thank you for your recent purchase of") 153 BinaryTagFind FileWrite(fhandle,"our new {{product}}.") FileWrite(fhandle,"") FileWrite(fhandle,"Please feel free to call if you have ") FileWrite(fhandle,"any questions.") FileWrite(fhandle,"") FileWrite(fhandle,"{{salesperson}}") FileWrite(fhandle,"{{salespersonphone}}") FileClose(fhandle) ; Allocate a buffer much larger than required. bb=BinaryAlloc(10000) ;Using {{ and }} for open and close tags around keywords structure=BinaryTagInit(bb,"{{","}}") ;Not necessary in this example, but allows reuse of a ;BinaryBuffer if this code is placed in a loop editing ;multiple files. BinaryEODSet(bb,0) ;Read data into the BinaryBuffer BinaryRead(bb,filedata) while 1 structure=BinaryTagFind(structure) if structure=="" then break ; All done keyword=BinaryTagExtr(structure,1) Value="???" ; keyword not found error value gosub %keyword% structure = BinaryTagRepl(structure,Value) endwhile BinaryWrite(bb,filerslt) BinaryFree(bb) Message("Result in",filerslt) exit :date Value=TimeDate() return :name Value="Ms. Jamie Dough" return :product Value="Analog Osscilosophilator" return :salesperson Value="Fred Ficklemeyer" return :salespersonphone 154 BinaryTagIndex Value="888.555.1234" return See Also: BinaryTagInit, BinaryTagExtr, BinaryTagRepl BinaryTagIndex Returns the offset of a binary tag in a buffer. Syntax: BinaryTagIndex(tag-struct, mode) Parameters: (s) tag-struct (i) mode Returns: (i) structure returned from BinaryTagInit. 0 offset of text 1 offset of start tag the offset where the binary tag was found. Note: This function is useful for editing HTML. This function can be used after a successful BinaryTagFind, to return the offset where the binary tag was found. It must be used before any subsequent BinaryReplace, since BinaryReplace will change the tag structure. Example: ;BinaryTag Advanced functions ;Note: The BinaryTagIndex and BinaryTagLen ;functions are not generally required or ;used by most scripts using the BinaryTag ;functions. That are provided for the ;unusual case of a requirement to mix ;normal Binary functions with BinaryTag ;functions. ;Set up test case ;Setup input and output file names filedata=strcat(DirGet(),"filedata.txt") ;Set up a sample file for this example. ;Presumably you could have a library of these ;to choose from, making form letters easy to ;automate. fhandle=FileOpen(filedata,"WRITE") FileWrite(fhandle,"{{date}}") FileWrite(fhandle,"") FileWrite(fhandle,"Dear {{name}}") FileWrite(fhandle,"Thank you for your recent purchase of") FileWrite(fhandle,"our new {{product}}.") 155 BinaryTagInit FileWrite(fhandle,"") FileWrite(fhandle,"Please feel free to call if you have ") FileWrite(fhandle,"any questions.") FileWrite(fhandle,"") FileWrite(fhandle,"{{salesperson}}") FileWrite(fhandle,"{{salespersonphone}}") FileClose(fhandle) ; Allocate a buffer much larger than required. bb=BinaryAlloc(10000) ;Using {{ and }} for open and close tags around keywords structure=BinaryTagInit(bb,"{{","}}") ;Read data into the BinaryBuffer BinaryRead(bb,filedata) while 1 structure=BinaryTagFind(structure) if structure=="" then break ; All done blen=BinaryTagLen(structure,1) bindex=BinaryTagIndex(structure,1) keyword=BinaryTagExtr(structure,1) Pause("After find",strcat(keyword,@crlf,"len=",blen,@crlf,"index=",bindex)) structure = BinaryTagRepl(structure,"dummy data") blen=BinaryTagLen(structure,1) bindex=BinaryTagIndex(structure,1) Pause("After replace",strcat(keyword,@crlf,"len=",blen,@crlf,"index=",bindex)) endwhile BinaryFree(bb) exit See Also: BinaryTagInit, BinaryTagFind, BinaryTagExtr, BinaryTagRepl BinaryTagInit Initializes a binary tag operation. Syntax: BinaryTagInit ( handle, start-tag, end-tag) Parameters: (i) handle (s) start-tag (s) end-tag 156 Handle of buffer. (handle returned from BinaryAlloc). Specifies what beginning string (tag) to search for ( i.e. "{{" ) Specifies what ending string (tag) to search for ( i.e. "}}" ) BinaryTagInit Returns: (s) a binary tag structure string, or "" on failure. Note: This function is useful for editing HTML. It searches the buffer for the start and end tags and returns a binary tag structure string that is used with the other binary tag functions. Example: ;BinaryTag Example 1 - Basic Code ;Set up test case ;Setup input and output file names filedata=strcat(DirGet(),"filedata.txt") filerslt=strcat(DirGet(),"filerslt.txt") ;Set up a sample file for this example. ;Presumably you could have a library of these ;to choose from, making form letters easy to ;automate. fhandle=FileOpen(filedata,"WRITE") FileWrite(fhandle,"{{date}}") FileWrite(fhandle,"") FileWrite(fhandle,"Dear {{name}}") FileWrite(fhandle,"Thank you for your recent purchase of") FileWrite(fhandle,"our new {{product}}.") FileWrite(fhandle,"") FileWrite(fhandle,"Please feel free to call if you have ") FileWrite(fhandle,"any questions.") FileWrite(fhandle,"") FileWrite(fhandle,"{{salesperson}}") FileWrite(fhandle,"{{salespersonphone}}") FileClose(fhandle) ; Allocate a buffer much larger than required. bb=BinaryAlloc(10000) ;Using {{ and }} for open and close tags around keywords structure=BinaryTagInit(bb,"{{","}}") ;Not necessary in this example, but allows reuse of a ;BinaryBuffer if this code is placed in a loop editing ;multiple files. BinaryEODSet(bb,0) ;Read data into the BinaryBuffer BinaryRead(bb,filedata) while 1 structure=BinaryTagFind(structure) if structure=="" then break ; All done keyword=BinaryTagExtr(structure,1) Value="???" ; keyword not found error value if keyword=="date" then Value=TimeDate() if keyword=="name" then Value="Ms. Jamie Dough" 157 BinaryTagLen if keyword=="product" then Value="Analog Osscilosophilator" if keyword=="salesperson" then Value="Fred Ficklemeyer" if keyword=="salespersonphone" then Value="888.555.1234" structure = BinaryTagRepl(structure,Value) endwhile BinaryWrite(bb,filerslt) BinaryFree(bb) Message("Result in",filerslt) See Also: BinaryTagFind, BinaryTagExtr, BinaryTagRepl BinaryTagLen Returns the length of a binary tag. Syntax: BinaryTagLen(tag-struct, mode) Parameters: (s) tag-struct (i) mode Returns: (s) Structure returned from BinaryTagInit. 0 length of text 1 length of text + tags the length of the text that was found. Note: This function is useful for editing HTML. This function can be used after a successful BinaryTagFind, to return the length of the text that was found. It must be used before any subsequent BinaryReplace, since BinaryReplace will change the tag structure. Example: ;BinaryTag Advanced functions ;Note: The BinaryTagIndex and BinaryTagLen ;functions are not generally required or ;used by most scripts using the BinaryTag ;functions. That are provided for the ;unusual case of a requirement to mix ;normal Binary functions with BinaryTag ;functions. ;Set up test case ;Setup input and output file names filedata=strcat(DirGet(),"filedata.txt") 158 BinaryTagLen ;Set up a sample file for this example. ;Presumably you could have a library of these ;to choose from, making form letters easy to ;automate. fhandle=FileOpen(filedata,"WRITE") FileWrite(fhandle,"{{date}}") FileWrite(fhandle,"") FileWrite(fhandle,"Dear {{name}}") FileWrite(fhandle,"Thank you for your recent purchase of") FileWrite(fhandle,"our new {{product}}.") FileWrite(fhandle,"") FileWrite(fhandle,"Please feel free to call if you have ") FileWrite(fhandle,"any questions.") FileWrite(fhandle,"") FileWrite(fhandle,"{{salesperson}}") FileWrite(fhandle,"{{salespersonphone}}") FileClose(fhandle) ; Allocate a buffer much larger than required. bb=BinaryAlloc(10000) ;Using {{ and }} for open and close tags around keywords structure=BinaryTagInit(bb,"{{","}}") ;Read data into the BinaryBuffer BinaryRead(bb,filedata) while 1 structure=BinaryTagFind(structure) if structure=="" then break ; All done blen=BinaryTagLen(structure,1) bindex=BinaryTagIndex(structure,1) keyword=BinaryTagExtr(structure,1) Pause("After find",strcat(keyword,@crlf,"len=",blen,@crlf,"index=",bindex)) structure = BinaryTagRepl(structure,"dummy data") blen=BinaryTagLen(structure,1) bindex=BinaryTagIndex(structure,1) Pause("After replace",strcat(keyword,@crlf,"len=",blen,@crlf,"index=",bindex)) endwhile BinaryFree(bb) exit See Also: BinaryTagFind, BinaryTagInit, BinaryTagExtr, BinaryTagRepl 159 BinaryTagRepl BinaryTagRepl Replaces a binary tag with text. Syntax: BinaryTagRepl ( tag-struct, new-string ) Parameters: (s) tag-struct (s) new-string Structure returned from BinaryTagInit. text string to replace binary-tag with. Returns: (s) a binary tag structure string, or "" on failure. Note: This function is useful for editing HTML. The BinaryTagRepl ignores overruns of the binary buffer, therefore make sure to allocate a large enough binary buffer. Example: ;BinaryTag Example 4 - Replace - passing parameters and other tricks ;Set up test case ;Setup input and output file names filedata=strcat(DirGet(),"filedata.txt") filerslt=strcat(DirGet(),"filerslt.txt") ;Set up a sample file for this example. ;Presumably you could have a library of these ;to choose from, making the generation of ;customized HTML pages easy to automate. fhandle=FileOpen(filedata,"WRITE") FileWrite(fhandle,"<HTML>") FileWrite(fhandle,"<HEAD><TITLE>{{Title}}</TITLE></HEAD>") FileWrite(fhandle,"<BODY>") FileWrite(fhandle,"<p>Random number in range 0 thru 10 = {{RANDOM 0 10}}") FileWrite(fhandle,"<p>Random number in range 92 thru 114 = {{RANDOM 92 114}}") FileWrite(fhandle,"<p>Random number in range -20 thru 4 = {{RANDOM 20 4}}") FileWrite(fhandle,"<p>Value of <b>filedata</b> variable=<br>{{VALUE filedata}}") FileWrite(fhandle,"<p>Value of <b>filerslt</b> variable=<br>{{VALUE filerslt}}") FileWrite(fhandle,"<p>Current time/date in YmdHms format = {{DATE YMDHMS}}") FileWrite(fhandle,"<p>Current time/date in display format = {{DATE DISPLAY}}") FileWrite(fhandle,"</BODY>") 160 BinaryTagRepl FileWrite(fhandle,"</HTML>") FileClose(fhandle) ; Allocate a buffer much larger than required. bb=BinaryAlloc(10000) ;Using {{ and }} for open and close tags around keywords structure=BinaryTagInit(bb,"{{","}}") ;Not necessary in this example, but allows reuse of a ;BinaryBuffer if this code is placed in a loop editing ;multiple files. BinaryEODSet(bb,0) ;Read data into the BinaryBuffer BinaryRead(bb,filedata) while 1 structure=BinaryTagFind(structure) if structure=="" then break ; All done ;Get tag with any extra spaces removed extract=strtrim(BinaryTagExtr(structure,1)) ParseData(extract) HTMLValue="???" gosub %param1% ; keyword not found error value structure = BinaryTagRepl(structure,HTMLValue) endwhile BinaryWrite(bb,filerslt) BinaryFree(bb) Message("Result in",filerslt) exit :Value ; Use WinBatch substitution to capture variable contents HTMLValue = %param2% return :TITLE HTMLValue="BinaryTagRepl Example" return :DATE if param2=="YMDHMS" HTMLValue=TimeYmdHms() else if param2=="DISPLAY" HTMLValue=TimeDate() else HTMLValue="???Unknown DATE format??? endif endif return 161 BinaryWrite :RANDOM randomlow=param2 randomhigh=param3 randomrange=randomhigh-randomlow HtmlValue=Random(randomrange)+randomlow return See Also: BinaryTagInit, BinaryTagFind, BinaryTagExtr BinaryWrite Writes a binary buffer to a file. Syntax: BinaryWrite(handle, filename) Parameters: (i) handle (s) filename handle of buffer. filename to write buffer to. Returns: (i) number of bytes written. This function writes the contents of a binary buffer out to a file and returns the number of bytes written. Data written to the file starts at offset 0 in the buffer and extends to the end of data - not necessarily the end of the buffer. The end of data may be inspected or modified with the BinaryEodGet and BinaryEodSet functions. Example: ; This example edits the Config.sys file by adding a line ; to the bottom of the file. fs=FileSize("C:\CONFIG.SYS") binbuf = BinaryAlloc(fs+100) if binbuf == 0 Message("Error", "BinaryAlloc Failed") else BinaryRead(binbuf, "C:\CONFIG.SYS") BinaryPokeStr(binbuf, fs, "DEVICE=C:\FLOOGLE.SYS%@crlf%") BinaryWrite(binbuf, "C:\CONFIG.SYS") binbuf=BinaryFree(binbuf) endif Message("BinaryWrite", "Done.") See Also: Binary Operations, BinaryAlloc, BinaryFree, BinaryRead, BinaryReadEx, BinaryWriteEx, IntControl 40 162 BinaryWriteEx BinaryWriteEx Writes a portion of a binary buffer to a file. Syntax: BinaryWriteEx(handle, binary-offset, filename, file-offset, count) Parameters: (i) handle (i) binary-offset (i) filename (i/t) file-offset (i) count Returns: (i) handle of buffer. zero-based offset into the buffer specifying where the data to be read starts. file to write to. zero-based offset into the file specifying where the data should be stored.This parameter accepts a huge number data type. the number of bytes to write, or -1 to specify new end of file marker. the number of bytes written. This function reads "count" bytes from the buffer specified by "handle", beginning at "binary-offset". It then writes the data to "filename", beginning at "file-offset". Any existing data in the file within the range "file-offset + count" is overwritten with the new data; any existing data outside that range is left untouched. If the data being written to the file is being written to the end of the file, and the data that is being replaced is greater than the new data you will need to create a new end of file marker. To create the new end of file marker, specify -1 for "count". "handle" and "binary-offset" will be ignored. The file will be trucated at the "file-offset". If "filename" does not exist, it will be created. If the existing file is smaller than "file-offset", NULL bytes will be added to the end of the file to increase its size to "file-offset", and then the specified data will be written beginning at "file-offset". File-offset BinaryReadEx and BinaryWriteEx accept a huge number for the "file-offset". A huge number is a long decimal number string, which may represent a number too large to be converted to an integer. Example: file = "1binout.txt" buf = BinaryAlloc(10) BinaryPokeStr(buf, 0, "01234") rc = BinaryWriteEx(buf, 1, file, 50, 3) Message("BinaryWriteEx returned", rc) 163 BinaryXlate See Also: Binary Operations, BinaryAlloc, BinaryFree, BinaryRead, BinaryReadEx, BinaryWrite, IntControl 40 BinaryXlate Converts a binary buffer using a translation table. Syntax: BinaryXlate(data-buffer, table-buffer, mode) Parameters: (i) data-buffer (i) table-buffer (i) mode a binary buffer containing data to be converted. a binary buffer containing a translation table. see below. Returns: (i) new EOD of the buffer. Mode 0 1 2 3 Source buffer byte byte word word Target buffer byte word byte word Table size 256 512 65536 131072 This function looks up a byte or word in "data-buffer", uses that number to compute an index into "table-buffer", looks up the byte or word there, and places the result in a temporary buffer. It does this for each byte or word in "data-buffer". When it's finished processing "data-buffer", it copies the new (temporary) buffer back to "databuffer", and sets the binary EOD appropriately. For mode 1, "data-buffer" must be large enough to hold at least twice as much data as is currently in the buffer. Example: ;EBCDIC to ;Codes 0 row0 ="000 row1 ="016 row2 ="032 row3 ="032 row4 ="032 row5 ="038 row6 ="045 row7 ="032 row8 ="032 164 ASCII translation table 1 2 3 4 5 6 001 002 003 032 009 032 017 018 019 032 032 008 032 028 032 032 010 023 032 022 032 032 030 032 032 032 032 032 032 032 032 032 032 032 032 032 047 032 032 032 032 032 032 032 032 032 032 032 097 098 099 100 101 102 7 127 032 027 004 032 032 032 032 103 8 032 024 032 032 032 032 032 032 104 9 032 025 032 032 032 032 032 032 105 A 032 032 032 032 155 033 124 058 032 B 011 032 032 032 046 036 044 035 032 C 012 032 032 020 060 042 037 064 032 D 013 032 005 021 040 041 095 039 032 E 014 032 006 032 043 059 062 061 032 F 015" 032" 007" 032" 032" 191" 063" 034" 032" BinaryXor row9 ="032 row10="032 row11="032 row12="123 row13="125 row14="092 row15="048 106 126 032 065 074 032 049 107 115 032 066 075 083 050 108 116 032 067 076 084 051 109 117 032 068 077 085 052 110 118 032 069 078 086 053 111 119 032 070 079 087 054 112 120 032 071 080 088 055 113 121 032 072 081 089 056 114 122 032 073 082 090 057 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032 032" 032" 032" 032" 032" 032" 032" ;Allocate 256 bytes for a 1:1 translation table bbxlate=BinaryAlloc(256) ;load translation table from ROW variables above. ; Could have loaded it from a file also for rowdigit=0 to 15 for coldigit= 0 to 15 BinaryPoke(bbxlate,(rowdigit*16)+coldigit,ItemExtract(coldigit+1,row% rowdigit%," ")) next next ;Ask user for a file name of an EBCDIC file fn=AskFileName("EBCDIC -> ASCII", "", "EBCDIC files|*.ebc|All Files|*.*","*.*",1) ;Generate corresponding *.asc name fnout=FileMapName(fn,strcat(FilePath(fn),"*.asc")) ;Get size of source file fs=FileSize(fn) ;Allocate a binary buffer that size bb=BinaryAlloc(fs) ;Read source file into binary buffer BinaryRead(bb,fn) ;Perform the magic Xlate function BinaryXlate(bb,bbxlate,0) ;Write result file do the output file BinaryWrite(bb,fnout) ;Free binary buffers BinaryFree(bb) BinaryFree(bbxlate) ;claim victory Message("All","Done")) See Also: Binary Operations, BinaryAlloc, BinaryCopy, BinaryFree, BinaryRead BinaryXor Performs a bitwise XOR (exclusive OR) on portions of two binary buffers. Syntax: BinaryXor(target-handle, target-offset, source-handle, source-offset, count) 165 Break Parameters: (i) target-handle (i) target-offset (i) source-handle (i) source-offset (i) count Returns: (i) handle of target buffer. zero-based offset into the target buffer specifying where the data to be processed starts, and where the result of the operation should be placed. handle of source buffer. zero-based offset into the source buffer specifying where the data to be processed starts. the number of bytes to process. always 1. The specified sections of the buffers are processed on a byte-by-byte basis, and the results are written to the buffer specified by "target-handle". i.e., the byte at "sourceoffset" is XOR'ed with the byte at "target-offset", and the result of the XOR operation is stored in the byte at "target-offset", then the bytes at "source-offset + 1" and "target-offset + 1" are XOR'ed, and so on. "target-handle" and "source-handle" may both reference the same buffer, in which case two sections of the buffer can be processed. Example: buf1 = BinaryAlloc(10) buf2 = BinaryAlloc(10) for i = 0 to 9 BinaryPoke(buf1, i, 0) BinaryPoke(buf2, i, 1) next BinaryPoke(buf1, 0, 1) rc = BinaryXor(buf1, 0, buf2, 0, 3) binaryWrite(buf1, "zzbin1") binaryWrite(buf2, "zzbin2") Message("BinaryXor returned", rc) See Also: Binary Operations, BinaryAlloc, BinaryOr, BinaryCopy, BinaryFree, BinaryRead, DllCall, BinaryCompare, BinaryAnd Break The Break statement is used to exit a While, Switch, Select, or For/Next structure. Syntax: break 166 ButtonNames Parameters: (none) Use the Break statement to exit a While, Switch, Select, or For/Next structure. It transfers control to the statement immediately following the nearest enclosing EndWhile, EndSwitch, EndSelect, or Next. It is used to terminate loops and to exit Switch statements - usually just before the next case statement. Example: a=15 b=21 while (a<100) a=a+1 if a==4 then break b=b+1 endwhile Message("Break", "It Broke.") See Also: Continue, For, While, Switch, Select ButtonNames Changes the names of the buttons which appear in WIL dialogs. Syntax: ButtonNames (OK-name, Cancel-name) Parameters: (s) OK-name (s) Cancel-name new name for the OK button. new name for the Cancel button. Returns: (i) always 1. This function allows you to specify alternate names for the OK and/or Cancel buttons which appear in many of the dialogs displayed by the WIL Interpreter. Each use of the ButtonNames statement only affects the next WIL dialog which is displayed. You can specify a null string ("") for either the OK-name or Cancel-Name parameter, to use the default name for that button (i.e., "OK" or "Cancel"). You can place an ampersand before the character which you want to be the underlined character in the dialog. Note: ButtonNames does not change the name in all functions which display buttons. Supported functions are: AskLine, AskFileText, AskItemList, AskPassword. 167 Call Example: ButtonNames("", "&Abort") user = AskLine("Hello", "What is your name", "", 0) Message("Hello", user) would produce: Call Calls a WIL batch file as a subroutine. Syntax: Call (filename, parameters) Parameters: (s) filename (s) parameters Returns: (i) the WIL batch file you are calling (including extension). the parameters to pass to the file, if any, in the form "p1 p2 p3 ... pn". (maximum value of n = 9 ) can return a value, by specifying a value after the Return keyword in the called script. If no Return is specified the called script will return 0. This function is used to pass control temporarily to a secondary WIL batch file. The main WIL program can optionally pass parameters to the secondary WIL batch file. All variables are common (global) between the calling program and the called WIL batch file, so that the secondary WIL batch file may modify or create variables. The secondary WIL batch file should end with a Return statement, to pass control back to the main WIL program. If a string of parameters is passed to the secondary WIL batch file, it will automatically be parsed into individual variables with the names param1, param2, etc.. The variable param0 will be a count of the total number of parameters in the string. The Return command can return a value, by specifying a value (or an expression that evaluates to a value) after the "Return" keyword. The value or expression may optionally be enclosed in parentheses. This feature can be used with the Call 168 Ceiling command, and with the new user-defined functions. It does not affect the Gosub command. Note: To debug into a 'called' WinBatch script or user defined function, make sure to add the corresponding debug command, to the 'called script' or user defined function. Examples: Return Return Return Return Return (10) "Okay" myvariable * 10 (ItemCount(list, @TAB)) A script run with the Call command can return a value by using a Return command with a value (see above). If a Return command without a value is used, or the called script does not contain a Return command, the called script will return 0. result = Call("other.wbt", "") Example: ; File MAIN.WBT ; ; This example asks for user input, their name and age, ; and then calls another WinBatch job to verify if their ; age is between 0 & 150. name = AskLine("", "What is your name?", "", 0) age = AskLine("", "How old are you?", "", 0) valid = @NO Call("chek-age.wbt", age) If valid == @NO Then Message("", "Invalid age") Exit ; File CHEK-AGE.WBT ; ; This subroutine checks if the age inputted is between 0 & 150. ; If this is true, a global parameter is set to a value of 1. userage = param1 really = AskYesNo("", "%name%, are you really %userage%?") If really == @YES If (userage > 0) && (userage < 150) valid = @YES endif endif Return See Also: ParseData, Return Ceiling Calculates the ceiling of a value. 169 Char2Num Syntax: Ceiling(x) Parameters: (f) x value Ceiling is calculated from. Returns: (f) a floating point number whose value represents the smallest integer that is greater than or equal to x (rounds up to the nearest integer#). Use this function to calculate the ceiling of a value. Example: ; This example accepts a value from the user to calculate ; the ceiling and floor. a=AskLine("Ceiling and Floor", "Please enter a number", "1.23", 0) c=Ceiling(a) f=Floor(a) Message("Ceiling and Floor of %a%", "Ceiling: %c% Floor: %f%") exit A= 25.2 25.7 24.9 -14.3 Ceiling= 26.0 26.0 25.0 -14.0 Floor= 25.0 25.0 24.0 -15.0 See Also: Abs, Fabs, Floor, Min, Max Char2Num Converts the first character of a string to its numeric equivalent. Syntax: Char2Num (string) Parameters: (s) string any text string. Only the first character will be converted. Returns: (i) ANSI character code. This function returns the 8-bit ANSI code corresponding to the first character of the string parameter. Note: For the commonly-used characters (with codes below 128), ANSI and ASCII characters are identical. 170 ChrHexToString Example: ; Show the hex equivalent of entered character inpchar = AskLine("ANSI Equivalents", "Char:", "", 0) ansi = StrSub(inpchar, 1, 1) ansiequiv = Char2Num(InpChar) Message("ANSI Codes", "%ansi% => %ansiequiv%") See Also: IsNumber, Num2Char ChrGetCodePage Gets the current code page. Syntax: ChrGetCodePage( request ) Parameters: (i) request specifies the code page to be returned. See below. Returns: (i) the requested code page. Request Meaning 0 WIL code page being used for Unicode conversions 1 ANSI code page associated with the default system locale 2 ANSI code page associated with the default user locale Example: wilcodepg = ChrGetCodePage( 0 ) Message("WIL code page being used for Unicode conversions",wilcodepg) See Also: ChrSetCodePage, IsNumber, Num2Char ChrHexToString Converts a hex string to a string. Syntax: ChrHexToString ( hex-string ) Parameters: (s) hex-string a hex-string. Returns: (s) returns a string. 171 ChrSetCodePage Example: str = ChrHexToString("48656C6C6F");Hello Message("String", str) See Also: ChrStringToHex ChrHexToUnicode Converts a hex string to a Unicode string. Syntax: ChrHexToUnicode ( hex-string ) Parameters: (s) hex-string Returns: (s) a Unicode string in hex format with four hex bytes per Unicode character. returns a Unicode string. "Hex-string" specifies a Unicode string in hex format, with four hex bytes per Unicode character (eg, "480065006C006C006F00"). Example: unicodestr = ChrHexToUnicode("480065006C006C006F00");Hello Message("Unicode String", unicodestr) See Also: ChrUnicodeToHex ChrSetCodePage Sets the current WIL code page. Syntax: ChrSetCodePage( code page ) Parameters: (i) code page specifies the code page to be returned. See below. Returns: (i) previous WIL code page. "code page" specifies a valid available code page, or one of the following system default code pages: 172 ChrStringToUnicode Value 0 1 2 3 42 65000 65001 Meaning ANSI code page OEM code page Macintosh code page The current thread's ANSI code page Symbol code page Translate using UTF-7 Translate using UTF-8 Example: ChrSetCodePage( 0 ) See Also: ChrGetCodePage, IsNumber, Num2Char ChrStringToHex Converts a string to a Hex string. Syntax: ChrStringToHex ( string ) Parameters: (s) string specifies a string. Returns: (s) a hex string with two hex bytes per character. Example: hexstr = ChrStringToHex ("Hello") Message("Hex String", hexstr) See Also: ChrStringToHex, ChrStringtoUnicode ChrStringToUnicode Converts an ANSI string to a Unicode string. Syntax: ChrStringToUnicode( string ) Parameters: (s) string specifies a string. Returns: (s) a Unicode string. 173 ChrUnicodeToString Example: ; Step through this code in WinBatch Studio to see the ; variable str change type from String to String_Unicode str = "Hello" str = ChrStringToUnicode(str) See Also: ChrUnicodetoString ChrUnicodeToHex Converts a Unicode string to a Hex string. Syntax: ChrUnicodeToHex( Unicode string ) Parameters: (s) Unicode string specifies a Unicode string. Returns: (s) a hex string, with four hex bytes per Unicode character. Example: unicodestr = ChrStringToUnicode("Hello") hexstr = ChrUnicodeToHex(unicodestr) Message("Hex String", hexstr) See Also: ChrHextoUnicode ChrUnicodeToString Converts a Unicode string to an ANSI string. Syntax: ChrUnicodeToString( Unicode string ) Parameters: (s) Unicode string specifies a Unicode string. Returns: (s) an ANSI string. Example: unicodestr = ChrHexToUnicode("480065006C006C006F00");Hello ansistr = ChrUnicodeToString( unicodestr ) Message("String", ansistr) exit 174 ClipGet See Also: ChrStringtoUnicode ClipAppend Appends a string to the Clipboard. Syntax: ClipAppend (string) Parameters: (s) string Returns: (i) text string to add to Clipboard. @TRUE if string was appended; @FALSE if Clipboard ran out of memory. Use this function to append a string to the Windows Clipboard. The Clipboard must either contain text data or be empty for this function to succeed. Example: ; This code will append 2 copies of the ; Clipboard contents back to the Clipboard, resulting ; in 3 copies of the original contents with a CR/LF ; between each copy. a = ClipGet( ) ClipAppend(@crlf) ClipAppend(a) ClipAppend(@crlf) ClipAppend(a) Message("ClipAppend", "Clip Appended.") See Also: ClipGet, ClipPut ClipGet Returns the contents of the Clipboard. Syntax: ClipGet ( ) Parameters: (none) Returns: (s) clipboard contents. Use this function to copy text from the Windows Clipboard into a string variable. 175 ClipHasFormat Note: If the Clipboard contains an excessively large string, a (fatal) out of memory error may occur. Example: ; The code below will convert Clipboard contents to ; uppercase ClipPut(StrUpper(ClipGet( ))) a = ClipGet( ) Message("UPPERCASE Clipboard Contents", a) See Also: ClipAppend, ClipPut, BinaryClipGet, ClipGetEx ClipGetEx Returns the contents of the Windows clipboard in a specified format. Syntax: ClipGetEx( format ) Parameters: (i) format format in which the text is returned. See below. Returns: (s) the contents of the Windows clipboard in a specified format. Format 1 7 13 Meaning (CF_TEXT) Standard ANSI text (same as ClipGet). (CF_OEMTEXT) Text containing characters in the OEM character set. (CF_UNICODETEXT) Unicode text format (Windows NT only) Note: If the clipboard contains an excessively large string a (fatal) out of memory error may occur. Example: ClipPut("abc") ret = ClipGetEx(1) Message( "ClipGetEx Returns:", ret) See Also: ClipGet, ClipAppend, ClipPut, BinaryClipGet ClipHasFormat Determines if the clipboard contains a particular format. 176 ClipHasFormat Syntax: ClipHasFormat ( format ) Parameters: (i) format Returns: (i) format of clipboard data. returns @TRUE if the clipboard contains data in the format specified by "format", or @FALSE if it does not. The following is a list of possible clipboard formats. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 128 129 130 131 142 F_TEXT F_BITMAP F_METAFILEPICT F_SYLK F_DIF CF_TIFF CF_OEMTEXT CF_DIB CF_PALETTE CF_PENDATA CF_RIFF CF_WAVE CF_UNICODETEXT CF_ENHMETAFILE CF_HDROP CF_LOCALE CF_OWNERDISPLAY CF_DSPTEXT CF_DSPBITMAP CF_DSPMETAFILEPICT CF_DSPENHMETAFILE Example: ;This code will snapshot the screen to the clipboard, ;and check the format of the clipboard contents Snapshot(0) format = 2 ; bmp ret = ClipHasFormat(format) if ret == 1 message("Clipboard format","Clipboard contains a bitmap") else message("Clipboard format","Clipboard does not contain a bitmap") endif exit 177 ComputerNameGet See Also: Binary Operations, BinaryAlloc, BinaryWrite, BinaryFree, BinaryClipGet, BinaryClipPut, ClipGet, ClipGetEx ClipPut Copies a string to the Clipboard. Syntax: ClipPut (string) Parameters: (s) string Returns: (i) any text string. @TRUE if string was copied; @FALSE if Clipboard ran out of memory. Use this function to copy a string to the Windows Clipboard. The previous Clipboard contents will be lost. Example: ; The code below will convert Clipboard contents to ; lowercase ClipPut(StrLower(ClipGet( ))) a = ClipGet( ) Message("lowercase Clipboard Contents", a) See Also: ClipAppend, ClipGet, SnapShot ComputerNameGet Gets the name associated with the local computer. Syntax: ComputerNameGet( format ) Parameters: (i) format Returns: (s) specifies what value to return. See below. returns computername in specified format. Returns an ANSI string in Windows 95/98/ME, and a Unicode string in Windows NT and newer. In Windows 95/98/ME, "format" must be 0. In Windows NT and newer, "format" can be one of the following values: 178 ComputerNameSet Value 0 100 101 102 103 104 105 106 107 Meaning The NetBIOS name of the local computer. The NetBIOS name of the local computer. If the local computer is a node in a cluster, returns the NetBIOS name of the cluster virtual server. The DNS host name of the local computer. If the local computer is a node in a cluster, returns the DNS host name of the cluster virtual server. The name of the DNS domain assigned to the local computer. If the local computer is a node in a cluster, returns the DNS domain name of the cluster virtual server. The fully qualified DNS name that uniquely identifies the local computer. This name is a combination of the DNS host name and the DNS domain name, using the form HostName.DomainName. If the local computer is a node in a cluster, returns the fully qualified DNS name of the cluster virtual server. The NetBIOS name of the local computer. If the local computer is a node in a cluster, returns the NetBIOS name of the local computer, not the name of the cluster virtual server. The DNS host name of the local computer. If the local computer is a node in a cluster, returns the DNS host name of the local computer, not the name of the cluster virtual server. The name of the DNS domain assigned to the local computer. If the local computer is a node in a cluster, returns the DNS domain name of the local computer, not the name of the cluster virtual server. The fully qualified DNS name that uniquely identifies the computer. If the local computer is a node in a cluster, returns the fully qualified DNS name of the local computer, not the name of the cluster virtual server. The fully qualified DNS name is a combination of the DNS host name and the DNS domain name, using the form HostName.DomainName. Example: result = ComputerNameGet( 0 ) Message( "The NetBIOS name of the local computer.", result ) See Also: ComputerNameSet ComputerNameSet Sets the name associated with the local computer. Syntax: ComputerNameSet( new computername, format ) 179 Continue Parameters: (s) new computername new computer name (i) format specifies what value to set. See below. Returns: (i) @TRUE on success and @FALSE on failure. In Windows 95/98/ME, "format" must be 0. In Windows NT and newer, "format" can be one of the following values: Value 0 104 105 106 Meaning In Windows 95/98/ME, sets the NetBIOS name. In Windows NT and newer, same as 105 (below). Sets the NetBIOS name. The name cannot exceed 15 characters. Warning: Using this option to set the NetBIOS name breaks the convention of interdependent NetBIOS and DNS names. Applications that use the DnsHostnameToComputerName function to derive the NetBIOS name from the first label of the DNS name will fail if this convention is broken. Sets the NetBIOS and the Computer Name (the first label of the full DNS name). If the name exceeds 15 characters, the NetBIOS name is truncated to 15 characters. Sets the primary DNS suffix of the computer. Changes do not take effect until the computer is restarted. If the computer is a member of the domain: use the wntUserRename() function in the NT extender to rename the machine account. Remember that machine accounts are hidden [e.g. they have a trailing "$" in the name] and they are are always in lowercase. Remember that you must have appropriate rights in order to set the computer name and to rename the computer's machine account in the domain. Windows Vista or newer: This function may require an Administrator level account. Example: result = ComputerNameSet( "OZWEEGO", 0 ) Message( "ComputerNameSet", "Set the NetBIOS & Computer name of the local computer.") See Also: ComputerNameGet Continue The Continue statement in a While or For loop causes a transfer of control back to the beginning of the loop so that the controlling expressions can be re-evaluated. In a 180 Cos Switch or Select statement, execution of a particular case is terminated and a search for the next matching case is initiated. Syntax: Continue Parameters: (none) In While or For statements, use the Continue statement to immediately stop execution and re-evaluate the While or For statement to determine if the loop should be repeated. In For statements, the index variable is also incremented. In Switch or Select statements, if a case is being executed, execution of that case is terminated, and a search is started for another case statement whose expression evaluates to the same integer as the expression controlling the Switch or Select statement. Example: a=0 b=0 while (a<100) a=a+1 if a>10 then continue b=b+1 endwhile Message("Continue","Continued") See Also: Break, For, While, Switch, Select Cos Calculates the cosine. Syntax: Cos(x) Parameters: (f) x angle in radians. Returns: (f) the Cos function returns the cosine of x. Calculates the cosine. If x is large, a loss in significance in the result or a significance error may occur. Note: To convert an angle measured in degrees to radians, simply multiply by the constant @Deg2Rad. 181 CurrentFile {*M} Example: real=AskLine("Cosine","Enter an angle in degrees(0 to 360)","45",0) answer=cos(real * @Deg2Rad) Message("Cosine of %real% degrees is",answer) See Also: Acos, Asin, Atan, Cosh, Sin, Tan Cosh Calculates the hyperbolic cosine. Syntax: Cosh(x) Parameters: (f) x angle in radians. Returns: (f) the Cosh function returns the hyperbolic cosine of x. Calculates the hyperbolic cosine. If the result is too large, the function will return an error. Note: To convert an angle measured in degrees to radians, simply multiply by the constant @Deg2Rad. Example: real=AskLine("Cosh", "Enter an angle in degrees (0 to 360)", "45", 0) answer=cosh(real * @Deg2Rad) Message("Hyperbolic cosine of %real% degrees is",answer) See Also: Acos, Asin, Atan, Cos, Sin, Sinh, Tan, Tanh CreateObject Pseudonym for ObjectCreate. Creates and returns a reference to a COM/OLE object. See ObjectCreate. See Also: ObjectGet, ObjectCreate CurrentFile {*M} Returns the selected filename. 182 CurrentPath {*M} Syntax: CurrentFile ( ) Parameters: (none) Returns: (s) currently-selected file's name. When a WIL menu shell displays the files in the current directory, one of them may be "selected". This function returns the name of that file, if any. This is different than a "highlighted" file. When a file is highlighted, it shows up in inverse video (usually white-on-black). To find the filenames that are highlighted, see FileItemize. Note: This command is not part of the WIL Interpreter package, but is documented here because it has been implemented in many of the explorer shell or file managertype applications which use the WIL Interpreter. See FileMenu in the WinBatch Users Guide. Example: ;The CurrentFile function is designed for menu based ;implementations of WIL, such as FileMenu. It is not ;supported in the WinBatch Product. ;Ask which program to show (default = current file) ;Edit Current File thefile = AskLine("Show File", "Program:",CurrentFile( ), 0) Run("browser.exe",thefile) See Also: CurrentPath, DirGet, DirItemize, FileItemize CurrentPath {*M} Returns path of the selected filename. Syntax: CurrentPath ( ) Parameters: (none) Returns: (s) path of currently-selected file. When a WIL menu shell displays the files in the current directory, one of them may be "selected." This function returns the drive and path of that file, if any. 183 CurrFilePath {*M} This is different than a "highlighted" file. When a file is highlighted, it shows up in inverse video (usually white-on-black). To find the filenames that are highlighted, see FileItemize. Note: This command is not part of the WIL Interpreter package, but is documented here because it has been implemented in many of the explorer shell or file managertype applications which use the WIL Interpreter. See FileMenu in the WinBatch Users Guide. Example: ; Builds full filename before changing directories. ; For Menu based systems only ;Build FileName myfile = StrCat(CurrentPath( ), CurrentFile( )) DirChange("c:\temp") Run("notepad.exe", myfile) See Also: CurrentFile, DirGet, FilePath CurrFilePath {*M} Returns the full path plus filename of the currently-selected file. Syntax: CurrFilePath( ) Parameters: (none) Returns: (s) path and filename of currently-selected file. Note: This command is not part of the WIL Interpreter package, but is documented here because it has been implemented in many of the explorer shell or file managertype applications which use the WIL Interpreter. See FileMenu in the WinBatch Users Guide. Example: ;The CurrFilePath function is designed for menu based ;implementations of WIL, such as FileMenu. It is not ;supported in the WinBatch Product. ;Get the filename before changing directories. ;Edit Current File myfile=CurrFilePath( ) DirChange("c:\temp") Run("notepad.exe", myfile) See Also: CurrentFile, CurrentPath 184 DDEExecute DataCast Converts or casts a value from one data type to another. Syntax: DataCast(value, mode) Parameters: (f) value (i) mode specifies the value to be converted or cast. specifies the operation to perform: Returns: (f) depends on mode specified. See below. Mode 0 1 Meaning Cast single-precision floating point to double-precision floating point. "value" specifies a single-precision (32-bit) floating point value, represented as a WIL long value containing the same bit sequence as the float value. Returns a WIL floating point value (64-bit). Cast double-precision floating point to single-precision floating point. "value" specifies a WIL floating point value (64-bit). Returns a single-precision (32-bit) floating point value, represented as a WIL long value containing the same bit sequence as the float value. Casting a value involves changing it from one data type to another, and may involve a loss of precision depending on the type of cast. Example: single_precision = 1077936128 ;Cast single-precision to double-precision floating point. double_precision = DataCast(single_precision,0) Message(single_precision, double_precision) ;Cast double-precision to single-precision floating point. single_precision = DataCast(double_precision,1) Message(double_precision, single_precision ) See Also: DllCall, DllCallCdecl DDEExecute Sends commands to a DDE server application. 185 DDEInitiate Syntax: DDEExecute (channel, [command string]) Parameters: (i) channel (s) command string Returns: (i) same integer that was returned by DDEInitiate. one or more commands to be executed by the server app. @TRUE if successful; @FALSE if unsuccessful. Use the DDEInitiate function to obtain a channel number. In order to use this function successfully, you will need appropriate documentation for the server application you wish to access, which must provide information on the DDE functions that it supports and the correct syntax to use. Example: Run("report.exe", "sales.dat") ;Run Report channel = DDEInitiate("report", "YTD") ;Initialize DDE ;If DDE OK Execute DDE Command If channel != 0 result = DDEExecute(channel, '[Act:p="ABCco", t=580.00]') ;Close DDE DDETerminate(channel) ;Close Report WinClose("Reports") If result == @FALSE Message("DDE Execute", "Failed") else Message("DDE Execute", "Operation complete") Exit endif else Message("DDE operation unsuccessful", "Check your syntax") endif See Also: DDEInitiate, DDEPoke, DDERequest, DDETerminate, DDETimeout DDEInitiate Opens a DDE channel. Syntax: DDEInitiate (app name, topic name) Parameters: (s) app name (s) topic name 186 name of the application (without the EXE extension). name of the topic you wish to access. DDEPoke Returns: (i) communications channel, or 0 on error. This function opens a DDE communications channel with a server application. The communications channel can be subsequently used by the DDEExecute, DDEPoke, and DDERequest functions. You should close this channel with DDETerminate when you are finished using it. If the communications channel cannot be opened as requested, DDEInitiate returns a channel number of 0. You can call DDEInitiate more than once, in order to carry on multiple DDE conversations (with multiple applications) simultaneously. In order to use this function successfully, you will need appropriate documentation for the server application you wish to access, which must provide information on the DDE functions that it supports and the correct syntax to use. Example: Run("report.exe", "sales.dat") ;Run Report channel = DDEInitiate("report", "YTD") ;Initialize DDE ;If DDE OK Execute DDE Command If channel != 0 result = DDEExecute(channel, '[Act:p="ABCco", t=580.00]') DDETerminate(channel) ;Close DDE WinClose("Reports") ;Close Report If result == @FALSE Message("DDE Execute", "Failed") else Message("DDE Execute", "Operation complete") Exit endif else Message("DDE operation unsuccessful", "Check your syntax") endif See Also: DDEExecute, DDEPoke, DDERequest, DDETerminate, DDETimeout DDEPoke Sends data to a DDE server application. Syntax: DDEPoke (channel, item name, item value) Parameters: (i) channel (s) item name (s) item value same integer that was returned by DDEInitiate. identifies the type of data being sent. actual data to be sent to the server. 187 DDERequest Returns: (i) @TRUE if successful; @FALSE if unsuccessful. Use the DDEInitiate function to obtain a channel number. In order to use this function successfully, you will need appropriate documentation for the server application you wish to access, which must provide information on the DDE functions that it supports and the correct syntax to use. Example: ;Run Reminder and Initialize DDE Run("reminder.exe", "") channel = DDEInitiate("Reminder", "items") If channel != 0 ;If DDE OK ;Do DDE Poke result = DDEPoke(channel, "all", "11/3/92 Misc Vote!!!!") DDETerminate(channel) ;Close DDE WinClose("Reminder") ;Close Application If result == @FALSE Message("DDE Poke", "Failed") else Message("DDE Poke", "Operation complete") Exit endif else Message("DDE operation unsuccessful", "Check your syntax") endif See Also: DDEExecute, DDEInitiate, DDERequest, DDETerminate, DDETimeout DDERequest Gets data from a DDE server application. Syntax: DDERequest (channel, item name) Parameters: (i) channel (s) item name Returns: (s) same integer that was returned by DDEInitiate. identifies the data to be returned by the server. information from the server if successful, "***NACK***" on failure. Use the DDEInitiate function to obtain a channel number. In order to use this function successfully, you will need appropriate documentation for the server application you wish to access, which must provide information on the DDE functions that it supports and the correct syntax to use. 188 DDETerminate Example: ;Run Report and Initialize DDE Run("report.exe", "sales.dat") channel = DDEInitiate("report", "YTD") If channel != 0 ;If DDE OK ;Do DDE Request result = DDERequest(channel, 'TotalSales') DDETerminate(channel) ;Close DDE WinClose("Reports") ;Close Report If result == @FALSE Message("DDE Execute", "Failed") else Message("DDE Request", "Total Sales is %result%") Exit endif else Message("DDE operation unsuccessful", "Check your syntax") endif See Also: DDEExecute, DDEInitiate, DDEPoke, DDETerminate, DDETimeout DDETerminate Closes a DDE channel. Syntax: DDETerminate (channel) Parameters: (i) channel same integer that was returned by DDEInitiate. Returns: (i) always 1. This function closes a communications channel that was opened with DDEInitiate. Example: Run("report.exe", "sales.dat") channel = DDEInitiate("report", "YTD") If channel != 0 ;Run Report ;Initialize DDE ;If DDE OK ;Do DDE Request result = DDERequest(channel, 'TotalSales') DDETerminate(channel) ;Close DDE WinClose("Reports") ;Close Report If result == @FALSE Message("DDE Execute", "Failed") else Message("DDE Request", "Total Sales is %result%") Exit endif else 189 DDETimeout Message("DDE operation unsuccessful", "Check your syntax") endif See Also: DDEExecute, DDEInitiate, DDEPoke, DDERequest, DDETimeout DDETimeout Sets the DDE timeout value. Syntax: DDETimeout (value) Parameters: (i) value DDE timeout time. Returns: (i) previous timeout value. Sets the timeout time for subsequent DDE functions to specified value in milliseconds (1/1000 second). Default is 3000 milliseconds (3 seconds). If the time elapses with no response, the WIL Interpreter will return an error. The value set with DDETimeout stays in effect until changed by another DDETimeout statement or until the WIL program ends, whichever comes first. Example: ;Set Timeout to 5 secs DDETimeOut(5000) ;Run Report Run("report.exe", "sales.dat") channel = DDEInitiate("report", "YTD") ;Initialize DDE If channel != 0 ;If DDE OK ;Do DDE Request result = DDERequest(channel, 'SortByCity') DDETerminate(channel) ;Close DDE WinClose("Reports") ;Close Report If result == @FALSE Message("DDE Execute", "Failed") else Message("DDE Request", "Database sorted") Exit endif else Message("DDE operation unsuccessful", "Check your syntax") endif See Also: DDEExecute, DDEInitiate, DDEPoke, DDERequest, DDETerminate 190 Debug Debug Controls the debug mode. Syntax: Debug (mode [, init-string]) Parameters: (i) mode (s) init-string Returns: (i) @ON or @OFF [optional] the string placed in the edit field of the debug dialog when the dialog is initialized. previous debug mode. Use this function to turn the debug mode on or off. The default is @OFF. When debug mode is on, the WIL Interpreter will display the statement just executed, its result (if any), any error conditions, and the next statement to execute. Debug will attempt to display the entire statement, but if the line does not fit in the display window, it will be truncated at the last character that does fit. The exact number of characters displayed depends on video drivers, screen resolution, etc. The statements are displayed in a special dialog box which gives the user four options: Next, Run, Cancel and Show Var. Next executes the next statement and remains in debug mode. Run exits debug mode and runs the rest of the program normally. Cancel terminates the current WIL program. Show Var displays the contents of a variable whose name the user entered in the edit box. Note: To debug into a 'called' WinBatch script or User Defined Function, make sure to add the corresponding debug command, to the 'called script' or user defined function. Example: Debug(@ON) a = 6 q = AskYesNo("Testing Debug Mode", "Is the Pope Catholic") Debug(@OFF) b = a + 4 191 Debug ... then, if the user presses Next: ... and presses Next again: ... and then presses Yes: 192 DebugData etc. (If the user had pressed No it would have said "VALUE=>0".) See Also: ErrorMode, DebugData, DebugTrace, LastError DebugData Writes data via the Windows OutputDebugString function to the default destination. Syntax: DebugData(string, string) Parameters: (s) string (s) string desired data. more desired data. Returns: (i) always 0. Writes data via the Windows OutputDebugString function to the default destination. The function is generally only useful if you have the proper tools and hardware to debug Windows applications. In general, for standard retail Windows, the default destination is COM1. The Windows SDK provides tools (DBWIN) to allow you to capture the debug data to an alternate device or to a special window. Use of this function in standard retail Windows may interfere with any device, such as a mouse or modem connected to COM1. For users without sophisticated (and expensive) debugging tools, the WIL Debug, DebugTrace, or the Message function work incredibly well. Example: a=45 DebugData("Value of a is", a) ; or for those without expensive tools Message("Value of a is", a) See Also: Debug, DebugTrace, Message 193 DebugTrace DebugTrace Controls and customizes the WIL debugging trace logs. Syntax: DebugTrace(requestcode [ ,parm1 [, parm2 ]] ) Parameters: (i) requestcode (s/i) parm1 (s/i) parm2 Returns: (i) numeric code indicating desired action (see below) [optional] depends on requestcode [optional] depends on requestcode DebugTrace mode state: 0 = Off 1 = Statement by statement Tracing enabled. Note: DebugTrace will create a file showing each line executed and the return value of the line. It will consume considerable processing time and is generally reserved for particularly hard-to-debug problems. DebugTrace will append to the end of the file you specify. You may want to delete the file, if it already exists. To debug into a 'Called' WinBatch script, User Defined Function or User Defined Subroutine, make sure to add the corresponding debug command, to the 'called script', User Defined Function or User Defined Subroutine. Request codes Note: For requests which take a file name, if "filename" is "*DEBUGDATA*" then debug output will be written to the system debugger using the OutputDebugString Windows API (see WIL DebugData function). Request codes fall into one of three categories. Category Modes Mode Option Flags Immediate Action Codes 194 Description These control the DebugTrace line by line logging. These control the log file names, formatting, and content. These cause additional data to be immediately written to the Debug Trace log file. DebugTrace Modes Request code 0 (@OFF) 1 (@ON) 10 22 Meaning Parm1 Stops statement by statement debug tracing. Starts or Resumes statement by statement debug tracing. Parm2 Optional filename to set/change the current debug trace log file. If no previous debug trace file has been specified, then a filename is required. Output filename may be specified by a previous @ON, 10, 100, or 101. Same as 1 (@ON) with the addition that if the output file exists, one attempt will be made to delete the file before continuing. Allow DebugTrace continuation (inherit the debug mode from the caller). By default, when the code enters a UDF, UDS or Call'ed script file, statement by statement debugging is suppressed until the script returns. Adding DebugTrace(22) to a UDF, UDS, or called script will resume statement by statement debugging *IF* it was active on entry. Mode Option Flags: Request code 100 101 Meaning Parm1 Specify output file name for subsequent debug trace logging. Same as 100 with the addition that if the output file exists, one attempt will be made to delete the file before continuing. Required filename parameter Parm2 195 DebugTrace 102 Dump WIL variable table to the debug trace log file when a terminal error occurs. 103 Dump internal debug data for each keyword lookup. 104 Suppress statement timestamp information. 0 - Do NOT dump variable table to debug trade log file. (default) 1 - Dump WIL variable table to the debug trace log file if a terminal error occurs. 0 - Do NOT dump debug data for keyword lookups. (default) 1 - Dump debug data for keyword lookups. 0 - Include statement timing information (default). 1 - Suppress statement timing information. note: This option is useful when creating multiple debug trace log files that you plan to compare with one another using a file-compare type program. As statement timing will vary slightly, this option allows statement timing information to be skipped to avoid non-relevant differences in the generated log files. Immediate Action Codes: Note: DebugTrace(@OFF) does not suppress the execution of these codes. In the case of where a code would output information to the debug trace log file, if the file is defined, then an attempt will be made to write data to it. Request code 200 196 Meaning Parm1 Reset. Turns off statement by statement tracing, and resets all the Mode Option Flags to the default values Optionally set new debug trace file name. If there is no optional parm parameter, or it is set to a null string, the output filename parameter will be cleared. Specifies a string to be written to the debug trace log file. Specifies a string to be written to the debug trace log file. 203 Write a string to the debug trace log file. 204 Write a string, surrounded by "$" signs to the debug trace log file. Parm2 DebugTrace 205 Dump WIL and loaded extender function tables to the debug trace log file. 206 Dump WIL variable table to the debug trace log file. Includes values for simple variable types. Note: Only the first part of long strings will be dumped. Complex variable types (Arrays, Binary Buffers, etc) will not have variables dumped. Dump stack info to the debug trace log file. Dump machine information block. Dump formatted internal debugging information to the debug trace log file. Much of the same information as provided by IntControl 77 is available. 207 208 277 Missing or "" - Display select internal information Numeric value - Displays more detailed information regarding a specific IntControl 77 request. Additional information as needed by IntControl 77 request. For example request code 63 needs additional information. Example: DT_OFF DT_ON DT_ON_DEL DT_RESUME = = = = 0 1 10 22 DT_FILENAME DT_FILENAME_DEL DT_VARS_ON_ERR DT_KEY_LOOKUP DT_TIMING = = = = = 100 101 102 103 104 DT_RESET DT_LOG DT_LOG_MARK DT_VARTABLE DT_STACK DT_HEADERS DT_DEBUGINFO = = = = = = = 200 202 205 206 207 208 277 #DefineFunction MyUDF() DT_RESUME = 22 197 Decimals DebugTrace( DT_RESUME ) ccc = 1 ccc = 2 ccc = 3 ccc = 5 return #EndFunction a = 1 ; start debug tracing. ; if the output file exists, one attempt will be ; made to delete the file before continuing. DebugTrace( DT_ON_DEL , "DTT_TEST.TXT" ) aa = 1 aa1 = 1 aa2 = 2 aa3 = 3 aa4 = 4 zz = MyUDF () bb1 = 1 ; Display select internal information DebugTrace( DT_DEBUGINFO ) ; tab-delimited list of application function table entries DebugTrace( DT_DEBUGINFO , 101 ) bb2 = 2 See Also: ErrorMode, Debug, DebugData IntControl 77 Decimals Sets the number of decimal places to be used when displaying floating point numbers. Syntax: Decimals (places) Parameters: (i) places number of decimals to be displayed. Returns: (i) previously set value. Use this function to set the number of decimal places to be displayed when viewing a floating point number. The floating point number will be rounded to the specified number of decimals. If you require special formatting, use the following: Special Formatting (places): -3 198 Always use scientific format Dialog -2 -1 2 Use alternate method of converting to strings, with no trailing zeros Full precision, dropping of trailing zeros. Computations on US currency -- mortgage or financial calculations Note: The Decimals function only affects a floating point number when it gets converted to a string. This includes: Using variable substitution. Any string function is used. Dialog or Message box. Passed as a string parameter to any function. Example: a=1.23456789 for d = 0 to 10 Decimals(d) Message("Decimals = %d%", a) Next Dialog Displays a user-defined dialog box. Syntax: Dialog (dialog-name [,ignore-flag]) Parameters: (s) dialog-name (i) ignore-flag Returns: (i) name of the dialog box. [optional] 1 to display dialog, or 0 to skip. Note: If not specified one (1) is assumed. value of the pushbutton used to close the dialog box. Note: The Dialog Editor has been included to create your dialogs. Most of the following information is for technical reference only. Please see the WinBatch Users Guide for more information on the WIL Dialog Editor. The text which follows describes how to define a dialog box for use by the Dialog function. Please refer to your product-specific documentation for any additional information which may supplement or supersede that which is described here. Before the Dialog function is called, you must include a section of code in your WIL program which will define the characteristics of the dialog box to be displayed. First of all, the dialog must be declared, and a name must be assigned to it. This is done with a line of the following format: 199 Dialog <dlg-variable>Format="WWWDLGED,6.2" where <dlg-variable> is the dialog name. "WWWDLGED,6.2" is the hard coded format which identifies this dialog box as using the WIL Dialog Type 6.2. This should follow the standard rules for WIL variable names, and may not exceed 19 characters in length. Next, the format of the dialog box is defined, as follows: <dlg-variable>Caption = <box-caption> <dlg-variable>X = <x-origin> <dlg-variable>Y = <y-origin> <dlg-variable>Width = <box-width> <dlg-variable>Height = <box-height> <dlg-variable>NumControls = <ctrl-count> <dlg-variable>Procedure = <procedure-name> <dlg-variable>Font = <font> <dlg-variable>TextColor = <textcolor> <dlg-variable>Background = <background> <dlg-variable>Config = <config> where: <dlg-variable> <box-caption> <x-origin> <y-origin> <box-width> <box-height> <ctrl-count> <procedure-name> 200 is the internal name of the dialog box, as described above. is the text which will appear in the title bar of the dialog box. is the horizontal coordinate of the upper left corner of dialog box. Note: specify 9999 to always force the dialog to center, or specify -1 to center but remember user placement for redisplay. is the vertical coordinate of the upper left corner of the dialog box. Note: specify 9999 to always force the dialog to center, or specify -1 to center but remember user placement for redisplay. is the width of the dialog box. is the height of the dialog box. is the total number of controls in the dialog box (see below). a user defined subroutine or function name. Use the same name you use as part of a #DEFINEFUNCTION or #DEFINESUBROUTINE statement. Your user defined function/subroutine must have five parameters. You do not have to include the parameters, commas or parentheses when you make the name assignment to this dialog definition variable. However, the complete function/subroutine definition must appear in your script before the WIL Dialog command that launches your dialog. The function/subroutine is called one or more times while the dialog is displayed. This procedure is used to respond to Dialog user interactions with the dialog without having to redisplay the dialog. The first call to the function/subroutine is made just before the dialog is displayed. Use this initial call to specify events you wish to monitor. You can find more information on the User Defined Dialog procedure in later sections of this document. <font> The default text font for all controls that accept a font. A control will use this font, if its font attribute is not specified or set to DEFAULT. This font is not used on the dialog’s title text, however. Dialog’s always use the system font in their titles. The font is specified as a string of vertical bar (|) delimited fields. The field values need to be set in such a way that the font will display properly on many different systems. You should use the WIL Dialog Editor to create values for this dialog attribute. WARNING: If a font is selected that doesn't exist on the users system, a substitution will be made. We recommend using commonly available fonts. <textcolor> This is the default text color for all controls that accept text color. A control will use this color when its text color attribute is not specified or is set to DEFAULT. The text color is not used by the dialog’s title. It is specified by three vertical bar (|) delimited numbers ranging from 0 to 255. The numbers represent one of the RGB colors: red, green or blue in that order. The default is color black. Here are some other sample colors: BLACK="0,0,0" WHITE="255,255,255" RED="255,0,0" GREEN="0,255,0" DKGRAY="128,128,128" GRAY="192,192,192" DKRED="128,0,0" DKGREEN="0,128,0" BLUE="0,0,255" PURPLE="255,0,255" YELLOW="255,255,0" CYAN="0,255,255" DKBLUE="0,0,128" DKPURPLE="128,0,128" DKYELLOW="128,128,0" DKCYAN="0,128,128" 201 Dialog <background> This is the dialog’s background bitmap. Specify the bitmap by file name and path enclosed in single quotes. If this value is set to DEFAULT, the system dialog background color will be used. Note: This variable can contain a three field color, a bitmap file path, or both. To specify both, separate the bitmap and color attributes with a comma and make sure the bitmap’s file name and path is enclosed in quotes. When both are specified WinBatch will always attempt to load the bitmap first. If this fails, the color will be used as the dialog background. See the discussion under the heading <textcolor> for more information about color specification. <config> This controls how the Dialog Editor creates the WIL Dialog command in your template. If the variable is given a value of one (1), the editor will create a return variable name that includes the dialog name (<dlg-variable>). For example, if your dialog name is MyDialog, the dialog statement would be: MyDialogPushbutton=Dialog("MyDialog", 1) Without this setting the dialog statement would be: Pushbutton=Dialog("MyDialog", 1) If the variable is given a value of two (2), the Dialog Editor will place a zero (0) in the optional second parameter of the Dialog statement when it creates your dialog template. This optional parameter tells WinBatch to ignore the Dialog statement when it processes a script containing the dialog template. The Dialog Editor, on the other hand, will not ignore the dialog statement so that you can reload the template into the editor at any time. If you do not specify this configuration option, the Dialog Editor will create a dialog statement with the second parameter set to one (1). This tells WinBatch to process the Dialog statement by loading and displaying the dialog template. You can combine the values 1 and 2 using the binary OR(|) operator to enable both features. Finally, you will need to define the objects, or controls, which will appear inside the dialog box. Each control is defined with a line of the following format: 202 Dialog ;The following should all be on a single line <dlg-variable>nn = `x, y, width, height, type, control-name, var/license-string, text/pre-selected item/progid/classid/moniker, value, tab-order, style, font, textcolor, backgroundcolor` where: dlg-variable nn is the name of the dialog box, as described above. is the ordinal position of the control in the dialog box (starting with 1). x is the horizontal coordinate of the upper left corner of the control.. y is the vertical coordinate of the upper left corner of the control. width is the width of the control. height is the height of the control. [This should be DEFAULT for all controls except file-list boxes and item boxes.] type is the type of control, (see below). control-name name used to identify the control in a user defined callback procedure. The name cannot be more than 30 characters in length and MUST be unique. ( This attribute can only be used with 6.2 or later dialog formats. ) var/license string/parent name 203 Dialog var: the name of the variable affected by the control. license string: If you are specifying a COMCONTROL control and it requires a license string, the quoted license string should be placed here. If you have a machine license installed on all computers that run your script, you can place an empty string in this field. The Dialog function will then interrogate the system for the control’s license. Use the DEFAULT keyword as a placeholder if the control does not require a license. parent name: When you specify a MENUITEM this attribute is used to indicate the name of the control, menu bar, or MENUITEM that hosts this menu item. If you place the DEFAULT keyword in this attribute the item will be a menu item on the dialog's context menu. Likewise, placing the name of a control in this attribute will make the item a menu item of the named control's context menu. Placing the name of the MENUBAR control here will cause the item's text to be displayed in the dialog's menu bar. If you use the name of another MENUITEM, the menu item becomes a menu choice on either a dropdown in the case of top level MENUBAR items or a submenu displayed by the menu item named. text/pre-selected item/progid/classid/moniker text: if supported by the control, is the description which will be displayed with the control. [Use an empty string ("") if the control should appear blank.] You can associate a shortcut key with a MENUITEM in this attribute by following the item's text with a back slash (\) and a key combination. The key combination is indicated by using the same key descriptions use with the SendKey function. Note: Short-cut key combination should not be used with menu items that display dropdown menus or submenus. It is not considered good UI design and the menu caption my not display correctly. pre-selected item, if supported by the control, is used to indicate which item in a list or range is the default item for the control. Use this attribute with ITEMLIST and FILELIST controls to have the control initially display selection coloring behind the pre-selected item. In order for the Pre-selected Item to work properly it must be one 204 Dialog of the items listed in the controls variable. Use this attribute with the new DROPLISTBOX control to have a pre-selected value appear in the text box portion of the control. The pre-selected value does not have to be among the values listed in the controls variable. The SPINNER control accepts a pre-select item as its initial value. It will be the displayed value in the text box when the dialog is displayed. Like with other controls it will be the value in the Spinner’s variable, if the user does not make changes. In order for the Pre-selected Item to work properly, it must fall within the range of values specified in the control’s variable. Progid is used with COMCONTROL controls and is the programmatic identifier of an ActiveX , OLE or COM component control that supports integration into an automation client container. It is usually in the form servername.classname. Classid can be used as alternative to a control’s progid. It is a sequence of hexadecimal numbers that must be quoted and enclosed in a curly brace ({}) pair. It is usually in the form “{XXXXXXXX-XXXXXXXX-XXXX-XXXXXXXXXXXX}” were each ‘X’ is a hexadecimal digit. Two special monikers can be used in this attribute to implicitly use the WebBrowser control or MSHTML COM component provided by Internet Explorer. You can use the WebBrowser control by placing a quoted URL moniker recognized by Internet Explorer in the attribute. The URL can point to either a local file or a document on the Internet. Use the Document control by specifying the programmatic identifier “MSHTML:” in this attribute. You can optionally add valid html text after the colon (:) and the MSHTML document object will parse and render the html in its window. value See the discussion under the topic “Using the Internet Explorer Based Control in WIL Dialogs” (pg. 225) for more information. is the value returned by the control. [Use only for pushbuttons, radiobuttons, and checkboxes.] Note: should be within the range of 0 - 127. 205 Dialog tab-order/position tab order: allows you to specify a control's tab order independently of a control's position or name in the dialog template. Tab-order controls the order in which controls are accessed when the keyboard is used to navigate the dialog. It also influences which control is on top when controls have overlapping positions in the dialog. It can be any positive integer, but each control should have a unique number. When you navigate through a dialog using the tab key, lower number controls will be given the keyboard focus before higher controls. Likewise, low-numbered overlapping controls will appear on top of higher numbered controls. If you specify the DEFAULT keyword for this attribute or if you give two controls the same tab order, a tab order will be arbitrarily assigned to the control. Note: The dialog function, under certain circumstances, may change the tab order you specify. The GROUPBOX controls tab order may be adjusted so that it is smaller than any of the controls it contains. In addition, the tab order of the controls inside the GROUPBOX may be adjusted so that they are consecutive. style position: Used with MENUITEM controls, this attribute indicates the display order of the control on a menu relative to other menu items on the same menu. allows you to control the initial appearance and behavior of your control. Numbers represent each style and they can be combined, using the bit-wise OR (|) operator, to set multiple styles. The following table lists the style numbers, their meanings, and the controls that they have an effect on. Style Meaning Controls 1 Control is invisible All 2 Control has disabled appearance and PUSHBUTTON does not accept any user input, it would RADIOBUTTON otherwise accept input. CHECKBOX PICTUREBUTTON EDITBOX MULTILINEBOX ITEMBOX FILELISTBOX CALENDAR 206 Dialog DROPLISTBOX SPINNER GROUPBOX MENUITEM 4 Control will only accept values already DROPLISTBOX in the drop down list portion of the control 8 The controls text cannot be changed by EDITBOX typing in new text when the control has MULTILINEBOX the input focus. (Note: The user can still SPINNER change the value in a SPINNER controls by using the up and down arrows.) 16 Displays all characters as an asterisk (*) EDITBOX as they are typed into the control. 32 A button with this style is the default PUSHBUTTON button when no push or picture button PICTUREBUTTON has the input focus. The user can select this button by pressing the enter key if no button has the input focus. You should only give one button this style. If you give the style to more than one button, only the first button (in the tab order) will have the style. Generally, give this style to the button that is the most likely option in your dialog. 64 Allows only digits to be entered into the EDITBOX edit type controls. (Note: even with this MULTILINEBOX set, it is still possible to paste non-digits into the edit control.) 128 Creates a button with a flat appearance. PUSHBUTTON All aspects of the button's border are PICTUREBUTTON removed including the 3d shadowing. 256 Turns off automatic height adjustment ITEMBOX feature of item and file box controls. FILELISTBOX Normally, these controls adjust their height so that they do not display partial items. This style turns off this feature. 512 Centers text horizontally in the VARYTEXT control’s rectangle. (Cannot be used STATICTEXT with style 1024.) 207 Dialog 1024 Displays text flush-right in the control’s VARYTEXT rectangle. (Cannot be used with style STATICTEXT 512.) 2048 Prevents text selection when control gets EDITBOX the input focus. Cursor is placed to the MULTILINEBOX left of any existing text in the control. 4096 Prevents text selection when control gets EDITBOX the input focus. Cursor is placed to the MULTILINEBOX right of any existing text in the control. Display Security Shield icon on button (Vista or newer) PUSHBUTTON 32768 Adds a check mark to the left of a menu item MENUITEM 65536 Adds a radio button like dot graphic to the left of a menu item MENUITEM 131072 Causes a separator bar graphic to display instead of text at the menu item's location in the menu 262144 Cause a column break to occur at the specific item when used with dropdown, context, or submenus. Causes a line break (new row) with menu items hosted directly by the MENUBAR MENUITEM 8192 font 208 PICTUREBUTTON MENUITEM Note: Specifying 0 for this attribute is equivalent to using the DEFAULT keyword and means that the control will exhibit default behavior. is the font used to display a control's text. The font description should be delimited by double quote (") marks unless the attribute is set to DEFAULT. If this attribute is set to DEFAULT, the font specified as the value of the main dialog font will be used. If the main dialog font is set to DEFAULT, the system font is used. You do not need to provide any value for this attribute unless you are also specifying text or background color. WARNING: If a font is selected that doesn't exist on the user's system, a substitution will be made. We recommend using commonly available fonts. Dialog textcolor backgroundcolor is the color of text associated with a control. Color is specified by three vertical bar (|) delimited numbers ranging from 0 to 255. The numbers represent one of the RGB colors: red, green or blue, in that order. The complete color specification must be surrounded by double quotes (") unless the DEFAULT key word is used. If this attribute is set to DEFAULT, the color listed in the main dialog's textcolor will be used. If a color is not specified for the dialog, the system text color will be used. used to change the color displayed behind a control’s text or to specify the background bitmap for controls that display them. Color is specified by three vertical bar (|) delimited numbers ranging from 0 to 255. The numbers represent one of the RGB colors (red, green or blue, in that order). The complete color specification must be surrounded by double quotes (") unless the DEFAULT keyword is used. If no color is specified or the DEFAULT keyword is used the system background color will be used. Specify a bitmap by a file name and path enclosed in single quotes. You can only place a bitmap in this attribute if the control supports bitmap display. If a control displays a bitmap you cannot place a color specification in the attribute. Note: The numbers used for "x-origin", "y-origin", "box-width", "box-height", "x", "y", "width," and "height" are expressed in a unit of measure known as "Dialog Units." Basically speaking: 1 width unit 1 height unit 4 units wide 8 units high = = = = 1/4 width of system font. 1/8 height of system font. Average width of the system font. Average height of the system font. The following types of controls are available: CALENDAR The Calendar control has a calendar-like user interface. This provides the user with a very intuitive and recognizable method of entering or selecting a date. A user can select a day from the current month and year by simply clicking on a day number. A user can scroll the months of the year by clicking the arrow buttons in the top left or top right of the control. To select a nonadjacent month, the user can click the name of a displayed month, and a pop-up menu appears that lists all months within the year. The user can select a month on the list. If 209 Dialog the user clicks the year displayed next to a month name, a Spinner control appears in place of the year. The user can change the year with this control. The Calendar control will return the user’s selection in the variable you supply as the Variable attribute in the control’s definition. The date will be returned in the standard WIL YYYY:MM:DD:HH:MM:SS date time format. You can also change the control’s font by providing a font string in the Font attribute. However, you cannot change the text or background color of this control. CHECKBOX A square box, in which an "X" appears when selected. A check box can have a value of 0 (unchecked) or 1 (checked). Each checkbox in a dialog should use a unique variable. Normally, when a dialog box opens, every checkbox defaults to being unchecked. You can change this by assigning a value of 1 to the variable before calling the Dialog function. Note: for advanced users only: it is possible to define a group of checkboxes which have the same "var". Each box in the group must have a unique value, which must be a power of 2 (1, 2, 4, etc.). The user can check and uncheck individual checkboxes in the group, and when the Dialog function exits, the value of the variable will be equal to the values of all the checkboxes in the group combined using the bitwise OR operator (|). COMCONTROL Use COMCONTROL in your dialog template to tell the dialog function to host an ActiveX, OLE, VB, or COM component control. You indicate the specific control by placing a programmatic identifier (progid), class identifier (classid) or moniker in the text attribute of the COMCONTROL definition string. If the control requires a license, place the license string in the var attribute. If all computers that execute your script have a machine license then you can set the var attribute to an empty string (""). The DEFAULT keyword should be used as a placeholder in the var attribute position when the control does not require a license. 210 Dialog You can include text font, text color and background color information in the appropriate attribute fields of the control definition string. However, many COM based controls ignore this information. As an alternative, many controls provide properties and method to change the appearance and behavior of the control. To use these properties and methods you can use the DialogObject function to obtain a reference to the control in the initialization (0) call to a user defined dialog callback procedure. Once you have the control reference, you can directly access the properties and methods of the control using standard COM dot notation. Many COM controls support COM events. Events are notifications passed back to the control's container when a use action occurs or a control's state changes. COM events often provide detailed information about the event and some even allow you to pass information back to control. You can receive COM events and related information in your dialog's callback procedure by using the DialogObject function to indicate which control events should cause your dialog callback procedure to be invoked by the control. You can find more information about event handling, including an example, under the DialogObject help topic. You can also find more information about using the Internet Explorer based WebBrowser and MSHTML: controls under the help topic “Using the Internet Explorer Based Controls in WIL Dialogs” (pg. 225). DROPLISTBOX The DROPLISTBOX control is made up of two parts: an EDITBOX and a drop-down ITEMBOX. A user can enter a value in the EDITBOX or select a suggested value from the drop-down items. The drop-down ITEMBOX is displayed by clicking on the arrow next to the EDITBOX. Generally, a DROPLISTBOX is appropriate when there is a list of suggested choices, and an ITEMBOX is appropriate when you want to limit input to what is on the list. In addition, DROPLISTBOX controls save space on your dialog, because the full list is not displayed until the user clicks the down arrow. 211 Dialog You specify the items for the DROPLISTBOX list by placing a delimited list of values in the variable named in the control's Variable attribute. You can give the EDITBOX portion of the control an initial value by placing a string in the Text attribute of the control’s definition. The user’s choice is placed in the variable named in the Variable attribute when the dialog is dismissed. EDITBOX A box in which text can be typed. Whatever the user types in the editbox will be assigned to the defined variable. Normally, when a dialog box opens, editboxes are empty. You can change this by assigning a value to the string variable before calling the Dialog function, in which case the value of the variable will be displayed in the editbox. Note: variable names that begin with "PW_", will be treated as password fields causing asterisks to be echoed for the actual characters that the user types. Limit for EDITBOX controls on Windows NT and newer is the lesser of approximately 2147483646 characters or available memory. FILELISTBOX A file selection list box will allow the user to select a file from any directory or drive on the system. The value of "var" will be set to the selected filename; if you need to know what directory the file is in, use the DirGet function after the Dialog function exits. Normally, when a dialog box opens, file list boxes display files matching a filemask of "*.*" (i.e., all files). You can change this by assigning a different filemask value to the string variable before calling the Dialog function. Normally, if a dialog contains a FILELISTBOX, you must select a file from the list box before you can exit the dialog. You can change this behavior by placing the statement IntControl(4, 0, 0, 0, 0) anywhere in your WIL program prior to the Dialog statement. In combination with the FILELISTBOX, you can include an EDITBOX control which has the same variable name as the file list box. If you do, the user can type a filemask into the edit box (e.g., "*.TXT"), which will cause the file 212 Dialog list box to be redrawn to display only those files which match the specified filemask. Also in combination with the file list box, you can include a VARYTEXT control which has the same variable name as the file list box. If you do, this control will show the name of the directory currently displayed in the file list box. For FILELISTBOXes, "text" should be DEFAULT. Note: You can have only one file list box in a dialog. GROUPBOX The GROUPBOX control is a rectangle that surrounds a set of controls, such as check boxes or radio buttons, with text in its upper left corner. The sole purpose of a Group control is to organize controls related by a common purpose (usually indicated by the text). Along with text, you can specify font, text color and a background color for the control. The background color applies to the area immediately behind the text in the upper left corner. It does not change the background in the majority of the control. ITEMBOX A selection list box. The variable is assumed to contain a tab delimited list. The list is loaded into the list box in the original order (Use the ItemSort function if a sorted list is desired.). The user may choose none, one, or more items in the list. When the dialog box is closed, the selected items are returned via the variable as a tab delimited list. MENUBAR A MENUBAR is a horizontal bar that appears at the top of your dialog just below the title bar. A menu bar contains menu items. Generally, menu items displayed in the menu bar cause dropdown menus to be displayed when selected by the user. MENUITEM MENUITEMs can be displayed on a menu bar or as a menu item associated with a drop-down, context menu or submenu. Dropdown menus are created by placing the name of a MENUITEM displayed in the menu bar in the parent attribute of the menu item's template entry. A submenu is started by placing the name of a MENUITEM other than a menu bar displayed menu item in the parent attribute. Context menus are usually activated by right-clicking the client area of a control or dialog. Create context menus by specifying the name of a control in the parent 213 Dialog attribute. If you use the DEFAULT key word as the MENUITEM parent, the context menu will by associated with the dialog and display when the user right clicks on an 'empty' area of the dialog or on any control that does not already have a system or template supplied context menu. MULTILINEBOX As the name suggests, the MULTILINEBOX control allows a user to enter multiple lines of text. In all other respects, it behaves like an EDITBOX control. Note: MULTILINEBOX controls on Windows NT and newer are only limited by available memory. PICTURE The PICTURE control is a simple control you use to display a bitmap. You indicate the bitmap to display by placing the bitmap file name and, optionally, the file path in the Background attribute parameter of the control’s definition. If you supply a file path, WinBatch will check in the indicated path for the bitmap file before checking other locations. If it does not find the file there or if you do not supply a path, WinBatch will search the current directory, the windows directory and the WinBatch directory for the bitmap file. Your bitmap does not need to be the same size as your PICTURE control. The appropriate stretch or compress is applied to the bitmap so that the entire image is displayed. However, if the aspect ratio of your control is significantly different from the bitmap’s aspect ratio, your image may appear distorted. Although the control does not normally display text, you can still place text in the Text attribute. WinBatch will display the text when it cannot find the bitmap indicated in the "background" attribute while loading the dialog template. PICTUREBUTTTON The Picture Button control is a push button that displays a bitmap on its face instead of text and a background color. Dialog Editor places your indicated bitmap file name and path in the Background parameter. This parameter is used for background color in most other controls. Although the control does not normally display text, you can place a text string in Text attribute. WinBatch will display the text when it cannot find the 214 Dialog bitmap indicated in the Background attribute while loading the dialog template. Also, if you include an ampersand in the text, your users will be able to use an accelerator key to navigate to buttons just like they can with regular push buttons. PUSHBUTTON A button, which can be labeled and used as desired. When the user presses a pushbutton, the Dialog function will exit and will return the "value" assigned to the button which was pressed. Therefore, you should assign a unique "value" to each pushbutton in a dialog. A pushbutton with the value of 0, has special meaning. If the user presses a pushbutton which has a value of 0, the WIL program will be terminated (or will go to the label marked ":CANCEL", if one is defined); this corresponds to the behavior of the familiar Cancel button. The default pushbutton, that is selected if the user presses the Enter key; is the pushbutton with the focus or, if no button has the focus, the default button specified with the style bit.) An ampersand in the button text, acts as an accelerator key for button navigation. For pushbuttons, "var" should be DEFAULT. Note: Every dialog box must contain at least one pushbutton. RADIOBUTTON One of a group of circular buttons, only one of which can be "pressed" (filled in) at any given time. You can have more than one group of radio buttons in a dialog box, but each group must use a different variable. When the Dialog function exits, the value of the variable will be equal to the "value" assigned to the radio button which is pressed. Therefore, you should assign a unique "value" to each radio button in a group. Normally, when a dialog box opens, the default radio button in each group (i.e., the one which is pressed) is the first radio button, "called" in each group. You can change this by assigning a default "value" to the variable before calling the Dialog function. 215 Dialog SPINNER The SPINNER control has a pair of arrow buttons which the user can click to increment or decrement a value displayed in a small edit box connect to the arrow buttons. Use the control’s variable attribute to set the range of values that the control will display. The variable should contain a vertical bar (|) delimited list with two or three items. "{minimum}|{maximum}|{increment/decrement}" Make the first item the minimum value and the second the maximum value. The minimum value can be greater than the maximum value, but both values must be in the range of -32768 to 32767, and the difference between the values cannot exceed 32767. The third value indicates the amount to add or subtract from the displayed number each time the user clicks an up or down arrow (or presses the arrow keys when the control has the input focus.) The control adds or subtracts one (1) each time, if you do not supply the third value. The final value selected by the user is placed in the "variable" when the Dialog function returns. You can indicate the initial value for your control by placing a number in the text attribute of the control definition. The control will default to the minimum value if you do not indicate an initial value, or if your initial value does not fall within the range you have selected in the "variable" attribute. STATICTEXT Descriptive text, which does not change. This can be used to display titles, instructions, etc. For static text controls, the variable should be DEFAULT. VARYTEXT Variable text. The current value of the variable is displayed. If a variable is not assigned a value in the WIL program before calling the Dialog function, the "text" field of the control definition will be used. The following table is a complete list of controls. Controls are identified by their type name along the left side of the table. Control attributes are named along the top of the table. A check mark indicates that the control in the row has the attribute in the column. Controls and Their Attributes 216 Dialog Variable/ License String / Parent Name [*] Pushbutton Picture RadioButton CheckBox PictureButton EditBox MultiLineBox GroupBox ItemBox FileListBox RadioButton Spinner StaticText VaryText EditBox Calendar DropListBox ComControl MenuItem MenuBar V V V V V V V V V V V V L PN Text/ pre-sel/ moniker [**] T T T T T T T T P P T T T T T P P M T Value Style 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 Tab Font Text Back Ord / color ground [****] Pos [***] 9 9 TO C TO B 9 9 TO C 9 9 TO C TO B 9 9 TO C 9 9 TO C 9 9 TO C 9 9 TO C 9 9 TO C 9 9 TO C 9 9 TO C 9 9 TO C 9 9 TO C 9 9 TO C 9 TO 9 9 TO C 9 9 TO C RP [*] V = variable, L = license string, PN = parent name [**] T = control text, P = pre-selected value, M = progid/classid/moniker [***] TO = tab order, RP = relative position [****] B = bitmap, C= color spec. Notes: You can have a maximum of 300 controls in a dialog. When the Dialog function encounters a dialog template line that it cannot parse you will receive an error. You can access the template line and error number by clicking on the 'More Error Info' button on the error dialog. Dynamic Dialogs Some WIL functions have been added to support the Dynamic Dialog feature of the Dialog function. In order to take advantage of this feature, you will also need to create your own User Defined Callback Procedure. This procedure allows you to modify the appearance of your dialog and execute WIL commands while your dialog remains on the screen. WinBatch Studio provides a right click context menu that helps generate a User Defined Callback Procedure template based on your dialog. To have WinBatch Studio generate the User Defined Callback Procedure template code, you simply highlight your Dialog code, top to bottom, starting with the line: 217 Dialog MyDialogFormat="WWWDLGED,6.2" all the way down to and including the following line: ButtonPushed=Dialog( "MyDialog" ) Next, right-click anywhere in the WinBatch Studio edit window, then select the menu items: Code Blocks Create Dialog Callbacks in Clipboard Function with Constants When it is complete it copies the template code to the clipboard. Simply paste the generated template code into your script, usually above your Dialog code or at the beginning of your script. User-Defined-Callback Function or Subroutine Syntax: UserDefinedCallback( dialog-handle, event-code, control-name, event-info, reserved) Parameters: (i) dialog-handle (i) event-code (i) control-name (i) event-info (i) reserved Returns: (i) handle to dialog event code for event that produced call to UDC name of control associated with event event information object (valid only when event-code = 14) reserved 0 cancels dialog without updating control variables -1 Dialog performs usual processing after return -2 Dialog will not terminate. (Note: control variables will not get updated until the Dialog exits.) Use DialogControlGet and DialogControlSet, to get and set values. n (positive integer) performs usual processing and exits dialog and the number n is the return value of the Dialog statement as it exits. “UserDefinedCallback” is a placeholder for the name of a function or subroutine you place after the #DEFINEFUNCTION or #DEFINESUBROUTINE reserved words in your WIL scripts. Your implementation must accept five (5) parameters as shown. 218 Dialog dialog-handle The first parameter is a handle to the Dialog associated with the procedure by assigning the routine's name to the <dlg-variable>procedure variable. event-code The second parameter is an event code that tells your procedure which event triggered the latest call. control-name The third parameter indicates the name of the control associated with the event in parameter two. This is the same name that appears as the name attribute of the control in the control's definition (legacy dialog formats, i.e. earlier than 6.2, used the control's number in this parameter.) event-info When the second parameter has the value COM-event (14), the fourth parameter contains a reference to an event information object. An event information object is a WinBatch generated COM object that contains information about the COM event that is calling to your user-defined function. The event-info object has the following properties Identifier This is the user defined identification number originally passed as the fifth parameter to the DialogObject function. Eventname This is the name of the event you obtained from the controls documentation and passed as the fourth parameter to the DialogObject function. Count This property contains the number of parameters associated with the event. It also indicates the number of Parameter objects in the Parameters property. Count is zero (0) when the event does not have any parameters. Parameters(index) This indexed property returns one Parameter object for each parameter associated with the event. The index parameter indicates which event parameter you wish to access and should be a number between one (1) and Count. The parameter object has Value as its only property. You can use the value property to either access the information associated with the event parameter or return information to the control by assignment. To access an event parameter value you can do the following ; The "MSCAL.Calendar" control's "KeyPress" event had 1 219 Dialog ; parameter – the code for the key pressed by the user. nKey = EventInfo.Parameters(1).value message("Key code", nKey) You can return information to a control too ; The "MSCAL.Calendar" control's "BeforeUpdate" event had 1 ; parameter. You can use it to cancel a control change. EventInfo.Parameters(1).value = @True Reserved The last parameter is reserved for future development. If you make the associations between your procedure and the Dialog via a dialog variable assignment, your procedure will always be called at least one time. This initial call occurs after your dialog has been created but just before it is displayed. This initial call (event-code = 0) is good place to inform the dialog about other events you would like to handle. You can do this by making one call to the DialogProcOptions or DialogObject function for each event you wish to handle in your procedure. After you make one or more calls to DialogProcOptions or DialogObject, each specified event will generate a call to your procedure with the event-code parameter set to the triggering event and the control-name parameter set to the control associated with the event. This table provides the list of dialog event codes that your dialog procedure can receive through the event-code parameter (parameter two). Conveniently, these event-codes can also be used in calls to the DialogProcOptions function to indicate that you want to process the event. Codes 0 1 2 3 4 5 6 220 Meaning Initialization: Dialog has been created but not displayed. This event is only generated once per Dialog session. Timer: Set a Timer event Pushbutton or Picturebutton Pushed: User has pressed a PUSHBUTTON or PICTUREBUTTON control. Radiobutton Selected: User has selected a RADIOBUTTON. Checkbox Checked/Unchecked: User has checked or unchecked a CHECKBOX control. Changed text in Editbox or Multilinebox: User has changed the text in an EDITBOX or MULTILINEBOX control Filelistbox File Selected: User has selected a file in a FILELISTBOX control Dialog 7 8 9 10 11 12 13 15 Itembox Item Selected: User has selected one or more items in a ITEMBOX control. Droplistbox/Combobox Item Change: User has changed the text appearing at the top of a DROPLISTBOX. This event can be triggered by the user picking a new item from the list portion of the control or by the user typing new text into the control. Calendar Date Change: User has selected a new date in a CALENDAR control. Spinner Number Change: User has changed the value of a SPINNER control. Close: User has selected the Close command from the system menu. This event only applies to dialog's with system menus enabled by a call to DialogProcOption code 1002. Filelistbox File Double-Clicked: the user has used the mouse to double-click an item in an FILELISTBOX. Itembox Item Double-Clicked: the user has used the mouse to double-click an item in an ITEMBOX. Menu item selected: The user has used the mouse, an access key or hot-key to select a MENUITEM. Note: The user-defined callback is not called in response to the mouse selection of menu item that have an associated dropdown menus or submenus. The associated dropdown or submenu is displayed instead. Hot-keys should not be used with menu items that display a dropdown or submenu. Other events NOT supported by DialogProcOptions: 14 COM-Event: This event is not supported by DialogProcOptions. Use DialogObject to monitor for COM events.. Other NON-events supported by DialogProcOptions: 1000 1001 1002 Dialog Disable: Grey the dialog's title bar and redraw dialog as necessary. Optionally, display the system's "wait cursor". Note: If you have code that may take a long time to execute in a callback, you may need to temporarily disable the dialog. Don't forget to enable after the process is complete. Change Background: Change the dialog's background bitmap or color. Change System Menu: Change the dialog’s title bar system menu. Note: this dialog option overrides the system menu settings established with IntControl 49. 221 Dialog 1003 Change Dialog Title: Change the dialog’s title. Note: the maximum dialog title length is 254 characters. Procedure return values In addition to the processing you perform in response to events, your procedure's return value has an important impact on the behavior of your dialog. For example, usually any button process will terminate a dialog, but by returning minus two (-2) in response to an event-code of 2 you can force the dialog to stay on the screen. (Of course, you still need to provide a way for the user to dismiss the dialog so you may want to turn on system menus with DialogProcOptions code 1002 or return minus one (-1) when one of the dialog's buttons is pressed.) The return value of zero will cancel the entire script, unless the cancel is handled with the :cancel label and/or with IntControl 72. Dynamic Dialog Example: PROCOPT_INIT = 0 ; Dialog created . PROCOPT_PUSH = 2 ; Pass push/picture button presses. #DefineSubRoutine ExampleProc(DialogHandle, EventCode, ControlName, Res4, Res5) Switch( EventCode) Case PROCOPT_INIT DialogProcOptions(DialogHandle, PROCOPT_PUSH, 1) break Case PROCOPT_PUSH If ControlName == "Pushbutton_Hello" Display(2,"","Hello World") Return -2 ; Don't termnate the dialog endif If ControlName == "Pushbutton_Bye" Display(2,"","Goodbye World") Return -1 endif EndSwitch Return -1 #EndSubRoutine 222 Dialog ExampleOneFormat=`WWWDLGED,6.2` ExampleOneCaption=`Simple Callback Example` ExampleOneX=029 ExampleOneY=060 ExampleOneWidth=174 ExampleOneHeight=094 ExampleOneNumControls=002 ExampleOneProcedure=`ExampleProc` ExampleOneFont=`DEFAULT` ExampleOneTextColor=`DEFAULT` ExampleOneBackground=`DEFAULT,DEFAULT` ExampleOneConfig=0 ExampleOne001=`029,051,034,014,PUSHBUTTON,"Pushbutton_Hello",DEFAULT,"H ello",1,1,DEFAULT,DEFAULT,DEFAULT,DEFAULT` ExampleOne002=`093,051,034,014,PUSHBUTTON,"Pushbutton_Bye",DEFAULT,"Goo d Bye",0,2,DEFAULT,DEFAULT,DEFAULT,DEFAULT` ButtonPushed=Dialog("ExampleOne",1) Exit Simple Example: MyDialogFormat=`WWWDLGED,6.2` MyDialogCaption=`Edit INI file` MyDialogX=069 MyDialogY=124 MyDialogWidth=176 MyDialogHeight=184 MyDialogNumControls=014 MyDialogProcedure = `DEFAULT` MyDialogFont=`DEFAULT` MyDialogTextColor=`DEFAULT` MyDialogBackground=`DEFAULT` MyDialogConfig=0 MyDialog001=`109,157,58,14,PUSHBUTTON,"PushButton_Cancel",DEFAULT,"&C ancel",0,1,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog002=`111,77,60,14,PUSHBUTTON,"PushButton_Notepad",DEFAULT,"&N otepad",1,2,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog003=`111,95,60,14,PUSHBUTTON,"PushButton_WBS",DEFAULT,"&WinBa tch Studio",2,3,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog004=`111,113,60,14,PUSHBUTTON,"PushButton_Write",DEFAULT,"Wri &te",3,4,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog005=`111,131,60,14,PUSHBUTTON,"PushButton_WinWord",DEFAULT,"W inW&ord",4,5,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog006=`111,35,58,14,RADIOBUTTON,"RadioButton_Normal",state,"No& rmal",1,6,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog007=`111,49,58,14,RADIOBUTTON,"RadioButton_Zoomed",state,"&Zo omed",2,7,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog008=`111,63,58,14,RADIOBUTTON,"RadioButton_Iconized",state,"& Iconized",3,8,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog009=`111,21,58,14,CHECKBOX,"CheckBox_BAK",backup,"Make 223 Dialog &BAK",1,9,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog010=`5,3,34,14,STATICTEXT,"StaticText_Directory:",DEFAULT,"&D irectory:",DEFAULT,10,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog011=`41,3,130,20,VARYTEXT,"VaryText_FileName",editfile,"*EMPT Y*",DEFAULT,11,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog012=`5,15,18,12,STATICTEXT,"StaticText_File:",DEFAULT,"&File: ",DEFAULT,12,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog013=`5,35,100,140,FILELISTBOX,"FileListBox_Files",editfile,DE FAULT,DEFAULT,13,DEFAULT,DEFAULT,DEFAULT,DEFAULT` MyDialog014=`5,25,100,10,EDITBOX,"EditBox_File",editfile,"None Selected",DEFAULT,14, DEFAULT,DEFAULT,DEFAULT,DEFAULT` DirChange(DirWindows(0)) editfile = "*.INI" backup = 1 state = 2 ; Set default mask for filelistbox ; Set the checkbox to be on by default ; Set the 2nd radio button as the default :DISPLAY_DLG ButtonPushed = Dialog("MyDialog",1) ; If the user didn't select a valid file, re-display the dialog If !FileExist(editfile) Then Goto DISPLAY_DLG ; Find out if the checkbox was checked, and proceed accordingly If backup == 1 bakfile = StrCat(FileRoot(editfile), ".BAK") FileCopy(editfile, bakfile, @TRUE) endif ; Find out which radio button was pressed, and set the variable ; "runcmd" to the name of the appropriate member of the Run "family" Switch state case 1 runcmd = "Run" break case 2 runcmd = "RunZoom" break case 3 runcmd = "RunIcon" break endswitch ; Set the variable "editor", based on the pushbutton that was pressed Switch ButtonPushed case 1 editor = FileLocate("notepad.exe") break case 2 editor = FileLocate("WinBatch Studio.exe") break case 3 224 Dialog editor = FileLocate("write.exe") break case 4 editor = FileLocate("winword.exe") break endswitch ; Execute the appropriate command (using variable substitution) %runcmd%(editor, editfile) Exit :cancel ; If we got here, it means the user pressed the Cancel pushbutton Message(MyDialogCaption, "Operation cancelled") Using Internet Explorer Controls in WIL Dialogs You can display rendered HTML in WIL Dialogs using either the WebBrowser Control or the MSHTML component of Internet Explorer. In order to use Internet Explorer controls in WIL dialogs you must have at least version 4.0 of Internet Explorer installed on the system. Some features shown in the accompanying examples may require an even more recent version of Internet Explorer. Choosing the Correct Component The WebBrowser Control adds browsing, document viewing, and data downloading capabilities to your WIL dialogs. The Web Browser Control also acts as a container for the MSHTML component which provides parsing and rendering of HTML. 225 Dialog The WebBrowser Control and the MSHTML component each have their own events and MSHTML document events do not bubble up to the WebBrowser Control. This means that you cannot set your dialog callback procedure as the event handler for MSHTML component events when it is hosted by the WebBrowser Control. Therefore, if you wish to handle html document events like onClick or onkeypress in your dialog callback, you should use the MSHTML component. On the other hand, if you wish to simply add web or local file browsing to your dialog, consider the WebBrowser Control. It is still possible to handle MSHTML component events when MSHTML is hosted by the WebBrowser control. However, it requires using the ObjectEventAdd function with a separate event handling user-defined function or subroutine for each event. Using the MSHTML Component You use the MSHTML component by specifying the programmatic identifier with colon “MSHTML:” in the text attribute of a COMCONTROL control definition string. Optionally, you can add standard html following the colon. The added html will be parsed and rendered by the component. For example, the following control definition will display a gif image in a dialog ; (Note: control definition strings must be on a single line.) Exam001=`001,001,327,161,COMCONTROL,"Com_Mshtml",DEFAULT,MSHTML:<IMG SRC="C:\Projects\Example\nebula.gif">,DEFAULT,1,DEFAULT,DEFAULT,DEFAU LT,DEFAULT` More sophisticated html content can become problematic because it needs to conform to both html and WIL dialog template syntax in the control definition string. Also, the amount of html is restricted by WinBatch line limit. For these reasons, it is recommended that you dynamically create html content for an MSHTML control when the content involves more than a simple, single tag. You can create html dynamically by placing a “MSHTML:” without any html text in the control's definition string. You then add html text using the MSHTML object's writeln or write method in the initialization (0) call to the dialog callback procedure. Here is a simple example that illustrates creating html dynamically to produce a visual affect not possible with standard WIL dialogs. #DefineSubRoutine ExamProc(Exam_Handle,Exam_Message,Exam_ControlName, Exam_EventInfo, reserved) ;DialogprocOptions Constants MSG_INIT=0 ; The one-time initialization ; New options for DialogObject DLGOBJECT_ADDEVENT = 1 ;DialogObject add event DLGOBJECT_REMOVEVENT = 2 ;DialogObject remove event DLGOBJECT_GETOBJECT = 3 ;DialogObject get reference to object 226 Dialog DLGOBJECT_GETPICTURE = 4 ;DialogObject get a picture object ; New callback message MSG_COMEVENT = 14 ;COM control event fired Switch Exam_Message Case MSG_INIT ; Get the control's object objHtmlDoc = DialogObject(Exam_Handle, "Com_Mshtml", DLGOBJECT_GETOBJECT) objHtmlDoc.write('<HTML>') objHtmlDoc.write('<HEAD>') objHtmlDoc.write('<TITLE>MSHTML Example</TITLE>') objHtmlDoc.write('<STYLE> .textRed { COLOR: red }');Requires IE 5 objHtmlDoc.write('.textBlue { COLOR: blue } </STYLE>') objHtmlDoc.write('</HEAD>') objHtmlDoc.write('<BODY>') objHtmlDoc.write(`<H1 class="textBlue" onmouseover="this.className='textRed'"`) objHtmlDoc.write(`onmouseout="this.className='textBlue'">`) objHtmlDoc.write('Mouse over this text to see the color change ') objHtmlDoc.write('from blue to red and back to blue') objHtmlDoc.write('</H1>') objHtmlDoc.write('<INPUT id="Button1" type="button" value="OK" name="Button1"') objHtmlDoc.write('style="Z-INDEX: 101; LEFT: 168px; WIDTH: 72px;') objHtmlDoc.write('POSITION: relative">') objHtmlDoc.write('</BODY>') objHtmlDoc.write('</HTML>') ; Add an event DialogObject(Exam_Handle,"Com_Mshtml",DLGOBJECT_ADDEVENT,"onclick",1) Return(-1) Case MSG_COMEVENT ; Test in case more events or COM controls are added later If Exam_EventInfo.identifier == 1 && Exam_ControlName == "Com_Mshtml" ; Get event source object associated with the event objSource = objHtmlDoc.parentWindow.event.srcElement ; Button clicked? If objSource.tagName == "INPUT" If objSource.value == "OK" ; In case more added later. ; Release object references objSource = 0 objHtmlDoc = 0 Exam_EventInfo = 0 Return(1) ; Quit dialog EndIf 227 Dialog EndIf EndIf EndSwitch ; Exam_Message Return(-1) ; Do default processing #EndSubRoutine ; End of Dialog Callback ExamProc ExamFormat=`WWWDLGED,6.2` ExamCaption=`MSHTML Example` ExamX=021 ExamY=058 ExamWidth=179 ExamHeight=147 ExamNumControls=001 ExamProcedure=`ExamProc` Exam001=`002,001,178,145,COMCONTROL,"Com_Mshtml",DEFAULT,"mshtml:",DEFA ULT,1,DEFAULT,DEFAULT,DEFAULT,DEFAULT` ButtonPushed=Dialog("Exam") Events and the MSHTML Component While most COM controls use the dialog callback procedure's Event Information Object parameter to pass event information to your callback procedure, the MSHTML component uses a different mechanism. This means that the Event Information Object passed to your dialog callback will have values for the Identifier and EventName properties but the Count property will be set to zero (0) and the Parameters property will not have any values. Instead, the MSHTML component provides its own event object. The object contains event information; such as the element in which the event occurred, the state of the keyboard keys, the location of the mouse and the state of the mouse buttons. Accessing the MSHTML Event Object The event object is accessed via the event property of a window object that represents a window associated with the MSHTML component. Typically, the component creates one window object when it opens an HTML document. However, if a document defines one or more frames, the component creates one window object for the original document and one additional window object for each frame. Here is an example that illustrates how to access the event object of the main window from inside your dialog callback ; Get the MSHTML component's object objHtmlDoc = DialogObject(Dlg_Handle, "Com_Mshtml", DLGOBJECT_GETOBJECT) ; Access the event object for a main window event objEvent = objHtmlDoc.parentWindow.event 228 Dialog Using the MSHTML Event Object The event object is provided by the MSHTML component for all events but its use can vary depending on the event being handled. All event properties are available to all event objects, but some properties might not have meaningful values during some events. For example, the fromElement and toElement properties are meaningful only when processing the onmouseover and onmouseout events. For this reason it is important to examine the srcElement property of the event object to identify the HTML element that is associated with the event before using other properties of the event object. Also keep in mind that the properties of the object returned by srcElement will vary with the type of element. You can find more information on the objects, properties and methods of the event object on Microsoft's MSDN web site. Using the WebBrowser Control The WebBrowser control contains the MSHTML component plus additional features including navigation, hyperlinking, history lists and favorites. You add the WebBrowser control to a dialog by placing a quoted URL moniker in the text attribute of a COMCONTROL control definition string. The moniker can be a URL to a World Wide Web site, a local file path/name or any other moniker recognized by Internet Explorer. While the WebBrowser control does contain an MSHTML component, MSHTML events do not bubble up to the WebBrowser control. This means that the dialog callback procedure can be used to handle events fired by the WebBrowser control but it cannot be used to handle events fired by the MSMTHML component when the component is hosted by the WebBrowser control. The following example uses the URL to the WinBatch Technical Database Web site to initialize a WebBrowser control in a WIL dialog. The newWindow2 and the commandStateChange WebBrowser events are used to control navigation and update the state of other dialog controls respectively. For demonstration purposes the initial URL only points to the left hand frame of the site's page. This is done to illustrate a technique for handling navigation to a nonexistent frame as happens if a user clicks on a search result after executing a Tech Data Base search. Special handling is necessary because the WebBrowser control will create a new unhosted window when there is targeted navigation to a frame name that does not yet exist. "Unhosted" means that the new window is not displayed as part of the dialog and the dialog procedure will not receive the new window's events. Several things can be done to prevent the creation of an unhosted window. You could simply set the second parameter of the newWindow 2 event to @TRUE to cancel the window Exam_EventInfo.Parameters(2).value == @True 229 Dialog However, this not only cancels the window, it also cancels the navigation. If you want the user to be able to navigate to a targeted frame from your dialog's WebBrowser control, you need a second dialog control to serve as a navigation target. In the example, this is accomplished by creating a hidden second WebBrowser control and assigning its reference to the first parameter of the newWindow2 event. Exam_EventInfo.Parameters(1).value = DialogObject(Exam_Handle, nHidden, DLGOBJECT_GETOBJECT) Now when the newWindow2 event fires, the second WebBrowser control is made visible and accepts the navigation request. Notice that since the controls occupy the same location on the dialog, the original control's style is changed to invisible. Also notice that the second parameter of the event is not changed. This is because the default setting for this parameter is @FALSE which tells the control not cancel new window navigation. The dialog also handles the commandStateChange event. The event is used to adjust the state of the Forward and Back dialog buttons to match the presence or absence of the corresponding navigation history. #DefineSubroutine ExamProc(Exam_Handle,Exam_Message,Exam_ControlName, Exam_EventInfo, reserved) ; Dialog constants MSG_INIT MSG_BUTTONPUSHED DCSTATE_ADDSTYLE DCSTATE_REMOVESTYLE DCSTYLE_INVISIBLE DCSTYLE_DISABLED = = = = = = ; New message. MSG_COMEVENT = 14 ;COM control event fired. 0 2 3 4 1 2 ; ; ; ; ; ; The one-time initialization Pushbutton or Picturebutton Add control style Remove control style Set Control Invisible Disable control ; New - options for DialogObject DLGOBJECT_ADDEVENT = 1 ; DialogObject DLGOBJECT_REMOVEVENT = 2 ; DialogObject DLGOBJECT_GETOBJECT = 3 ; DialogObject DLGOBJECT_GETPICTURE = 4 ; DialogObject add event. remove event. get reference to object. get a picture object. ; WebBrowser state change constants. CSC_NAVIGATEFORWARD = 1 CSC_NAVIGATEBACK = 2 switch Exam_Message case MSG_INIT ; Initialize variable used to track hidden browser window. sVisible = "ComControl_1" sHidden = "ComControl_2" ; Want button messages. 230 Dialog DialogProcOptions(Exam_Handle, MSG_BUTTONPUSHED, 1) ; Add a COM event for both WebBrowser controls DialogObject(Exam_Handle, "ComControl_1", DLGOBJECT_ADDEVENT, "CommandStateChange",1) DialogObject(Exam_Handle, "ComControl_2", DLGOBJECT_ADDEVENT, "CommandStateChange",1) DialogObject(Exam_Handle, "ComControl_1", DLGOBJECT_ADDEVENT, "NewWindow2", 2) DialogObject(Exam_Handle, "ComControl_2", DLGOBJECT_ADDEVENT, "NewWindow2", 2) return(-1) case MSG_COMEVENT ; COM event message ; Test in case more events or COM controls are added later if Exam_ControlName == "ComControl_1" || Exam_ControlName == "ComControl_2" switch Exam_EventInfo.identifier case 1 ; CommandStateChange - use to update button status ; Event parameter 1 contains the command that is about to change if Exam_EventInfo.Parameters(1).value == CSC_NAVIGATEFORWARD sControl = "PushButton_Forward" ; Forward button else if Exam_EventInfo.Parameters(1).value == CSC_NAVIGATEBACK sControl = "PushButton_Back" ; Back button else break ; Do nothing. endif endif ; Event parameter 2 indicates whether the command is ; being activated or deactivated if Exam_EventInfo.Parameters(2).value nRequest = DCSTATE_REMOVESTYLE ; Command active else nRequest = DCSTATE_ADDSTYLE ; Command inactive endif DialogControlState( Exam_Handle, sControl, nRequest , DCSTYLE_DISABLED) Break case 2 ; NewWindow2 - catches new window launches ; Set event parameter 1 to the other window to prevent IE creating ; an unhosted window Exam_EventInfo.Parameters(1).value = DialogObject(Exam_Handle, sHidden, DLGOBJECT_GETOBJECT) ; Change visibility of WebBrowser controls DialogControlState(Exam_Handle,nHidden,DCSTATE_REMOVESTYLE,DCSTYLE_IN VISIBLE ) DialogControlState(Exam_Handle, Exam_ControlName,DCSTATE_ADDSTYLE,DCSTYLE_INVISIBLE) ; Update hidden variable to reflect change. sVisible = sHidden sHidden = Exam_ControlName DialogControlState(Exam_Handle, "PushButton_Other", DCSTATE_REMOVESTYLE, DCSTYLE_DISABLED) 231 Dialog Break endswitch endif break case MSG_BUTTONPUSHED ; Navigation buttons if Exam_ControlName == "PushButton_Back" ; Back button objWebBrowser = DialogObject(Exam_Handle, sVisible, DLGOBJECT_GETOBJECT) objWebBrowser.GoBack() objWebBrowser = 0 return -2 ; Don't quit. endif if Exam_ControlName == 004 ; Forward button objWebBrowser = DialogObject(Exam_Handle, sVisible, DLGOBJECT_GETOBJECT) objWebBrowser.GoForward() objWebBrowser = 0 return -2 ; Don't quit. endif if Exam_ControlName == "PushButton_Other" ; Other Window button switch controls DialogControlState(Exam_Handle, sVisible, DCSTATE_ADDSTYLE, DCSTYLE_INVISIBLE ) DialogControlState(Exam_Handle, sHidden, DCSTATE_REMOVESTYLE,DCSTYLE_INVISIBLE ) objWebBrowser = DialogObject(Exam_Handle, sVisible, DLGOBJECT_GETOBJECT) objWebBrowser.stop objWebBrowser = DialogObject(Exam_Handle, sHidden, DLGOBJECT_GETOBJECT) objWebBrowser.Refresh2(1) ; 1 means normal refresh objWebBrowser = 0 sTemp = sHidden sHidden = sVisible sVisible = sTemp return -2 ; Don't quit. endif if Exam_ControlName == "PushButton_Quit" ; Quit button Exam_EventInfo = 0 ; Free reference - appropriate when using subroutine break ; Done endif break endswitch ; Exam_Message return(-1) ; Do default processing #EndSubroutine ; End of Dialog Callback ExamProc ExamFormat=`WWWDLGED,6.2` ExamCaption=`WebBrowser Example` ExamX=021 ExamY=058 ExamWidth=350 232 Dialog ExamHeight=240 ExamNumControls=006 ExamProcedure=`ExamProc` Exam001=`001,001,343,214,COMCONTROL,"ComControl_1",DEFAULT,"http://tech supt.winbatch.com/webcgi/webbatch.exe?techsupt/tsleft.web",DEFAULT,1,0, DEFAULT,DEFAULT,DEFAULT` Exam002=`001,001,343,214,COMCONTROL,"ComControl_2",DEFAULT,"about:blank ",DEFAULT,1,0,DEFAULT,DEFAULT,DEFAULT` Exam003=`014,222,041,010,PUSHBUTTON,"PushButton_Back",DEFAULT,"Back",1, 3,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Exam004=`063,222,041,010,PUSHBUTTON,"PushButton_Foreward",DEFAULT,"Fore ward",2,4,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Exam005=`126,222,041,010,PUSHBUTTON,"PushButton_Other",DEFAULT,"Other Window",3,5,2,DEFAULT,DEFAULT,DEFAULT` Exam006=`295,222,041,010,PUSHBUTTON,"PushButton_Quit",DEFAULT,"Quit",4, 6,DEFAULT,DEFAULT,DEFAULT,DEFAULT` ButtonPushed=Dialog("Exam") WIL Additional Properties for Internet Explorer Components WinBatch adds several properties to the programming models of Internet Explorer components. These properties give you additional control over the appearance and behavior of both the WebBrowser Control and the MSHTML component. Gaining Access to Additional Properties To access the properties when using the MSHTML component use the DialogObject function to obtain a references to the component for inside the dialog callback procedure. You then need to obtain a reference to the parent window of the MSHTML component by calling the parentWindow property and then the window object's external property to get and set the WIL supplied additional properties. Here is an example ; Get the control's object. objHtmlDoc = DialogObject(Dialog_Handle, "ComControl_1", DLGOBJECT_GETOBJECT) ; Turn off context menus. objHtmlDoc.parentWindow.external.ContextMenu = @false Since the WebBrowser control hosts the MSHTML component you need to use the document property to reference the MSHTML component before accessing WIL provided properties. Here is an example ; Get the control's object. objWebBrowser = DialogObject(Dialog_Handle, "ComControl_1", DLGOBJECT_GETOBJECT, "", 0) ; Turn off context menus. objWebBrowser.document.parentWindow.external.contextMenu = @false 233 DialogControlGet The WebBrowser’s document property does not automatically return a valid object when the control is created because the document object is not instantiated until after the contents of the document are loaded into the control. This means you should not set WIL additional properties from case zero (0) of your dialog procedure as you can with the MSHTML component. The best time to set these properties is when your dialog procedure is called by the DownloadComplete event. This insures that document creation is completed and the document property will return a valid object reference. See the Dialog function topic for more information on control events. The Additional Properties The following properties are provided by WIL to modify the behavior and appearance both of the WebBrowser Control and the MSHTML component. Scrollable Set this property to @TRUE to allow the user to scroll the content displayed by the control. The user cannot scroll the content of the control when the property is set to @FALSE. When set to @TRUE scroll bars are displayed in the control. The default for this property is @TRUE. FlatScrollBars When this property is set to @TRUE control scrollbars have a flat appearance. This property has no effect unless the Scrollable property is set to @TRUE. The FlatScroollBars property is set to @FALSE by default. ContextMenu This property controls the display of context menus when a user right-clicks on the control. When set to @TRUE the control’s context menu is displayed. When set to @FALSE a right-click has no effect. The default for this property is @TRUE. ThreeDBorder Use this property to control the appearance of the control’s border. This property affects the displayed documents border and any framesets within the document. Set the property to @TRUE to turn on 3-D borders. This property’s default is @FALSE. See Also: AskLine, AskPassword, AskYesNo, IntControl, AskItemList, DialogProcOptions, DialogControlState, DialogControlGet, DialogControlSet, DialogObject DialogControlGet Returns text and state information associated with a control. 234 DialogControlGet Syntax: DialogControlGet(dialog-handle, control-name, request-code) Parameters: (i) dialog-handle (s) control-name (i) request-code handle to dialog name of control to retrieve information from information to return Returns: (s/i) requested information The DialogControlGet function returns text and state information associated with a control. dialog-handle The dialog-handle passed as the first parameter to your dialog procedure. control-name Name of the control you wish to retrieve information from (for legacy dialog formats, i.e. earlier than 6.2, use the control's number in this parameter.) request code A request code. The request code depends on the type of the control you are querying. The following table shows the possible request codes, the control they apply to, and the returned information. Request 1 2 Applicable Controls CHECKBOX RADIOBUTTON 3 EDITBOX MULTILINEBOX PICTURE RADIOBUTTON CHECKBOX PICTUREBUTTON VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON MENUITEM ITEMBOX FILELISTBOX DROPLISTBOX 4 5 Function Return Values (i) 1 box checked, 0 box unchecked (i) 1 button is dotted, 0 button is not dotted (s) all text currently in the control. (s) control’s title. (s) tab delimited list of all the items currently in the control, or a File wildcard mask if a FILELISTBOX is specified (i.e., "c:\temp\*.*"). 235 DialogControlGet 6 7 ITEMBOX FILELISTBOX DROPLISTBOX CALENDAR 8 9 SPINNER 10 ITEMBOX FILELISTBOX MULTILINEBOX RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX COMCONTROL PICTURE PICTUREBUTTON 11 12 13 236 RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX (s) tab delimited list of the currently selected item(s) in the control. An empty string, if no item is selected. (s) the date shown in the control in YYYY:MM:DD:HH:MM:SS format (s) current value displayed in control No operation. Valid for DialogControlSet only (i) one-based index of the first currently visible item in the list. (1 is the first item in the list.) (s) control's background color specified by three vertical bar (|) delimited numbers ranging from 0 to 255. If the control is using the system default color, the string "DEFAULT" is returned. (s) The file specification of the controls currently displayed bitmap. If the control is not displaying a bitmap, the "DEFAULT" key string is returned. (s) control's text color specified by three vertical bar (|) delimited numbers ranging from 0 to 255. If the control is using the dialog's default text color, the string "DEFAULT" is returned. DialogControlGet 14 ITEMBOX FILELISTBOX DROPLISTBOX 15 ITEMBOX FILELISTBOX DROPLISTBOX 16 RADIOBUTTON 17 ALL CONTROLS (Except MENUBAR and MENUITEM) (s) Text added as an item to the list displayed by the control. If the items in the control are sorted, the new item will be inserted in sort order. (s) Text of item to be removed from the list displayed by the control. The text need not match the list item's case but must otherwise be an exact match. (i) Control-name (control-number for legacy dialogs) of the radio button from a group of radio buttons with the dot. If no radio button of the group has the dot, an empty string ("") or zero (0) for legacy dialogs is returned. The function’s second parameter can be the control-name of any radio button in the target group. (Radio buttons are grouped together by giving each button the same variable attribute.) (s) space delimited list of a control's position and size in dialog units relative to the dialog's client area. The first two numbers are the horizontal and vertical location of the upper-left corner of the control while the third and fourth numbers are the width and height of the control. Example: #DEFINESUBROUTINE GetExample(Handle,DialogMessage,DialogControlID,param4,param5) switch (DialogMessage) case 0 DialogProcOptions(Handle, 7, 1); Pass item listbox selection changes. break; case 7 sSelection = DialogControlGet(Handle,"Itembox_Colors",6); Get selection DialogControlSet(Handle,"Static_Color",4,sSelection); Set text break; endswitch return -1 #ENDSUBROUTINE ItemList = "Red%@Tab%Green%@Tab%Blue%@Tab%Yellow%@Tab%Cyan%@Tab%Magenta" GetExampleFormat=`WWWDLGED,6.2` GetExampleCaption=`Control Get Example` 237 DialogControlSet GetExampleX=529 GetExampleY=060 GetExampleWidth=206 GetExampleHeight=122 GetExampleNumControls=004 GetExampleProcedure=`GetExample` GetExampleFont=`DEFAULT` GetExampleTextColor=`DEFAULT` GetExampleBackground=`DEFAULT,DEFAULT` GetExampleConfig=0 GetExample001=`023,099,160,014,PUSHBUTTON,"PushButton_1",DEFAULT,"Ok Already",1,1,DEFAULT,DEFAULT,DEFAULT,DEFAULT` GetExample002=`111,031,054,012,STATICTEXT,"Label_1"DEFAULT,"Your Selection:",DEFAULT,2,0,"Modern|8192|40|65330","0|0|0",DEFAULT` GetExample003=`111,045,078,010,STATICTEXT,"Static_Color",DEFAULT,"",D EFAULT,3,0,"Modern|6656|40|65330","0|0|0",DEFAULT` GetExample004=`005,011,068,072,ITEMBOX,"Itembox_Colors",ItemList,DEFA ULT,DEFAULT,4,0,DEFAULT,DEFAULT,DEFAULT` ButtonPushed=Dialog("GetExample",1) See Also: DialogProcOptions, DialogControlState, DialogControlSet DialogControlSet Changes the text or appearance of a control. Syntax: DialogControlSet(dialog-handle, control-name, set-request-code, set-info) Parameters: (i) dialog-handle (s) control-name (i) set-request-code (s/i) set-info handle to dialog name of control to modify control property to set information to set Returns: (i) @TRUE if successful otherwise @FALSE. Use the DialogControlSet function to change the text or appearance of a control. dialog-handle The dialog-handle passed as the first parameter to your dialog procedure. control-name Name of the control you wish to modify (for legacy dialog formats, i.e. earlier than 6.2, use the control's number in this parameter.) 238 DialogControlSet set-request-code A request code. The request code depends on the type of the control you are changing. set-info Place new text or state information in the fourth parameter. The type of information you place in the fourth parameter is dependent on the request code you use in the third parameter. The following table shows the possible request codes, the control they apply to, and the type information that you need to supply in parameter four. Request 1 Applicable Controls CHECKBOX 2 RADIOBUTTON 3 EDITBOX MULTILINEBOX PICTURE RADIOBUTTON CHECKBOX PICTUREBUTTON VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON MENUITEM ITEMBOX DROPLISTBOX FILELISTBOX 4 5 6 ITEMBOX DROPLISTBOX FILELISTBOX Set-info (i) 1 means check the box, 0 means uncheck the box. (i) 1 means select button, 0 means clear the selection. (s) text replaces the existing text. (s) text replaces the existing title. (s) ITEMBOX and DROPLISTBOX: tab delimited list of items to replace the existing list displayed by the control. FILELISTBOX: a file mask to change or modify the default of “*.*” (s) tab delimited list of one or more items you wish to be highlighted as selected. Use an empty string to cancel an existing selection. (Multiple item selection only applies to ITEMBOXs when multi-select is turned on. See IntControl (4, p1, 0, 0, 0) function documentation for information on multiselect.) 239 DialogControlSet 7 CALENDAR 8 9 SPINNER MULTILINEBOX 10 ITEMBOX FILELISTBOX MULTILINEBOX 11 RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX COMCONTROL PICTURE PICTUREBUTTON 12 240 (s) date shown in the control in YYYY:MM:DD:HH:MM:SS format. (i) displayed value of control. (s) tab delimited list of one or more numbers that indicate tab stop distances. If the list contains 1 item, tab stops are set at every n dialog template units, where n is the distance indicated by the single item. If the list contains more than 1 item, tab stops are set at each indicated distance. The list item values must be in dialog template units, which are the same units used to specify the size of the control. (i) one-based index of the list item to be scrolled to the top of the control's viewing area. If n is greater than the number of items in the list or less than 1, the list will be scrolled so that the last items in the list are in the control's viewing area. (i) background color. The color is specified by three vertical bar (|) delimited numbers ranging from 0 to 255. To give the control the system default background color, use an empty string ""or the "DEFAULT "key string for this parameter. (s) The file specification of a bitmap. You can use this request to change the bitmap the control is displaying, or you can force the control to display it's text instead of a bitmap, by setting the parameter to an empty string "" or the "DEFAULT" key string. DialogControlSet 13 17 RADIOBUTTON CHECKBOX VARYTEXT STATICTEXT GROUPBOX PUSHBUTTON ITEMBOX FILELISTBOX DROPLISTBOX SPINNER EDITBOX MULTILINEBOX ALL CONTROLS (Except MENUBAR and MENUITEM) (s) text color. The color is specified by three vertical bar (|) delimited numbers ranging from 0 to 255. To give the control the dialog's default text color, use an empty string ""or the "DEFAULT "key string for this parameter. (s) space delimited list of a control's position and size in dialog units relative to the dialog's client area. The first two numbers are the horizontal and vertical location of the upper-left corner of the control while the third and fourth numbers are the width and height of the control. Example: #DefineSubRoutine SetExample(Handle,Msg,Id,EventInfo,param5) Switch (Msg) Case 0 DialogProcOptions(Handle, 10, 1) ; Spinner selection changed. ; Get spinner value nSelection = DialogControlGet(Handle,"Spinner_1",8) ; Set text DialogControlSet(Handle,"StaticText_2",4,Num2Char(nSelection)) break; Case 10 ; Get spinner value nSelection = DialogControlGet(Handle,"Spinner_1",8) ; Set text DialogControlSet(Handle,"StaticText_2",4,Num2Char(nSelection)) break; EndSwitch Return -1 #EndSubRoutine SpinnerRange = "0|255|1" SetExampleFormat=`WWWDLGED,6.2` SetExampleCaption=`Convert Number to ASCII Character` SetExampleX=155 SetExampleY=060 SetExampleWidth=187 SetExampleHeight=120 241 DialogControlState SetExampleNumControls=005 SetExampleProcedure=`SetExample` SetExampleFont=`DEFAULT` SetExampleTextColor=`DEFAULT` SetExampleBackground=`DEFAULT,DEFAULT` SetExampleConfig=0 SetExample001=`022,086,137,014,PUSHBUTTON,"PushButton_OK",DEFAULT,"OK ",1,1,DEFAULT,DEFAULT,DEFAULT,DEFAULT` SetExample002=`017,025,030,017,SPINNER,"Spinner_1",SpinnerRange,"48", DEFAULT,2,0,"Microsoft Sans Serif|10752|40|34","0|0|0",DEFAULT` SetExample003=`017,015,049,008,STATICTEXT,"StaticText_1",DEFAULT,"Sel ect a &Number:",DEFAULT,3,0,DEFAULT,DEFAULT,DEFAULT` SetExample004=`100,028,032,025,STATICTEXT,"StaticText_2",DEFAULT,DEFA ULT,DEFAULT,4,0,"Microsoft Sans Serif|18944|40|34","0|0|0",DEFAULT` SetExample005=`100,015,043,009,STATICTEXT,"StaticText_3",DEFAULT,"ASC II Letter:",DEFAULT,5,0,DEFAULT,DEFAULT,DEFAULT` ButtonPushed=Dialog("SetExample") See Also: DialogProcOptions, DialogControlState, DialogControlGet DialogControlState Changes a control’s style or give control input focus. Syntax: DialogControlState(dialog-handle, control-name, request-code, style) Parameters: (i) dialog-handle (s) control-name (i) request-code (i) style Returns: (i/s) handle to dialog name of control to change 1 = give control focus 2 = query control’s style 3 = add control styles 4 = remove control styles 5 = get control that has focus 6 = position mouse cursor over control style to change @TRUE success, @FALSE failure, or a controls style. Use this function to get a control's style, change a control’s style, assign a control the input focus, or retrieve the number of the control with the focus. dialog-handle 242 DialogControlState The dialog-handle passed as the first parameter to your dialog procedure. control-name The name of the control you wish to modify. Unless you are using request code five (5). In which case this parameter is ignored (for legacy dialog formats, i.e. earlier than 6.2, use the control's number in this parameter.) request-code Set the request-code to one (1), if you want to give a control the input focus. Set it to two (2) to have the function return a control's style. Use three (3) to add one or more styles to a control and four (4) to remove styles. Use five (5), if you want the name (or number for legacy dialogs) of the control with the input focus. To position the mouse cursor in the center of the control indicated by control-name set it to six (6). Note: When you are using request code five (5) the function will return an empty string ("") (or zero (0) for legacy dialogs), if no control in your dialog has the input focus at the time of the function call. In most cases, it is not necessary to use this request code to determine which control has the input focus from within your UserDefined-Callback procedure. This is because most callbacks occur only when a control has the input focus and because the number of the control that caused the callback and, therefore, has the focus, is passed as a parameter to your procedure. The DialogProcOption event-codes 0, 1, 11, 1000, 1001, 1002 and 1003 are the exceptions because these events are not associated with any dialog controls. Request-code 1 2 3 4 5 6 Meaning Give a control the input focus Query a control's style Add one or more styles to a control Remove styles from a control Get control that has focus Position mouse cursor over control style This parameter is ignored when you are giving a control the input focus (1), fetching a controls style (2), getting the name of the control with the input focus (5), or positioning the mouse cursor (6). Otherwise, it should contain the styles you wish to add or remove. The style values are the same as those used in the control style attribute of the dialog template. More than one style can be added or removed in a single function call by using the bit wise OR (|) operator to construct a bitmask of targeted styles. Note: The exceptions are the 'List Only style' (4) of a DROPLISTBOX and the 'No Auto-resize' (256) of ITEMBOX and FILELISTBOX controls. These styles can only be set in the dialog template. 243 DialogControlState Style 244 Meaning Controls 1 Control is invisible All 2 Control has disabled appearance and does not accept any user input, if it would otherwise accept input. PUSHBUTTON RADIOBUTTON CHECKBOX PICTUREBUTTON EDITBOX MULTILINEBOX ITEMBOX FILELISTBOX CALENDAR DROPLISTBOX SPINNER GROUPBOX VARYTEXT STATICTEXT MENUITEM 4 Note: Not supported in this function. This style can only be set in the dialog template. Control will only accept values already in the drop down list portion of the control DROPLISTBOX 8 The controls text cannot be changed by typing in new text when the control has the input focus. (Note: The user can still change the value in a SPINNER control by using the up and down arrow.) EDITBOX MULTILINEBOX SPINNER 16 Displays all characters as an asterisk (*) as they are typed into the control. EDITBOX 32 A button with this style is the default button when no push or picture button has the input focus. The user can select this button by pressing the enter key if no button has the input focus. You should only give one button this style. If give the style to more than one button, only the first button (in the tab order) will have the style. Generally, give this style to the button that is the most likely option in your dialog. PUSHBUTTON PICTUREBUTTON 64 Allows only digits to be entered into the edit type controls. Note: even with this set, it is still possible to paste non-digits into the edit control. EDITBOX MULTILINEBOX 128 Creates a button with a flat appearance. All aspects of the button's border are removed including the 3d shadowing. PUSHBUTTON PICTUREBUTTON 256 Note: Not supported in this function. This style can only be set in the dialog template. ITEMBOX FILELISTBOX DialogControlState 512 Centers text horizontally in the control’s rectangle. (Cannot be used with style 1024) VARYTEXT STATICTEXT 1024 Displays text flush-right in the control’s rectangle. (Cannot be used with style 512) VARYTEXT STATICTEXT 2048 Prevents text selection when control gets the input focus. Cursor is placed to the left of any existing text in the control. EDITBOX MULTILINEBOX 4096 Prevents text selection when control gets the input focus. Cursor is placed to the right of any existing text in the control EDITBOX MULTILINEBOX 8192 Display Security Shield icon on button (Vista only) PUSHBUTTON PICTUREBUTTON 32768 Adds a check mark to the left of a menu item MENUITEM 65536 Adds a radio button like dot graphic to the left of a menu item MENUITEM Example: #DEFINESUBROUTINE Flash(Handle,DialogMessage,DialogControlID,param4,param5) switch (DialogMessage) case 0 ; Initialization DialogProcOptions(Handle, 1, 250) ; Set a 1 quarter second timer. break; case 1 ; Timer nStyle = DialogControlState(Handle,"staticText_1",2,0) if nStyle & 1 DialogControlState(Handle,"StaticText_1",4,1) ; Clear the invisible bit else DialogControlState(Handle,"StaticText_1",3,1) ; Set the invisible bit endif break endswitch return -1 #ENDSUBROUTINE FlasherFormat=`WWWDLGED,6.2` FlasherCaption=`Flasher` FlasherX=329 FlasherY=060 FlasherWidth=178 FlasherHeight=078 FlasherNumControls=002 FlasherProcedure=`Flash` FlasherFont=`DEFAULT` FlasherTextColor=`DEFAULT` FlasherBackground=`DEFAULT,DEFAULT` 245 DialogObject FlasherConfig=0 Flasher001=`069,053,034,014,PUSHBUTTON,"PushButton_Stop",DEFAULT,"Sto p!",1,1,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Flasher002=`064,013,044,030,STATICTEXT,"StaticText_1",DEFAULT,DEFAULT ,DEFAULT,2,0,DEFAULT,DEFAULT,"255|0|0"` ButtonPushed=Dialog("Flasher",1) See Also: DialogProcOptions, DialogControlGet, DialogControlSet, User Defined Subroutine DialogObject Interacts with COM controls in a dialog callback procedure. Syntax: DialogObject ( dialog-handle, control-name, request-code, event-name/image-file, event-id) Parameters (i) dialog-handle (s) control-name (i) request-code (s) event-name (i) event-id Returns: (r) handle to dialog. name of a COM control or 0 (depends on request-code.) number of task to perform [optional] name of control event, image file or do not specify (depends on request-code) [optional] number to associate with an event or do not specify (depends on request-code) @TRUE or object reference on success (depends on request-code), @FALSE on failure. DialogObject is a multi-purpose function that you can call from within your dialog callback procedure to interact with COM controls embedded in your dialog. The function’s main purpose is to allow you to instruct a COM control to call your dialog callback procedure when a supported event occurs within the control. But you can also use the function to obtain a COM object reference to a control and you can even use it to create Picture objects that some COM controls display as part of their user interface. dialog-handle The first parameter must be the dialog-handle passed as the first parameter to your dialog procedure. control-name Name of the COM control from which you wish to receive events or obtain an object reference. This parameter should be set to zero (0) when request- 246 DialogObject code 4 is used in the third parameter. (for legacy dialog formats, i.e. earlier than 6.2, use the control's number in this parameter.) request-code The third parameter determines the action taken by the function. Currently, there are four possible values Request-code 1 2 3 4 Meaning Call dialog callback when the specified event occurs Stop calling dialog callback when an event previously requested with request-code 1 occurs Return an object references to the specified control Create and return an object reference to a picture object event-name Almost all COM controls provide events. Events are usually fired in response to a user action, like a mouse button click on the control, but they can also be fired as the result of some action taken by your script. When an event is fired by the control, you can instruct the control to make a call to your dialog callback procedure so that you can do additional processing. In order to have your dialog procedure called by the control you need to call DialogObject with a request code of one (1) and specify the name of the event in the fourth parameter. To stop a control calling your dialog procedure for an event, specify the event name in this parameter and set the request-code to two (2). This parameter is also used with request-code 3 to obtain a reference to a picture object. When you use request code 3 the parameter must contain the file name and path to a file that contains a BMP (bitmap), JPEG, WMF (metafile), ICO (icon) or GIF format image. Some COM controls accept picture objects for use as part of the control’s on screen appearance. Here is a summary of the event-name parameter’s usage Request-code 1, 2 Event-name Name of an event supported by the control indicated in the second parameter 3 File name and path of BMP (bitmap), JPEG, WMF (metafile), ICO (icon) or GIF format image file 4 Do not specify this parameter. event-id You can associate a number with a particular control event with this parameter. The number can later be used inside the dialog callback procedure to uniquely identify which control event is currently calling your procedure. This is because it becomes the Identifier property of the EventInfo object passed to your procedure each time an event is fired. The number should be unique for each event 247 DialogObject in the control and can be made unique for all control events monitored by your procedure. Only specify this parameter for request code 1. Example: This example uses the DialogObject function to cause a dialog to receive mouse button click events from a Microsoft calendar COM control. DialogObject is also used to obtain a reference to the calendar control. The reference is then used to obtain and set properties of the control before and during control event processing. To use this example, the Microsoft calendar control and the Microsoft concatenated speech synthesis (or text-to-speech) engine must be installed and registered on the computer running this script. The computer must also have appropriate sound hardware and drivers. #DefineSubRoutine DlgObjExamProc(Dlg_Handle, Dlg_Message, Dlg_ID, Dlg_EventInfo, Reserved) ; Dialog messages. MSG_INIT = 0 ; The one-time initialization. MSG_BUTTONPUSHED = 2 ; Button press. MSG_COMEVENT = 14 ; COM control event fired. ; Options for DialogObject function. DLGOBJECT_ADDEVENT = 1 ;DialogObject add event. DLGOBJECT_GETOBJECT = 3 ;DialogObject get reference to object. MSCAL_CLICK = 1 ; User specified identifier for "click" event. Switch Dlg_Message Case MSG_INIT DialogProcOptions( Dlg_handle, MSG_BUTTONPUSHED, 1 ) ; Handle mouse click events. DialogObject(Dlg_Handle, "ComControl_1", DLGOBJECT_ADDEVENT, "Click", MSCAL_CLICK ) ; Get an object reference to the calendar control. objCal = DialogObject(Dlg_Handle, "ComControl_1", DLGOBJECT_GETOBJECT) ; Create a voice object objVoice = ObjectCreate("Sapi.SpVoice.1") objVoice.volume = 100 ; Loud! Break Case MSG_COMEVENT ; Correct COM control and event? If (Dlg_ID == "ComControl_1") && (Dlg_EventInfo.identifier == MSCAL_CLICK) ; Speak the date. sSpeach = StrCat('<context ID ="date_mdy">',objCal.month) sSpeach = StrCat(sSpeach,'/',objCal.day,'/',objCal.year,'</context>') sSpeach = StrCat('<voice required="Gender=Male;Name=Microsoft Sam">',sSpeach) 248 DialogProcOptions objVoice.Speak(sSpeach, 9) ; 9 = SPF_ASYNC|SPF_IS_XML EndIf Break Case MSG_BUTTONPUSHED ; Release Objects. Dlg_EventInfo = 0 objVoice = 0 objCal = 0 Break EndSwitch Return(-1) ; Do default processing. #EndSubRoutine ; End of Dialog Callback. DlgObjExFormat=`WWWDLGED,6.2` DlgObjExCaption=`Dialog Object Example` DlgObjExX=035 DlgObjExY=105 DlgObjExWidth=200 DlgObjExHeight=181 DlgObjExNumControls=002 DlgObjExProcedure=`DlgObjExamProc` DlgObjExFont=`DEFAULT` DlgObjExTextColor=`DEFAULT` DlgObjExBackground=`DEFAULT,DEFAULT` DlgObjExConfig=0 DlgObjEx001=`031,161,133,011,PUSHBUTTON,"PushButton_1",DEFAULT,"Enoug h Already",1,1,32,DEFAULT,DEFAULT,DEFAULT` DlgObjEx002=`015,015,169,126,COMCONTROL,"ComControl_1",DEFAULT,"MSCAL .Calendar",DEFAULT,3,DEFAULT,DEFAULT,DEFAULT,DEFAULT` ButtonPushed=Dialog("DlgObjEx") See Also: Dialog DialogProcOptions Controls when the User-Defined-Callback procedure is called by its associated dialog. Syntax: DialogProcOptions(dialog-handle, event-option-code, event-option-value) Parameters: (i) dialog-handle handle to dialog (i/s) event-option-code event code for event, or dialog option code that produces call to the User-Defined-Callback procedure. (i) event-option-value depends on event-option-code. 249 DialogProcOptions Returns: (i) previous setting for event-code. Use the DialogProcOptions function to control when your Use-Defined-Callback procedure is called by its associated dialog. You can also use it to control your dialog's behavior, while your procedure is executing. You usually establish callback events during the first call to the procedure i.e., event 0, but this can be done during any call. dialog-handle The dialog-handle is the first parameter to your dialog procedure. event-option-code The second parameter can be one of the events or options listed in the table below. This table provides the list of events and options codes that can be used as the second parameter to the DialogProcOptions. The event codes correspond to the number passed as the second parameter to your User-Defined-Callback procedure. Event-Option-Code Values and Meanings Codes 250 Meaning Event-option-value 0 Initialization: dialog has been created but not displayed. This event is only generated once per dialog session. n/a 1 Timer: Set a Timer event (i) > 0 - milliseconds between callbacks 0 - turn off timer 1 - return current setting 2 Pushbutton or Picturebutton Pushed: User has pressed a PUSHBUTTON or PICTUREBUTTON control. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 3 Radiobutton Selected: User has selected a RADIOBUTTON. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 4 Checkbox Checked/Unchecked: User has checked or unchecked a CHECKBOX control. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 5 Changed text in Editbox or Multilinebox: User has changed the text in an EDITBOX or MULTILINEBOX control (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 6 Filelistbox File Selected: User has selected a file in a FILELISTBOX control (i) 1- turn on event callback 0 - turn off callback -1 - return current setting DialogProcOptions 7 Itembox Item Selected: User has selected one or more items in a ITEMBOX control. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 8 Droplistbox/Combobox Item Change: User has changed the text appearing at the top of a DROPLISTBOX. This event can be triggered by the user picking a new item from the list portion of the control or by the user typing new text into the control. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 9 Calendar Date Change: User has selected a new date in a CALENDAR control. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 10 Spinner Number Change: User has changed the value of a SPINNER control. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 11 Close: User has selected the Close command from the system menu. This event only applies to dialog's with system menus enabled by a call to IntControl 49 or DialogProcOption code 1002. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 12 Filelistbox File Double-Clicked: the user has used the mouse to double-click an item in an FILELISTBOX. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 13 Itembox Item Double-Clicked: the user has used the mouse to double-click an item in an ITEMBOX. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting 14 COM-Event: COM control event fired. 15 Menu Item Selection: the user has clicked a menu item using the mouse, has pressed a menu item's access key while its menu is displayed or the user has pressed a menu item's hot-key combination. Note: The user-defined callback is not called in response to the selection of menu items via mouse or access key when the menu item has an associated dropdown or submenu. The associated dropdown or submenu is displayed instead. (i) 1- turn on event callback 0 - turn off callback -1 - return current setting (i) 1- turn on event callback 0 - turn off callback -1 - return current setting Other non-events supported by DialogProcOptions: 1000 Dialog Disable: Grey the dialog's title bar and redraw dialog as necessary. Optionally, display the system's "wait cursor". Note: If you have code that may take a long time to execute in a callback, you may need to temporarily disable the dialog. Don't forget to (i) 1 - disable dialog 2 - disable and wait cursor 0 - enable dialog -1 - return current setting 251 DialogProcOptions enable after the process is complete. 1001 Change Background: Change the dialog's background bitmap or color. (s) bitmap file name or RBG color string (i) -1 - return current background 1002 Change System Menu: Change the dialog’s title bar system menu. Note: this dialog option overrides the system menu settings established with IntControl 49. (i) 0 - no menus 1 - close 2 - close and minimize 3 - close and maximize 4 - close, minimize and maximize -1 - return current setting 1003 Change Dialog Title: Change the dialog’s title. Note: the maximum dialog title length is 254 characters. (i) -1 – return current title (s) new dialog title 1004 Get Control Name: Returns the name of the control associated with the control number. (i) control number (s) control name 1005 Get Control Number: Returns the control number associated with the control name. (s) control name (i) control number Note: Although you can set the second parameter to zero (0), it will have no effect, because event 0 only happens once. For events codes, turn on the event by setting the third parameter to one (1). Turning on the indicated event causes a call to your dialog procedure each time the event occurs. When your dialog procedure is called because of the event, the event code will appear in the second parameter of the procedure. Turn off an event by setting the third parameter to zero (0). You can programmatically determine the current setting for an event code or option by setting the second parameter to the event or option of interest and setting the third parameter to minus one (-1). The function returns the current setting without changing it. Notes - Option 1000:You can change your dialog's behavior during a callback by using this function with the second parameter set to dialog option 1000 and specifying one (1) or two (2) as the third parameter. This gives the dialog's title bar the appearance of an inactive window. It also allows your dialog to redraw itself if it becomes covered and then uncovered by another window while the callback procedure performs a lengthy task. When you place a two (2) in the third parameter, you get the above-mentioned changes and in addition, the mouse cursor will become the system defined "wait cursor" when the user moves it over the dialog. Dialog option 1000 is best used before your dialog callback performs lengthy processing or when it calls any WIL function that suspends the execution of your dialog procedure. 252 DialogProcOptions RunWait and TimeDelay are two examples of functions that suspend script execute. Dialog option 1000 takes effect immediately after the DialogProcOptions statement but it is cancelled automatically when the current call to your dialog procedure returns. You can manually cancel option 1000 by making a DialogProcOptions call with the second parameter set to 1000 and the third parameter set to zero (0). Notes - Option 1001:Use dialog option 1001 to dynamically change your dialog's background to the bitmap or color placed in the functions third parameter. You can use a three-field color specification, a bitmap file name or the DEFAULT key word to set the background to a specific color, a picture or the system default color for dialogs. You can discover the current dialog background by setting the third parameter to minus one (-1). event-option-value The third parameter depends on which event-option-code was specified. See the table of event-option-codes for valid event-option-values. Example: ;Here is an example of using a one second timer event. #DefineFunction TimerCallbackProc(Timer_Handle,Timer_Message,Timer_Name,Timer_EventInfo ,rsvd) MSG_INIT = 0 TimerTick = 1 switch Timer_Message; Switch based on Dialog Message type case MSG_INIT ; Standard Initialization message ;enable 1 second timer events DialogProcOptions(Timer_Handle,TimerTick,1000) return(-1) case TimerTick Clock=DialogControlGet(Timer_Handle,"VaryText_1",4) Clock=Clock-1 if Clock==0 then return(2) ; exit DialogControlSet(Timer_Handle,"VaryText_1",4,Clock) return(-1) endswitch; Timer_Message return(-1) #EndFunction ; End of Dialog Callback TimerCallbackProc TimerFormat=`WWWDLGED,6.2` TimerCaption=`Timer Example` TimerX=078 TimerY=129 TimerWidth=120 TimerHeight=117 253 DirAttrGet TimerNumControls=003 TimerProcedure=`TimerCallbackProc` TimerFont=`DEFAULT` TimerTextColor=`DEFAULT` TimerBackground=`DEFAULT,DEFAULT` TimerConfig=0 Timer001=`013,083,034,014,PUSHBUTTON,"PushButton_OK",DEFAULT,"OK",1,DEF AULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Timer002=`067,083,034,014,PUSHBUTTON,"PushButton_Cancel",DEFAULT,"Cance l",0,DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Timer003=`023,015,070,052,VARYTEXT,"VaryText_1",clock,"10",DEFAULT,DEFA ULT,DEFAULT,"Tahoma|49152|70|34","128|0|0",DEFAULT` ButtonPushed=Dialog("Timer") See Also: DialogControlState, DialogControlGet, DialogControlSet DirAttrGet Gets directory attributes. Syntax: DirAttrGet( [d:]path ) Parameters: (s) [d:]path directory pathname whose attributes you want to determine. Returns: (s) the attributes of the specified directory pathname. Returns attributes for the specified directory, in a string of the form "RASH". This string is composed of four individual attribute characters, as follows: Symbol R A S H Meaning Read-only ON Archive ON System ON Hidden ON A hyphen in any of these positions indicates that the specified attribute is OFF. For example, the string "-A-H" indicates a directory which has the Archive and Hidden attributes set. Example: dir = "c:\temp" attr = DirAttrGet(dir) Message("Attributes of Directory, %dir%", attr) 254 DirAttrGetEx See Also: DirAttrGetEx, DirInfoToArray, DirAttrSet, FileAttrGet, FileAttrSet, FileTimeGet, FileTimeGetEx DirAttrGetEx Gets directory attributes (extended). Syntax: DirAttrGetEx( directory path ) Parameters: (s) directory path Returns: (i) directory pathname whose attributes you want to determine. extended attribute settings. The return value is a bitmask comprised of one or more of the following integer values, combined using the bitwise OR ('|') operator: Value Name Meaning 1 READONLY The file or directory is read-only. Applications can read the file but cannot write to it or delete it. In the case of a directory, applications cannot delete it. 2 HIDDEN The file or directory is hidden. It is not included in an ordinary directory listing. 4 SYSTEM The file or directory is part of, or is used exclusively by, the operating system. DIRECTORY Identifies a directory. 32 ARCHIVE The file or directory is an archive file or directory. Applications use this attribute to mark files for backup or removal. 128 NORMAL The file or directory has no other attributes set. This attribute is valid only if used alone. 16 * 255 DirAttrGetEx 256 TEMPORARY The file is being used for temporary storage. File systems avoid writing data back to mass storage if sufficient cache memory is available, because often the application deletes the temporary file shortly after the handle is closed. In that case, the system can entirely avoid writing the data. Otherwise, the data will be written after the handle is closed. 512* SPARSE_FILE The file is a sparse file. 1024* REPARSE_POINT The file or directory has an associated reparse point. 2048* COMPRESSED The file or directory is compressed. For a file, this means that all of the data in the file is compressed. For a directory, this means that compression is the default for newly created files and subdirectories. 4096 OFFLINE The data of the file is not immediately available. This attribute indicates that the file data has been physically moved to offline storage. This attribute is used by Remote Storage, the hierarchical storage management software. Applications should not arbitrarily change this attribute. 8192 NOT_CONTENT_INDEXE D The file will not be indexed by the content indexing service. The file or directory is encrypted. For a file, this means that all data streams in the file are encrypted. For a directory, this means that encryption is the default for newly created files and subdirectories. * The values with an asterisk next to them cannot be set using DirAttrSetEx. 16384 * ENCRYPTED Example: READONLY HIDDEN SYSTEM DIRECTORY ARCHIVE NORMAL TEMPORARY 256 = = = = = = = 1 2 4 16 32 128 256 DirAttrSet COMPRESSED OFFLINE NOT_CONTENT_INDEXED ENCRYPTED = = = = 2048 4096 8192 16384 tmpdir = "c:\Temp\DirAttrGetEx" ; Create a HIDDEN directory DirAttrSetEx(tmpdir, HIDDEN, 1) attr = DirAttrGetEx(tmpdir) if attr & READONLY Message(tmpdir, "READONLY") endif if attr & HIDDEN Message(tmpdir, "HIDDEN") endif if attr & SYSTEM Message(tmpdir, "SYSTEM") endif if attr & DIRECTORY Message(tmpdir, "DIRECTORY") endif if attr & ARCHIVE Message(tmpdir, "ARCHIVE") endif if attr & NORMAL Message(tmpdir, "NORMAL") endif if attr & TEMPORARY Message(tmpdir, "TEMPORARY") endif if attr & COMPRESSED Message(tmpdir, "COMPRESSED") endif if attr & OFFLINE Message(tmpdir, "OFFLINE") Endif if attr & NOT_CONTENT_INDEXED Message(tmpdir, "NOT_CONTENT_INDEXED") Endif if attr & ENCRYPTED Message(tmpdir, "ENCRYPTED") Endif exit See Also: DirAttrSetEx, DirInfoToArray. DirAttrSet, FileAttrGet, FileAttrSet, FileTimeGet DirAttrSet Sets directory attributes. 257 DirAttrSetEx Syntax: DirAttrSet(dir-list, settings) Parameters: (s) dir-list a tab or vertical bar delimited list of one or more subdirectory names. new attribute settings for the directories. (s) settings Returns: (s) always 0. Note: DirAttrSet does not accept wildcards. The attribute string consists of one or more of the following characters (an upper case letter turns the specified attribute ON, a lower case letter turns it OFF): Symbol Meaning Symbol Meaning R A S H read only ON archive ON system ON hidden ON r a s h read only OFF archive OFF system OFF hidden OFF Example: DirAttrSet("c:\windows\temp", "rASh") Message("DirAttrSet","Directory attributes set.") See Also: DirAttrSetEx, DirAttrGet, FileAttrGet, FileAttrSet, FileTimeTouch DirAttrSetEx Sets directory attributes (extended). Syntax: DirAttrSetEx (dir-list, attributes, mode) Parameters: (s) dir-list a tab or vertical bar delimited list of one or more subdirectory names. (i) attributes new attribute settings for the directories. (i) mode specifies the method by which "attributes" are applied to the specified directory(s), and can be one of the following: 0 "attributes" replaces the existing file attributes 1 "attributes" are added to the existing file attributes -1 "attributes" are removed from the existing file attributes 258 DirAttrSetEx Returns: (i) @TRUE on success, or @FALSE if unable to change the attributes on any of the specified directory(s). Note: DirAttrSetEx does not accept wildcards. Value 1 Name READONLY 2 HIDDEN 4 SYSTEM 16* 32 DIRECTORY ARCHIVE 128 NORMAL 256 TEMPORARY 512* 1024* SPARSE_FILE REPARSE_POINT Meaning The file or directory is read-only. Applications can read the file but cannot write to it or delete it. In the case of a directory, applications cannot delete it. The file or directory is hidden. It is not included in an ordinary directory listing. The file or directory is part of, or is used exclusively by, the operating system. Identifies a directory. The file or directory is an archive file or directory. Applications use this attribute to mark files for backup or removal. The file or directory has no other attributes set. This attribute is valid only if used alone. The file is being used for temporary storage. File systems avoid writing data back to mass storage if sufficient cache memory is available, because often the application deletes the temporary file shortly after the handle is closed. In that case, the system can entirely avoid writing the data. Otherwise, the data will be written after the handle is closed. The file is a sparse file. The file or directory has an associated reparse point. 259 DirAttrSetEx The file or directory is compressed. For a file, this means that all of the data in the file is compressed. For a directory, this means that compression is the default for newly created files and subdirectories. OFFLINE The data of the file is not 4096 immediately available. This attribute indicates that the file data has been physically moved to offline storage. This attribute is used by Remote Storage, the hierarchical storage management software. Applications should not arbitrarily change this attribute. NOT_CONTENT_INDEXED The file will not be indexed by the 8192 content indexing service. The file or directory is encrypted. 16384* ENCRYPTED For a file, this means that all data streams in the file are encrypted. For a directory, this means that encryption is the default for newly created files and subdirectories. * The values with an asterisk next to them cannot be set using DirAttrSetEx. 2048* COMPRESSED Example: READONLY HIDDEN SYSTEM DIRECTORY ARCHIVE NORMAL TEMPORARY COMPRESSED OFFLINE NOT_CONTENT_INDEXED ENCRYPTED = = = = = = = = = = = 1 2 4 16 32 128 256 2048 4096 8192 16384 tmpdir = "c:\Temp\DirAttrSetEx" ; Create a HIDDEN directory DirAttrSetEx(tmpdir, HIDDEN, 1) attr = DirAttrGetEx(tmpdir) if attr & READONLY Message(tmpdir, "READONLY") endif if attr & HIDDEN Message(tmpdir, "HIDDEN") endif if attr & SYSTEM 260 DirChange Message(tmpdir, "SYSTEM") endif if attr & DIRECTORY Message(tmpdir, "DIRECTORY") endif if attr & ARCHIVE Message(tmpdir, "ARCHIVE") endif if attr & NORMAL Message(tmpdir, "NORMAL") endif if attr & TEMPORARY Message(tmpdir, "TEMPORARY") endif if attr & COMPRESSED Message(tmpdir, "COMPRESSED") endif if attr & OFFLINE Message(tmpdir, "OFFLINE") Endif if attr & NOT_CONTENT_INDEXED Message(tmpdir, "NOT_CONTENT_INDEXED") Endif if attr & ENCRYPTED Message(tmpdir, "ENCRYPTED") Endif exit See Also: DirAttrSet, DirAttrGetEx, FileAttrGetEx, FileAttrSetEx, FileTimeGet, FileTimeTouch DirChange Changes the current directory. Can also log a new drive. Syntax: DirChange ([d:]path) Parameters: (s) [d:] path Returns: (i) the desired directory name with optional drive. @TRUE if directory was changed; @FALSE if the path could not be found. Use this function to change the current working directory to another directory, either on the same or a different disk drive. 261 DirExist Example: DirChange("c:\") a = AskFileText("Your CONFIG.SYS", "config.sys", @unsorted, @single, @false) Message("Contents of selected line, if any", a) See Also: DirExist, DirGet, DirHome, LogDisk DirExist Tests for the existence of a directory. Syntax: DirExist(pathname) Parameters: (s) pathname Returns: (i) complete drive and path. @TRUE if the directory exists; @FALSE if it doesn't exist or if the pathname is invalid. You can use this function to determine whether a specified drive is valid by checking for the existence of the root directory on that drive. A @TRUE response indicates that it is a valid drive on the system. But it does not indicate that there is a usable disk in the drive (e.g. in a floppy drive). This function will accept a UNC path. Examples: ; This example checks to see if a directory c:\wp exists. ;doesn’t one is created. wpdir = "c:\wp" If !DirExist(wpdir) Then DirMake(wpdir) DirChange(wpdir) If it ; This section asks the user to input a drive, and then checks its ; existence. while @TRUE ; Loop forever, until break or exit drive = AskLine("Run Excel", "Enter a drive letter", "", 0) If drive == "" Then Exit drive = StrSub(drive, 1, 1) If DirExist("%drive%:\") then Break endwhile Message("Selected Drive", drive) See Also: DirChange, DirMake, DirRemove, DirRename, AppExist, FileExist, DiskExist 262 DirHome DirGet Gets the current working directory. Syntax: DirGet ( ) Parameters: (none) Returns: (s) current working directory. Use this function to determine which directory we are currently in. It's especially useful when changing drives or directories temporarily. Example: ; Get, then restore current working directory origdir = DirGet( ) DirChange("c:\") FileCopy("config.sys", "%origdir%xxxtemp.xyz", @FALSE) DirChange(origdir) Message("DirGet","Current working directory retrieved and restored.") See Also: CurrentFile, CurrentPath, DirHome, DirScript, DirWindows DirHome Returns directory containing the WIL Interpreter's executable files. Syntax: DirHome ( ) Parameters: (none) Returns: (s) pathname of the home directory. Use this function to determine the directory where the current WIL Interpreter's executable files are stored. Note: For compiled scripts DirHome() returns the path to the EXE file. Example: a = DirHome( ) Message("WIL Executable is in ", a) See Also: DirGet, DirScript, DirWindows 263 DirInfoToArray DirInfoToArray Returns information on a set of directories, as an array. Syntax: DirInfoToArray ( dir-list [, flags]) Parameters: (s) dir-list specifies a set of sub-directory names, which may be wildcarded. (i) flags [optional] can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value 1 Meaning return directory sizes as huge numbers. This is a long decimal number string, which may represent a number too large to be converted to an integer. return directory names with full paths 2 Returns: (a) 2-dimension array. This function creates and returns a 2-dimension array. There are [n + 1] rows in the array, where 'n' is the number of directories that were returned. Each row has 7 columns. The first row (row 0) is a header containing summary information. Each subsequent row contains information about one returned directory. The columns are as follows: Header row: Column 0 1 2-6 Value number of directories returned total directory size. Note: Set to 0 (unused, set to 0) Other rows: Column 0 1 2 264 Value directory name directory size. Note: all sizes for directories will be 0. directory last modified time, in YmdHms format DirItemize 3 4 5 6 directory last accessed time, in YmdHms format directory created time, in YmdHms format directory attribute string in the form "RASH" (see DirAttrGet) directory attribute bitmask (see DirAttrGetEx) Example: dirlist = StrCat(ShortCutDir("Personal",0,@true),"*.*") infoarray = DirInfoToArray(dirlist, 1|2) infostr = StrCat("Number of directories: ",infoarray[0,0],@Crlf, @Crlf) For xx = 1 to infoarray[0,0] infostr = StrCat(infostr,"Directory Name: ", infoarray[xx,0],@Crlf) ;Note that all sizes (column 1) for directories will be 0. infostr = StrCat(infostr,"Directory Size: ", infoarray[xx,1],@Crlf) infostr = StrCat(infostr,"Last Modified: ", infoarray[xx,2],@Crlf) infostr = StrCat(infostr,"Last Accessed: ", infoarray[xx,3],@Crlf) infostr = StrCat(infostr,"Created: ",infoarray[xx,4],@Crlf) infostr = StrCat(infostr,"Attribute: ",infoarray[xx,5],@Crlf) infostr = StrCat(infostr, "Attribute Bitmask: ", infoarray[xx,6], @Crlf) infostr = StrCat(infostr,@Crlf) Next tmpfile = FileCreateTemp("TMP") FilePut(tmpfile,infostr) AskFileText("Directory Data",tmpfile,@unsorted,@single,@false) FileDelete(tmpfile) exit See Also: DirItemize, DirAttrGet, DirAttrGetEx, DirTimeGet, DirSize DirItemize Returns a delimited list of directories. Syntax: DirItemize (dir-list) Parameters: (s) dir-list Returns: (s) a string containing a set of sub-directory names, which may be wildcarded. list of directories. This function compiles a list of sub-directories and separates the names with a TAB. For more information on delimiters see File Delimiters, (pg. 69). 265 DirRemove This is especially useful in conjunction with the AskItemList function, which enables the user to choose an item from such a space-delimited list. DirItemize("*.*") returns all sub-directories under the current directory. Note: Some shell or file manager applications using the WIL Interpreter allow an empty string ("") to be used as the "dir-list" parameter, in which case all subdirectories highlighted in the file display are returned. However, if there are any directory names or wildcards in the string, all sub-directories matching the pathnames are returned, regardless of which ones are highlighted. Example: DirChange(DirWindows(0)) a = DirItemize("*.*") AskItemList("Directories", a, @TAB, @unsorted, @single, @false) See Also: CurrentFile, DirInfoToArray, FileItemize, AskItemList, AskFileText, WinItemize DirMake Creates a new directory. Syntax: DirMake ([d:]path) Parameters: (s) [d:] path Returns: (i) the desired directory name with optional drive. @TRUE if the directory was successfully created, or already exists. Use this function to create a new directory. Example: DirMake("c:\xstuff") Message("DirMake","Directory Made") See Also: DirExist, DirRemove, DirRename DirRemove Removes an empty directory. Syntax: DirRemove (dir-list) 266 DirRename Parameters: (s) dir-list Returns: (i) a delimited list of directory pathnames. @TRUE if the directory was successfully removed; @FALSE if it wasn't. Use this function to delete empty directories. You can delete one or more at a time by separating directory names with delimiters. You cannot, however, use wildcards. Examples: DirRemove("c:\xstuff") Message("DirRemove","Directory removed") ;or ;DirRemove("tempdir1 tempdir2 tempdir3") See Also: DirExist, DirMake, DirRename DirRename Renames a directory. Syntax: DirRename ([d:]oldpath, [d:]newpath) Parameters: (s) oldpath (s) newpath Returns: (i) existing directory name, with optional drive. new name for directory. @TRUE if the directory was successfully renamed; @FALSE if it wasn't. Example: ;Do a dirmake so the example runs smoothly. DirMake("c:\wwwtemp") ;Once 'old' directory is created execute the example ;This is the real example. old="c:\wwwtemp" new="c:\wwwwork" DirRename("c:\wwwtemp", "c:\wwwwork") Message("DirRenname","%old% Directory renamed to %new%") See Also: DirExist, DirMake, DirRemove 267 DirSize DirScript Returns the full directory path (without the filename) of the current WinBatch program. Syntax: DirScript() Parameters: None Returns: (s) full path of the current WinBatch program. If the current WinBatch script is a child program that was called with the Call() function, this function will return the full directory path (without the filename) of the main (calling) program. Example: wbtdir = DirScript() ;or ;exedir = DirScript() Message("Script Directory",wbtdir) exit See Also: DirHome, DirGet, IntControl 1004 DirSize Finds the total size of a directory. Syntax: DirSize (dir-name, flags [, format]) Parameters: (s) dir-name specify a single directory name (no wildcards). (i) flags specifies the format of the returned value. (see below) (i) format [optional] controls the format in which the size is returned. Returns: (i/f) size in bytes. The return value will be a floating point number if it is larger than 2 gigabytes. This function returns the total size of a directory, including all files in the directory, and all files in all subdirectories under the directory. 268 DirWindows Flags 0 1 Meaning actual size of the files. Instead of returning the actual size of the files, return the amount of disk space they occupy. This is based upon the disk's cluster size. This flag is valid only if the specified directory is on a local drive or a network drive mapped to a drive letter; it does not support UNC's. Format is an optional parameter that controls the format in which the size is returned. If the result is too large to be returned as an integer (larger than 2 gigabytes). Format Meaning 0 (Default) Floating Point 1 Huge number. This is a long decimal number string, which may represent a number too large to be converted to an integer.'Huge number' is a special data type. It is a long decimal number string, which may represent a number too large to be converted to an integer. This value cannot be modfied with standard arithmetic operations, it requires the use of the Huge Math extender. Example: a=Dirsize("C:\Windows",0) Message("DirSize : Actual size",a) b=Dirsize("C:\Windows",1) Message("DirSize :The amount of disk space occupied",b) c=Dirsize("C:\Windows",1,0) Message("DirSize :Actual size: in floating point if over 2 GB",b) See Also: DirExist, DirInfoToArray, DirItemize DirWindows Returns the name of the Windows or Windows System directory. Syntax: DirWindows (request#) Parameters: (i) request# see below. Returns: (s) directory name. 269 DiskExist This function returns the name of either the Windows directory or the Windows System directory, depending on the request# specified. Req# 0 1 2 Return value Windows directory Windows System directory shared Windows directory on a multi-user system (Windows 2000 and newer). On other versions of Windows, this will return the same value as request 0 Example: DirChange(DirWindows(0)) files=FileItemize("*.ini") ini = AskItemList("Select file", files, @TAB, @unsorted, @single, @false) Run("notepad.exe", ini) See Also: DirGet, DirHome DiskExist Tests for the existence of a drive. Syntax: DiskExist(driveletter) Parameters: (s) driveletter Returns: (i) drive being tested. @TRUE if the drive was found; @FALSE if the drive was not found. Use this function to test for the existence of a specific disk drive. Example: b="A:" a=DiskExist(b) if a Message("Disk Exists", b) else Message("Disk Does Not Exist", b) endif See Also: AppExist, FileExist, DirExist, DiskScan, DiskFree, LogDisk 270 DiskFree DiskFree Finds the total available (unused) disk space on a group of drives. Syntax: DiskFree( drive-list [, format]) Parameters: (s) drive-list one or more drive letters or "UNC Shares" in the format "\\UNC\sharename", separated by"|", or the current file delimiter (usually a tab). (i) format controls the format in which the size is returned. Returns: (i/f) the number of bytes available on all the specified drives. Results larger than 2 gigabytes will be returned as a floating point number. This function takes a string consisting of drive letters or "UNC Shares". When specifying drive letters, only the first character of each non-blank group of characters is used to determine the drives, so you can use just the drive letters, or add a colon (:), or add a backslash (\), and still get a perfectly valid result. When specifying, UNC shares you must specify the root of the UNC share in the format "\\UNC\sharename". By default, results larger than 2 gigabytes will be returned as a floating point number. However, it should be noted that in Windows 95 prior to OSR 2 incorrect values may be returned for volumes larger than 2 gigabytes. Format is an optional parameter that controls the format in which the size is returned. If the result is too large to be returned as an integer (larger than 2 gigabytes). Format Meaning 0 (Default) Floating Point 1 Huge number. This is a long decimal number string, which may represent a number too large to be converted to an integer.'Huge number' is a special data type. It is a long decimal number string, which may represent a number too large to be converted to an integer. This value cannot be modfied with standard arithmetic operations, it requires the use of the Huge Math extender. Example: size = DiskFree("c|d",0) Message("Space Available on C: and D:", size) See Also: DiskScan, FileSize 271 DiskScan DiskInfo Returns information on the specified disk drive. Syntax: DiskInfo(drive-letter, request#) Parameters: (s) drive-letter (i) request# a drive letter see below. Returns: (i) depends on request specified. Req# 1 2 3 4 Return value sectors per cluster bytes per sector number of free clusters total number of clusters Example: spc = DiskInfo("c", 1) bps = DiskInfo("c", 2) bpc = spc * bps Message("Cluster size on drive C:", bpc) See Also: DiskVolInfo, DiskSize, DiskScan, FileSize DiskScan Returns list of drives. Syntax: DiskScan (request#) Parameters: (i) request# see below. Returns: (s) drive list. Req# 0 1 2 4 8 272 Return value List of unused disk IDs List of removable drives (floppies, zip, Jaz drives etc.) List of local fixed (hard) drives List of remote (network) drives CD-ROM (32 bit) DiskSize 16 32 64 RamDisk (32 bit) List of persistent non-connected drives List of USB bus disk drives. (Windows 2000 and later only) Scans disk drives on the system, and returns a tab delimited list of drives of the type specified by request#. For more information on delimiters see File Delimiters, (pg. 69). The request# is a bitmask, so adding the values together (except for 0) returns all drive types specified; e.g., a request# of 3 returns removable (floppies, zip, Jaz, etc.) drives plus local hard drives. Example: hd = DiskScan(2) Message("Hard drives on system", hd) See Also: DiskFree, LogDisk DiskSize Finds the total size of the specified drive(s). Syntax: DiskSize(drive-list [, format]) Parameters: (s) drive-list (i) format Returns: (i/f) one or more drive letters or "UNC Shares" in the format "\\UNC\sharename", separated by"|", or the current file delimiter (usually a tab). This controls the format in which the size is returned. the total size of a selected disk. This function takes a string consisting of drive letters or "UNC Shares". When specifying drive letters, only the first character of each non-blank group of characters is used to determine the drives, so you can use just the drive letters, or add a colon (:), or add a backslash (\), and still get a perfectly valid result. When specifying UNC shares you must specify the root of the UNC share in the format "\\UNC\sharename". By default, results larger than 2 gigabytes will be returned as a floating point number. However, it should be noted that in Windows 95 prior to OSR 2 incorrect values may be returned for volumes larger than 2 gigabytes. Format is an optional parameter that controls the format in which the size is returned. If the result is too large to be returned as an integer (larger than 2 gigabytes). 273 DiskVolInfo Format Meaning 0 (Default) Floating Point 1 Huge number. This is a long decimal number string, which may represent a number too large to be converted to an integer.'Huge number' is a special data type. It is a long decimal number string, which may represent a number too large to be converted to an integer. This value cannot be modfied with standard arithmetic operations, it requires the use of the Huge Math extender. Example: size = DiskSize("c", 0) Message("Size of C:", size) See Also: DiskScan, FileSize, DiskInfo DiskVolInfo Returns information on a file system volume. Syntax: DiskVolInfo(root-path, request) Parameters: (s) root-path (i) request (i/s/t) Request 1 2 3 4 5 6 7 274 specifies the root directory of a file system volume (i.e. "C:\" or "\\SERVER\PUBLIC\") the request number for desired information. See below. return value depends on the request number specified. (see below). Return value (s) volume name (s) file system name (e.g., "FAT" or "NTFS") (s) volume serial number (hex string; e.g., "1234-ABCD") (i) volume serial number (decimal) (i) max length of filename component (portion between backslashes) (b) volume preserves the case of filenames when storing files (b) volume supports case-sensitive filenames Display 8 9 10 11 (b) volume supports Unicode in filenames (b) volume preserves and enforces ACL's (b) volume supports file-based compression (b) volume is a compressed volume (e.g., a DoubleSpace volume) Note: Request numbers which indicate a return type of "(b)" return a Boolean value of 1 (@TRUE) or 0 (@FALSE). Example: vol = DiskVolInfo("c:\", 1) Message("Volume name of drive C:", vol) See Also: DiskInfo Display Displays a message to the user for a specified period of time. Syntax: Display (seconds, title, text) Parameters: (i) seconds (s) title (s) text Returns: (i) seconds to display the message (max 3600). title of the window to be displayed. text of the window to be displayed. @TRUE if terminated by user; @FALSE otherwise. Use this function to display a message for a few seconds, and then continue processing without user input. Seconds must be an integer no greater than 3600. The user can make the displayed message disappear before the designated time has elapsed by clicking a mouse button on the client area of the display window, or by pressing the Space or Enter key. If the user terminates the function in this manner, it will return a value of @TRUE; otherwise, it will return @FALSE. Note: you can specify a negative number for "seconds", in which case the negative number will be treated as a positive number (eg, -5 will be treated as 5), and the display dialog will be invisible. Example: Display(3, "Current window is", WinGetActive( )) which produces something like this: 275 DllCall See Also: Message, Pause DllCall Calls an external DLL. Syntax: DllCall(dllname, returntype:epname [,paramtype:parameter ...] ) Parameters: (s) dllname (t) returntype: (s) epname (t) paramtype (t) parameters Returns: (i/s) the name of the Dll to be called, or a handle returned by the DllLoad function. type of value the Dll entry point will return (see below). entry point name into the Dll. type of parameter (see below). parameters as required by the entry point. either a integer or a string. See discussion below. The DllCall function is unlike all other WIL functions. It is designed to allow sophisticated users to either write their own extensions to the WIL language (using the Windows SDK), to call third party Dll’s, or to access Windows API’s directly. In order to use this function properly, a little background is necessary. There exists a number of very specific reasons one would want to call an external DLL to process some code. Examples may include calling Dll’s to interface with certain hardware devices, to perform special compute-intensive algorithms, or to perform a series of functions not possible using the WIL language. In many cases, the user has no control over the DLL’s to be called, so that the WIL DllCall statement must be able to call a wide variety of Dll’s, to be able to pass an assortment of different parameter types, and to be able to process a number of different return values. For this reason, the DllCall syntax is complicated and initially confusing. Use of the DllCall requires detailed understanding of Windows programming and complete documentation for the Dll and the Dll entry point being called. If you need tech support help with the DllCall statement, you must provide the pertinent documentation before calling for help. To call an external Dll, the user must first determine the following information: 1) 2) 276 Name of the DLL. Entry point name of the desired function within the Dll. DllCall 3) 4) 5) Type of the return value from the Dll. Number of passed parameters the Entry point requires. Type of each of the passed parameters. WIL supports the following types of return types from a Dll: 1) 2) 3) 4) 5) 6) word long lpstr lpwstr void double 16 bit integer 32 bit integer 32 bit pointer to an ANSI string 32 bit pointer to a Unicode string no return value 64-bit floating point value WIL supports the following parameter types to pass data to a Dll: 1) 2) 3) 4) 5) 6) word long lpstr lpwstr lpnull lpbinary 7) double 16 bit integer 32 bit integer 32 bit pointer to an ANSI string 32 bit pointer to a Unicode string 32 bit NULL pointer 32 bit pointer to a memory block allocated with the BinaryAlloc function. The lpbinary datatype can also be used to pass data from a Dll back to the WIL script. See note below, and see section on Binary Operations (pg. 116). 64-bit floating point value Note: If lpbinary is used to pass information from a Dll back to a WIL script via a DllCall, then be sure to use BinaryEodSet to manually set the end of data point so that the other binary functions can reference the returned data. The DllCall parameters are as follows: First: The first parameter defined the Dll to be used. It can either be a dllname or a dllhandle. A dllname may be used for "oneshot" types of calls where a single call to the Dll is all that is required, or when each call to the Dll is independent of all other calls. A dllhandle is used for multiple calls to a Dll, where the calls are interrelated -- perhaps the first call to initialize the Dll, other calls use it, and a final call to terminate processing. In such cases the Dll must first be loaded with the DllLoad function, and freed with the DllFree function. The first parameter must be one of the following: dllname: Simply the filename of the Dll that contains the desired entry point name. A single Dll may contain one or many separate entry points. Each entry point may have its own unique return type and parameter list. 277 DllCall Second: dllhandle: A handle to a Dll obtained from the DllLoad function. The second parameter consists of two parts, the first part is the return type of the entry point desired, followed by a colon (:), and the second part is the entry point name itself. Note: Only use the lpstr or lpwstr return type for entry points that returns actual text strings. In some cases other documentation might suggest using a lpstr or lpwstr as a return type for its structures, don’t. Use long instead. For each parameter the entry point requires, an additional parameter is added to the DllCall parameter list. If the entry point has no parameters, then the DllCall function uses only the first and second parameters as described above. Additional: For each parameter that the entry point in the Dll requires, additional DllCall parameters are added. Each additional parameter consists of two parts, the first part is the parameter type of the required parameter, followed by a colon (:), and the second part is the parameter itself. Example: ; DllCall example. ; This example calls the CharUpperA API in the Windows User module. ; The CharUpperA function requires a 32 bit pointer to ; a string (lpstr). ; It converts the string to uppercase and passes back a 32 bit ; pointer (also lpstr) to the uppercased string. ; The CharUpperA function is found in the Windows USER32.Dll. ; Note: Dll Name, being a normal string is in quotes. ; Entry point name, also being a string, is also in quotes ; Parameter a0, being a normal variable is not in quotes. a0="Hello Dolly" dllname=strcat(dirwindows(1),"USER32.DLL") a1=DllCall(dllname, lpstr:"CharUpperA", lpstr:a0) Message(a0,a1) See Also: DllCall Additional Information, DllCallCdecl, Binary Operations, DllLoad, DllFree, DllHwnd, DllHinst 278 DllCall Additional Information DllCall Additional Information Functions that are called using DllCall must use the __stdcall calling convention (declared as WINAPI). Otherwise, DllCall will return a "Bad Entrypoint" or "Bad Parameter List" error message, even though you have specified the correct function name and parameter types; this would likely indicate that the function is using an unsupported calling convention. Problem: Using DllCall to call a function in a custom DLL that you've developed produces the error message: "NT DllCall: Bad Parameter List" followed by the error message: "1379: DllCall: Bad type list caused stack problems. Check types carefully." First check the number of parameters and the parameter types carefully to make sure that they are indeed correct. If they are, it is likely that the problem is due to your function using the __cdecl calling convention, instead of the required __stdcall. To change this, follow these steps: 1. Add the keyword "WINAPI" to your function prototype and declaration: LONG WINAPI MyFunction(LPSTR); LONG WINAPI MyFunction(LPSTR lpString) This ensures that the function will use the __stdcall calling convention, instead of the default __cdecl convention. DllCall requires __stdcall, in which the called function is responsible for removing the parameters from the stack (similar to _pascal in 16 bit versions of Windows). The WIL program checks the stack pointer before and after the DllCall; if they are not the same, this indicates that either (1) you did not specify the correct parameters to DllCall, or (2) the called function did not clean up the stack properly (probably because it wasn't using __stdcall). Alternatively, in Visual C++ you can use the "/Gz" compiler option (or set Calling Convention to "__stdcall" under "Project | Settings | C/C++ | Category: Code Generation" in the IDE) to make all your functions use __stdcall, but it's wise to specify WINAPI in the declarations as well. 2. Add the option "/EXPORT:MyFunction" to the (VC++) LINK command line. Or, if you have more than one exported function, it may be easier to create a module definition (.DEF) file with an EXPORTS section (or add an EXPORTS section to your existing .DEF file): 279 DllCallCdecl EXPORTS MyFunctionA MyFunctionB If you use the .DEF file method, you will also need to add the option "/DEF:filename" to the (VC++) LINK command line, where "filename" is the name of your module definition file (by default, VC++ 2.x does not create or use .DEF files). This is necessary, even if you have specified "__declspec(dllexport)" in the function declaration, because __stdcall "decorates" (mangles) the function name when it is exported, so that in the DLL it becomes: _MyFunction@4 where the number following the '@' symbol is the stack space used by the function (the parameter count * 4). This prevents DllCall from accessing the function. Exporting the function using the /EXPORT option (or via the EXPORTS section) causes the real, un-decorated name to be exported. After you've done this, it's no longer necessary to declare the function as "__declspec(dllexport)", although it certainly wouldn't hurt to do so. DllCallCdecl Calls an external DLL using the Cdecl calling convention. Syntax: DllCallCdecl(dllname, returntype:epname [,paramtype:parameter ...] ) Parameters: (s) dllname (t) returntype: (s) epname (t) paramtype (t) parameters Returns: (i/s) the name of the Dll to be called, or a handle returned by the DllLoad function. type of value the Dll entry point will return (see below). entry point name into the Dll. type of parameter (see below). parameters as required by the entry point. value returned by the DllCallCdecl depends on the external Dll. It may be either a integer or a string. See discussion below. This function is the same as DllCall, except it calls DLL functions using the Cdecl calling convention, rather than the StdCall calling convention which most Win32 DLL's use. 280 DllCallCdecl DllCallCdecl is designed to allow sophisticated users to either write their own extensions to the WIL language (using the Windows SDK), to call third party Dll’s, or to access Windows API’s directly. In order to use this function properly, a little background is necessary. There exists a number of very specific reasons one would want to call an external DLL to process some code. Examples may include calling Dll’s to interface with certain hardware devices, to perform special compute-intensive algorithms, or to perform a series of functions not possible using the WIL language. In many cases, the user has no control over the DLL’s to be called, so that the WIL DllCallCdecl statement must be able to call a wide variety of Dll’s, to be able to pass an assortment of different parameter types, and to be able to process a number of different return values. For this reason, the DllCallCdecl syntax is complicated and initially confusing. Use of the DllCallCdecl requires detailed understanding of Windows programming and complete documentation for the Dll and the Dll entry point being called. If you need tech support help with the DllCallCdecl statement, you must provide (email, fax, etc.) pertinent documentation before calling for help. To call an external Dll, the user must first determine the following information: 1) Name of the DLL. 2) Entry point name of the desired function within the Dll. 3) Type of the return value from the Dll. 4) Number of passed parameters the Entry point requires. 5) Type of each of the passed parameters. WIL supports the following types of return types from a Dll: 1) 2) 3) 4) 5) 6) word long lpstr lpwstr void double 16 bit integer 32 bit integer 32 bit pointer to an ANSI string 32 bit pointer to a Unicode string no return value 64-bit floating point value WIL supports the following parameter types to pass data to a Dll: 1) 2) 3) 4) 5) 6) word long lpstr lpwstr lpnull lpbinary 7) double 16 bit integer 32 bit integer 32 bit pointer to an ANSI string 32 bit pointer to a Unicode string 32 bit NULL pointer 32 bit pointer to a memory block allocated with the BinaryAlloc function. See section on Binary Operations (pg. 116). 64-bit floating point value 281 DllCallCdecl Note: If lpbinary is used to pass information from a Dll back to a WIL script via a DllCallCdecl, then be sure to use BinaryEodSet to manually set the end of data point so that the other binary functions can reference the returned data. The DllCallCdecl parameters are as follows: First: The first parameter defined the Dll to be used. It can either be a dllname or a dllhandle. A dllname may be used for "oneshot" types of calls where a single call to the Dll is all that is required, or when each call to the Dll is independent of all other calls. A dllhandle is used for multiple calls to a Dll, where the calls are interrelated -- perhaps the first call to initialize the Dll, other calls use it, and a final call to terminate processing. In such cases the Dll must first be loaded with the DllLoad function, and freed with the DllFree function. The first parameter must be one of the following: dllname: Simply the filename of the Dll that contains the desired entry point name. A single Dll may contain one to many separate entry points. Each entry point may have its own unique return type and parameter list. dllhandle: A handle to a Dll obtained from the DllLoad function. Second: The second parameter consists of two parts, the first part is the return type of the entry point desired, followed by a colon (:), and the second part is the entry point name itself. Note: Only use the lpstr or lpwstr return type for entry points that returns actual text strings. In some cases other documentation might suggest using a lpstr or lpwstr as a return type for its structures, don’t. Use long instead. For each parameter the entry point requires, an additional parameter is added to the DllCallCdecl parameter list. If the entry point has no parameters, then the DllCallCdecl function uses only the first and second parameters as described above. Additional: For each parameter that the entry point in the Dll requires, additional DllCallCdecl parameters are added. Each additional parameter consists of two parts, the first part is the parameter type of the required parameter, followed by a colon (:), and the second part is the parameter itself. Example: format = "Hello %%s" username = "Dolly" buffer = BinaryAlloc(512) dllname = StrCat(DirWindows(1), "USER32.DLL") 282 DllHinst len = DllCallCdecl(dllname, long:"wsprintfA", lpbinary:buffer, lpstr:format, lpstr:username) BinaryEodSet(buffer, len) string = BinaryPeekStr(buffer, 0, len) BinaryFree(buffer) Message("", string) For an example on how to use binary buffers to receive data returned through a passed pointer, see the DllHwnd example. See Also: DllCall Additional Information, Binary Operations, DllCall, DllLoad, DllFree, DllHwnd, DllHinst DllFree This function frees a Dll that was loaded via the DllLoad function. Syntax: DllFree(dllhandle) Parameters: (i) dllhandle handle of the Dll to be freed. Returns: (i) always 0. Use this function to free Dll’s that were loaded with the DllLoad function. Failure to free such Dlls will use up system resources. Example: a0="Hello Dolly" dllhandle=DllLoad(strcat(dirwindows(1),"USER32.DLL")) a1=DllCall(dllhandle, lpstr:"CharUpperA", lpstr:a0) DllFree(dllhandle) Message(a0,a1) See Also: DllCall Additional Information, Binary Operations, DllCall, DllLoad DllHinst Obtains an application instance handle for use in DllCall’s when required. Syntax: DllHinst(partial-winname ) Parameters: (s) partial-winname the initial part of, or an entire, window name. 283 DllHwnd Returns: (i) an application instance handle. Use this function to return a valid application instance handle (hInst) of the application owning the specified window. Note: "Partial-winname" is the initial part of a window name, and may be a complete window name. It is case-sensitive. You should specify enough characters so that "partial-windowname" matches only one existing window. If it matches more than one window, the most recently accessed window which it matches will be used. The windowname "" may be used as a shorthand way of referring to the WIL parent application window. Example: binbuf=BinaryAlloc(100) hInst=DllHinst("") dllname=strcat(dirwindows(1),"KERNEL32.DLL") DllCall(dllname,word:"GetModuleFileNameA",long:hInst, lpbinary:binbuf, long:100) ; Note DllCalls do not set EOD point in buffer. ; EOD Point MUST be set manually with BinaryEODSet BinaryEodSet(binbuf, 100) a=BinaryPeekStr(binbuf, 0, 100) BinaryFree(binbuf) Message("Window module filename is", a) See Also: DllCall Additional Information, Binary Operations, DllCall, DllHwnd DllHwnd Obtains a window handle for use in DllCall’s when required. Syntax: DllHwnd(partial-winname) Parameters: (s) partial-winname the initial part of, or an entire, window name. Returns: (i) a window handle. Use this function to return a valid window handle (hWnd) of specified window. Some Dll’s require a window handle. This function will provide - in most cases - a usable window handle. Note: "Partial-winname" is the initial part of a window name, and may be a complete window name. It is case-sensitive. You should specify enough characters so that 284 DllLastError "partial-windowname" matches only one existing window. If it matches more than one window, the most recently accessed window which it matches will be used. The windowname "" may be used as a shorthand way of referring to the WIL parent application window. Example: binbuf=BinaryAlloc(100) hWnd=DllHWnd("") DllCall("USER32.DLL",word:"GetClassNameA",word:hWnd,lpbinary:binbuf, word:100) ; Note DllCalls do not set EOD point in buffer. BinaryEodSet(binbuf, 100) a=BinaryPeekStr(binbuf, 0, 100) BinaryFree(binbuf) Message("Window class name is", a) See Also: Binary Operations, DllCall, DllHinst DllLastError Returns the most recent error returned by a DllCall to a Win32 API. Syntax: DllLastError() Parameters: (none) Returns: (i) most recent error returned by a DllCall. If you call this function after using DllCall to call a Win32 API function which set a "last-error code" value (or another function which used the "SetLastError" API to set a last-error code), this function will return that value. Example: a0="Hello Dolly" dllhandle=DllLoad(strcat(dirwindows(1),"USER32.DLL")) a1=DllCall(dllhandle, lpstr:"CharUpperA", lpstr:a0) Message("Most recent DllCall error",DllLastError()) DllFree(dllhandle) Message(a0, a1) See Also: DllCall Additional Information, DllCall 285 DOSVersion DllLoad This function loads a Dll for later use via the DllCall function Syntax: DllLoad(dllname) Parameters: (s) dllname The name of the Dll to be called. Returns: (i) a handle to a Dll for use in DllCalls. When multiple calls are to be made to a Dll, and the calls are interdependent, the Dll should be first loaded via the DllLoad command, and the return value - a dllhandle should be passed to the DllCall function instead of a filename. Example: a0="Hello Dolly" dllhandle=DllLoad(strcat(dirwindows(1),"USER32.DLL")) a1=DllCall(dllhandle, lpstr:"CharUpperA", lpstr:a0) DllFree(dllhandle) Message(a0, a1) See Also: DllCall Additional Information, Binary Operations, DllCall, DllFree DOSVersion Returns the version numbers of the current version of DOS. Syntax: DOSVersion (level) Parameters: (i) level @MAJOR or @MINOR. Returns: (i) integer or decimal part of DOS version number. @MAJOR returns the integer part (to the left of the decimal). @MINOR returns the decimal part (to the right of the decimal). If the version of DOS in use is 5.0, then: DOSVersion(@MAJOR) DOSVersion(@MINOR) Example: i = DOSVersion(@MAJOR) d = DOSVersion(@MINOR) 286 == == 5 0 DropWild If StrLen(d) == 1 Then d = StrCat("0", d) Message("DOS Version", "%i%.%d%") See Also: Environment, FileVerInfo, Version, VersionDLL, WinVersion Drop Removes variables from memory. Syntax: Drop (var [,var...]) Parameters: (s / a) var Returns: (i) one or more variable names to remove, delimited with a comma. always 1. This function removes variables from the WIL Interpreter's variable list, and recovers the memory associated with the variable (and possibly related string storage). A variable is defined the first time it appears to the left of an equal sign in a statement. It stays defined until it is explicitly dropped with the Drop function, or until the current invocation of the WIL Interpreter gets closed. Generally speaking: in batch file-based implementations of WIL, all variables are dropped automatically at the end of every batch file; and in menu-based implementations of WIL, variables stay defined until explicitly dropped. Drop and DropWild can accept array names as parameters. Note: A WIL script is limited to 2000 variables. Example: a = "A variable" b = "Another one" Drop(a, b) ; This removes A and B from memory Message("Drop","Dropped from memory.") See Also: IsDefined, DropWild DropWild Removes variables from memory. 287 EndSession Syntax: DropWild ( variable/wildcard ) Parameters: (s/a) variable/wildcard variable or wildcarded variable. Returns: (i) number of items dropped. Note: a wildcarded variable does not recognize a wildcard at the beginning of the variable name. DropWild only accepts a wildcard on the end of the variable name, i.e. “var*”. This function removes variables from the WIL Interpreter's variable list, and recovers the memory associated with the variable (and possibly related string storage). A variable is defined the first time it appears to the left of an equal sign in a statement. It stays defined until it is explicitly dropped with the DropWild function, or until the current invocation of the WIL Interpreter gets closed. Generally speaking: in batch file-based implementations of WIL, all variables are dropped automatically at the end of every batch file; and in menu-based implementations of WIL, variables stay defined until explicitly dropped. Drop and DropWild can accept array names as parameters. Note: A WIL script is limited to 2000 variables. Warning: Do not attempt to use the wildcard "*". This causes unpredictable results. Example: a1= "A variable" a2= "Another variable" DropWild("a*") ; This removes A1 and A2 from memory Message("DropWild","Dropped from memory.") See Also: IsDefined, Drop EndSession Ends the Windows session. Syntax: EndSession ( ) Parameters: (none) 288 Environment Returns: (i) always 0. Use this command to end the current Windows session, just like selecting Close from Program Manager's control menu. If any active applications pop up dialog boxes in response to this command (such as prompting to save data files which have changed), the user will need to respond to them before Windows will close. Note: For additional methods of rebooting or restarting Windows, see IntControl 66, 67 and 68. Example: if AskYesNo ("End Session", "You want to exit Windows?") EndSession( ) endif exit :cancel Message("", "Exit Windows canceled") See Also: Exit, WinClose, IntControl 66, IntControl 67, IntControl 68 Environment Gets a DOS environment variable. Syntax: Environment (env-variable) Parameters: (s) env-variable any defined environment variable. Returns: (s) environment variable contents. Use this function to get the value of a DOS environment variable. Note: It is not possible to change a DOS environment variable from within Windows. In 32 bit Windows, you no longer need to update the environment. Basically the registry database commands can do the job for you. For Windows, use the RegApp function to tell the system what path to use for various exe files. You can update this just before launching the app. If WinBatch is going to launch the program, you can also try the EnvironSet function along with the RunEnviron function. After you have changed the PATH with the EnvironSet function, you can take a look at the new settings by displaying in a message box the path: ; Display the PATH for this session 289 EnvironSet currpath = Environment("PATH") Message("Current System Path", currpath) ; Display the Environment for this session allenv=EnvItemize() Message("Environment Settings", allenv) Note that the EnvItemize function displays alot more stuff than does the Environment("PATH"). Example: ; Display the PATH for this DOS session currpath = Environment("PATH") Message("Current DOS Path", currpath) See Also: IniRead, RegApp, EnvItemize, EnvironSet EnvironSet Changes LOCAL Environment variables. Syntax: EnvironSet(name, value) Parameters: (s) name (s) value Returns: (i) name of environment variable. (See Note 1). desired value. @TRUE Environment variable was modified. @FALSE Unable to modify environment. Use this function to change the LOCAL environment variables. 32 bit versions of WIL will always pass the local environment to any programs they launch. In the 32 bit versions, the RunEnviron command is identical to the RunShell Command. Note 1: DOS expects UPPERCASE environment variable names. Windows allows mixed upper and lowercase names. If you are using WIL with DOS, be sure to use uppercase names. Note 2: To alter the path for DOS programs, all that is required is a simple batch file, and the usual WIL Run command. Assuming the case where one wished to run "command.com" with the path "c:\special", a generic batch file as shown below will suffice, along with passing all the information required as parameters in the WIL Run command. 290 EnvItemize DoPath.bat file listing SET PATH=%1 ECHO %PATH% PAUSE %2 %3 %4 %5 %6 %7 %8 %9 WIL Run Command Run("dopath.bat", "c:\special command.com") Example: ;Note: Permanent changes may be made by using the ;registry functions to update the registry. ; ;This function will not affect the environment for ;DOS or Console applications ; ;Modifying the path does not allow or assist WIL in ;locating the EXE file. The path WIL uses has already ;been pre-determined. However the child process (excel) ;will inhieret the PATH environment variable in this case. EnvironSet("PATH","c:\Program Files\Tmp\") RunEnviron("c:\Program Files\Tmp\abc.exe","",@NORMAL,@WAIT) See Also: Environment, EnvItemize, RunEnviron EnvItemize Returns a delimited list of the current environment. Syntax: EnvItemize( ) Parameters: (none) Returns: (s) a list containing all variables in the current environment (See Note). Use this function to return a list of the variables in the current environment. Note: This list is delimited by the newline character (ASCII 10), which can be generated with the Num2Char function. The returned list is suitable for a message box display. Tabs are not used as a delimiter as they seem to be legal characters within the environment. The StrReplace function may be used to change the delimiter to any other character. 291 ErrorMode Example: env=EnvItemize( ) Message("The Environment is", EnvItemize( )) env=StrReplace(env, Num2Char(10), @TAB) a=AskItemList("Select a Variable", env, @TAB, @SORTED, @SINGLE, @FALSE) b=Environment(a) Message(a, b) See Also: Environment, EnvironSet ErrorEvent Causes a user-defined error. Syntax: ErrorEvent( severity, error-code, error-message) Parameters: (i) severity (i) error-code (s) error-message Returns: (i) severity, which can be one of the following: -1 minor error -2 moderate error -3 severe error error code, which must be a number between 7000 and 7999. error message, which is a string describing the error always 1. Example: ErrorEvent ( -1, 7001, "Testing User Defined Error");minor error ErrorEvent ( -2, 7002, "Testing User Defined Error");moderate error ErrorEvent ( -3, 7003, "Testing User Defined Error");fatal error See Also: ErrorMode, User Defined Functions ErrorMode Specifies how to handle errors. Syntax: ErrorMode (mode) 292 ErrorMode Parameters: (i) mode @CANCEL or @NOTIFY or @OFF. Returns: (i) previous error setting. Use this function to control the effects of runtime errors. The default is @CANCEL, meaning the execution of the WIL program will be canceled upon any error. @CANCEL: All runtime errors will cause execution to be canceled. The user will be notified which error occurred. @NOTIFY: All runtime errors will be reported to the user, and the user can choose to continue if it isn't fatal. @OFF: Minor runtime errors will be suppressed. Moderate and fatal errors will be reported to the user. User has the option of continuing if the error is not fatal. In general, we suggest the normal state of the program should be ErrorMode(@CANCEL), especially if you are writing a WIL program for others to use. You can always suppress errors you expect will occur and then re-enable ErrorMode (@CANCEL). ONLY put ErrorMode(@OFF) around SINGLE statements where you are handling the errors yourself. If it is obvious that there is no way a statement could fail it should be run with ErrorMode(@CANCEL) Note: Pay close attention when suppressing errors with the ErrorMode function. When an error occurs, the processing of the ENTIRE line is canceled. Setting the ErrorMode( ) to @OFF or @NOTIFY allows execution to resume at the next line. Various parts of the original line may have not been executed. Never turn ErrorMode( ) to @OFF during debugging. e.g. ErrorMode(@off) ; The FileCopy will cause a file not found error, ; canceling the execution of the whole line. ; The variable A is set to @FALSE by default A = FileCopy( "xxxxxxxxx", "*.*", @FALSE) ; Now there is a NOT symbol in front of the FileCopy. ; None the less, if an error occurs A is still set to @FALSE ; not @TRUE as might be assumed. When an error is suppressed ; with ErrorMode the line is canceled, and any assignment is ; simply set to the default @FALSE value. A = !FileCopy("yyyyyyyyy", "*.*", @FALSE) Message("ErrorMode","ErrorMode executed.") For this reason, ErrorMode( ) must be used with a great deal of care. The function for which the errors are being suppressed should be isolated from other functions and operators as much as possible. 293 Exclusive e.g. ; INCORRECT USAGE of ErrorMode() ; In this instance, when the copy has an error, the entire if ; statement is canceled. ; Execution begins (erroneously) at the next line, and states ; that the copy succeeded. Next a fatal error occurs as the ; "else" is found, since it does not have a matching if ErrorMode(@OFF) if FileCopy(file1,file2,@FALSE) == @TRUE Message("Info", "Copy worked") else Message("Error", "Copy failed") endif ; ; ; ; ; ; ; CORRECT USAGE In this case, the FileCopy is isolated from other statements and flow control logic. When the statement fails, execution can safely begin at the next line. The variable "a" will contain the default value of zero that a failed assignment returns. Results are not confused by the presence of other operators. ErrorMode(@OFF) a = FileCopy(file1,file2,@FALSE) ErrorMode(@CANCEL) if a == @TRUE Message("Info", "Copy worked") else Message("Error", "Copy failed") endif See Also: Debug, ErrorEvent, Execute, IntControl 73, LastError Exclusive Controls whether or not other Windows programs will get any time to execute. Syntax: Exclusive (mode) Parameters: (i) mode @ON or @OFF. Returns: (i) previous Exclusive mode. Exclusive(@OFF) is the default mode. In this mode, the WIL Interpreter is wellbehaved toward other Windows applications. 294 Execute Exclusive(@ON) allows WIL programs to run somewhat faster, but causes the WIL Interpreter to be "greedier" about sharing processing time with other active Windows applications. For the most part, this mode is useful only when you have a series of WIL statements which must be executed in quick succession. Example: Exclusive(@ON) x = 0 start = TimeDate( ) :add x = x + 1 If x < 1000 Then Goto add stop = TimeDate( ) crlf = StrCat(Num2Char(13), Num2Char(10)) Message("Times", "Start: %start%%crlf%Stop: Exclusive(@OFF) %stop%") See Also: Yield, TimeDelay Execute Executes a statement in a protected environment. Any errors encountered are recoverable. Syntax: Execute statement Parameters: (s) statement any executable WIL statement. Returns: (not applicable) Use this command to execute computed or user-entered statements. Due to the builtin error recovery associated with Execute, it is ideal for interactive execution of user-entered commands. Note: The Execute command doesn't operate on a string, per se, but rather on a direct statement. If you want to put a code segment into a string variable, you must use the substitution feature of the language, as in the example below. Example: cmd = "" cmd = AskLine("WIL Interactive", "Command:", cmd, 0) Execute %cmd% See Also: ErrorMode, IntControl 87 295 Exit ExeTypeInfo Returns an integer describing the type of EXE file specified. Syntax: ExeTypeInfo(exename) Parameters: (s) exename Returns: (i) the name of the desired .EXE file or data file. 0 = not an EXE file. 1 = Old style DOS EXE. 2 = New Style DOS EXE. 3 = Windows EXE. 10 = Windows NT EXE Use this function to return an integer describing and identifying the type of EXE file specified. Example: a=ExeTypeInfo(FileLocate("notepad.exe")) switch a case 0 b="Not an EXE file" break case 1 b="Old DOS EXE" break case 2 b="New DOS EXE" break case 3 b="Windows EXE" break case 10 b="Windows NT EXE" break case a b="Unknown file type, value = %a%" break endswitch Message("File Type", b) See Also: AskFileName, FileFullName, FileMapName Exit Unconditionally ends a WIL program. 296 Fabs Syntax: Exit Parameters: (none) Returns: (not applicable) Use this command to immediately terminate a WIL program. An Exit is implied at the end of each top-level WIL program, and so is not necessary there. Example: a = 100 Message("The value of a is", a) Exit See Also: Pause, Return, Terminate Exp Calculates the exponential. Syntax: Exp(x) Parameters: (f) x floating point number. Returns: (f) the value of the exponential ( e ** x). The exp function returns the exponential function of the floating point argument (x). Example: real=AskLine("Exponential", "Enter a number", "1.23", 0) answer=Exp(real) Message("Exponential of %real% is",answer) See Also: LogE Fabs Calculates the absolute value of a floating-point argument. Syntax: Fabs(x) 297 FileAppend Parameters: (f) x floating point number. Returns: (f) the absolute value of the argument. Use this function to calculate the absolute value of a floating point argument. There is no error return. Example: a = -1.23 Message("Fabs(%a%) is", Fabs(a)) See Also: Abs FileAppend Appends one or more files to another file. Syntax: FileAppend (source-list, destination) Parameters: (s) source-list (s) destination Returns: (i) a string containing one or more filenames, which may be wildcarded. target file name. @TRUE if all files were appended successfully; @FALSE if at least one file wasn't appended. Use this function to append an individual file or a group of files to the end of an existing file. If "destination" does not exist, it will be created. The file(s) specified in "source-list" will not be modified by this function. "Source-list" may contain * and ? wildcards. "Destination" may not contain wildcards of any type; it must be a single file name. The FileAppend function glues two files together assuming they are binary files. Therefore, if the files that are being appended contain end-of-file markers, those will be retained. Example: testfile1=FileLocate("win.ini") testfile2=FileLocate("system.ini") testfile3="c:\winini.bak" FileAppend(testfile1,testfile3) FileAppend(testfile2,testfile3) 298 FileAttrGetEx Message("FileAppend",strcat(testfile3,@crlf,"now contains", @crlf,testfile1,@crlf,"and",@crlf,testfile2)) See Also: FileCopy, FileDelete, FileExist FileAttrGet Returns file attributes. Syntax: FileAttrGet (filename) Parameters: (s) filename file whose attributes you want to determine. Returns: (s) attribute settings. Returns attributes for the specified file, in a string of the form "RASH". This string is composed of four individual attribute characters, as follows: Symbol Meaning Symbol Meaning R read only ON read only OFF A archive ON archive OFF S system ON system OFF H hidden ON hidden OFF A hyphen in any of these positions indicates that the specified attribute is OFF. For example, the string "-A-H" indicates a file which has the Archive and Hidden attributes set. Example: editfile = strcat(DirWindows(0),"win.ini") attr = FileAttrGet(editfile) If StrSub(attr, 1, 1) == "R" Message("File is read-only", "Cannot edit %editfile%") else Run("notepad.exe", editfile) endif See Also: FileInfoToArray, FileAttrSet, FileTimeGet, FileTimeGetEx FileAttrGetEx Returns file attributes (extended). Syntax: FileAttrGetEx (filename) 299 FileAttrGetEx Parameters: (s) filename file whose attributes you want to determine. Returns: (i) extended attribute settings. The return value is a bitmask comprised of one or more of the following integer values, combined using the bitwise OR ('|') operator: Value 1 Name READONLY 2 HIDDEN 4 SYSTEM 16* 32 DIRECTORY ARCHIVE 128 NORMAL 256 TEMPORARY 512* 1024* 300 SPARSE_FILE REPARSE_POINT Meaning The file or directory is read-only. Applications can read the file but cannot write to it or delete it. In the case of a directory, applications cannot delete it. The file or directory is hidden. It is not included in an ordinary directory listing. The file or directory is part of, or is used exclusively by, the operating system. Identifies a directory. The file or directory is an archive file or directory. Applications use this attribute to mark files for backup or removal. The file or directory has no other attributes set. This attribute is valid only if used alone. The file is being used for temporary storage. File systems avoid writing data back to mass storage if sufficient cache memory is available, because often the application deletes the temporary file shortly after the handle is closed. In that case, the system can entirely avoid writing the data. Otherwise, the data will be written after the handle is closed. The file is a sparse file. The file or directory has an associated reparse point. FileAttrGetEx The file or directory is compressed. For a file, this means that all of the data in the file is compressed. For a directory, this means that compression is the default for newly created files and subdirectories. OFFLINE The data of the file is not immediately 4096 available. This attribute indicates that the file data has been physically moved to offline storage. This attribute is used by Remote Storage, the hierarchical storage management software. Applications should not arbitrarily change this attribute. NOT_CONTENT_INDEXED The file will not be indexed by the 8192 content indexing service. The file or directory is encrypted. For a 16384* ENCRYPTED file, this means that all data streams in the file are encrypted. For a directory, this means that encryption is the default for newly created files and subdirectories. * The values with an asterisk next to them cannot be set using FileAttrSetEx. 2048* COMPRESSED Example: READONLY HIDDEN SYSTEM DIRECTORY ARCHIVE NORMAL TEMPORARY COMPRESSED OFFLINE NOT_CONTENT_INDEXED ENCRYPTED = = = = = = = = = = = 1 2 4 16 32 128 256 2048 4096 8192 16384 file = strcat(DirWindows(0),"win.ini") attr = FileAttrGetEx(file) if attr & READONLY Message(file, "READONLY") endif if attr & HIDDEN Message(file, "HIDDEN") endif if attr & SYSTEM Message(file, "SYSTEM") endif 301 FileAttrSet if attr & DIRECTORY Message(file, "DIRECTORY") endif if attr & ARCHIVE Message(file, "ARCHIVE") endif if attr & NORMAL Message(file, "NORMAL") endif if attr & TEMPORARY Message(file, "TEMPORARY") endif if attr & COMPRESSED Message(file, "COMPRESSED") endif if attr & OFFLINE Message(file, "OFFLINE") Endif if attr & NOT_CONTENT_INDEXED Message(file, "NOT_CONTENT_INDEXED ") Endif if attr & ENCRYPTED Message(file, "ENCRYPTED") Endif exit See Also: FileAttrSetEx, FileInfoToArray, FileAttrSet, FileTimeGet FileAttrSet Sets file attributes. Syntax: FileAttrSet (file-list, settings) Parameters: (s) file-list (s) settings a delimited list of files. new attribute settings for those file(s). Returns: (i) always 0. The attribute string consists of one or more of the following characters (an upper case letter turns the specified attribute ON, a lower case letter turns it OFF): 302 FileAttrSetEx Symbol R A S H Meaning read only ON archive ON system ON hidden ON Symbol r a s h Meaning read only OFF archive OFF system OFF hidden OFF File list may contain * and ? wildcards. Example: testfile1=strcat(DirWindows(0),"win.ini") FileAttrSet(testfile1, "rAsh") Message("FileAttrSet","File Attributes Set") See Also: FileAttrGet, FileAttrGetEx, FileAttrSetEx, FileTimeTouch FileAttrSetEx Sets file attributes (extended). Syntax: FileAttrSetEx (file-list, attributes, mode) Parameters: (s) file-list (i) attributes (i) mode Returns: (i) Value 1 2 a delimited list of files. May contain wildcards. specifies the attributes to apply to the specified file(s). see below. specifies the method by which "attributes" are applied to the specified file(s), and can be one of the following: 0 "attributes" replaces the existing file attributes 1 "attributes" are added to the existing file attributes -1"attributes" are removed from the existing file attributes @TRUE on success; @FALSE if unable to change the attributes on any of the specified files. Name READONLY HIDDEN Meaning The file or directory is read-only. Applications can read the file but cannot write to it or delete it. In the case of a directory, applications cannot delete it. The file or directory is hidden. It is not included in an ordinary directory listing. 303 FileAttrSetEx 4 SYSTEM 16* 32 DIRECTORY ARCHIVE 128 NORMAL 256 TEMPORARY 512* 1024* SPARSE_FILE REPARSE_POINT 2048* COMPRESSED 4096 OFFLINE 8192 NOT_CONTENT_INDEXED 304 The file or directory is part of, or is used exclusively by, the operating system. Identifies a directory. The file or directory is an archive file or directory. Applications use this attribute to mark files for backup or removal. The file or directory has no other attributes set. This attribute is valid only if used alone. The file is being used for temporary storage. File systems avoid writing data back to mass storage if sufficient cache memory is available, because often the application deletes the temporary file shortly after the handle is closed. In that case, the system can entirely avoid writing the data. Otherwise, the data will be written after the handle is closed. The file is a sparse file. The file or directory has an associated reparse point. The file or directory is compressed. For a file, this means that all of the data in the file is compressed. For a directory, this means that compression is the default for newly created files and subdirectories. The data of the file is not immediately available. This attribute indicates that the file data has been physically moved to offline storage. This attribute is used by Remote Storage, the hierarchical storage management software. Applications should not arbitrarily change this attribute. The file will not be indexed by the content indexing service. FileBaseName ENCRYPTED The file or directory is encrypted. For a file, this means that all data streams in the file are encrypted. For a directory, this means that encryption is the default for newly created files and subdirectories. * The values with an asterisk next to them cannot be set using FileAttrSetEx. 16384* Examples: ADD = 1 TEMPORARY = 256 curdir = DirGet() tempfile = FileCreateTemp(StrCat(curdir,"TMP")) FileAttrSetEx(tempfile, TEMPORARY, ADD) Message("FileAttrSet","TEMPORARY file created:":@crlf: tempfile) exit See Also: FileAttrGetEx, FileAttrGet, FileTimeTouch FileBaseName Extracts the base filename from a full file path. Syntax: FileBaseName (filename [, flag]) Parameters: (s) filename (i) flag fully qualified file name. [optional] 0, or 1. See below. Returns: (i) base filename. The optional 'flag' can be one of the following values: Value 0 1 Meaning (default) do not include a dot '.' on the end of a filename with no extension. include a dot '.' on the end of a filename with no extension. Example: allfiles = FileItemPath("*.*") file = AskItemList("Get base filename of…", allfiles, @tab, @unsorted, @single, @false) basename = FileBaseName(file,0) Message("Base Filename",basename) 305 FileCompare See Also: FileRoot, FileExtension, FileFullname FileClose Closes a file. Syntax: FileClose (filehandle) Parameters: (i) filehandle same integer that was returned by FileOpen. Returns: (i) always 0. Example: ; the hard way to copy an ASCII file testfile1=FileLocate("win.ini") testfile2=strcat(FilePath(testfile1),"winini.bak") old = FileOpen(testfile1, "READ") new = FileOpen(testfile2, "WRITE") while @TRUE ; Loop till break do us end x = FileRead(old) If x == "*EOF*" Then Break FileWrite(new, x) endwhile FileClose(new) FileClose(old) Message("FileClose",strcat(testfile1,@crlf,"backed up to",@crlf,testfile2)) See Also: FileOpen, FileRead, FileWrite FileCompare Compares two files and reports on the result. Syntax: FileCompare(filename1, filename2) Parameters: (s) filename1 (s) filename2 name of first file to compare name of second file to compare Returns: (i) compare result (see below). Possible return values are: 306 FileCopy Return 0 1 -1 2 -2 3 -3 4 Meaning Files contents are identical. Files are same size but different - first file is newer. Files are same size but different - second file is newer. Files are different - first file is newer. Files are different - second file is newer. Second file missing - only first file exists. First file missing - only second file exists. Neither file exists. Use this function to compare two files to determine if they are identical or not. If the return value is zero, the file contents are identical. If the return value is not zero, the actual value provides additional information on why they didn’t compare. An actual byte by byte compare is performed only if the file sizes are identical, otherwise it is obvious that the files must be different. IMPORTANT: If the byte by byte compare is identical, then FileCompare will return 0 (identical) regardless of the file dates. Example: ;Assuming a copy of win.ini has been previously made to win.sav a=FileCompare("WIN.INI", "WIN.SAV") if a==0 Message("Info", "WIN.INI not modified") else Message("Alert!", "WIN.INI has been modified") endif See Also: ExeTypeInfo, FileCopy, FileMove, FileDelete FileCopy Copies files. Syntax: FileCopy (source-list, destination, warning) Parameters: (s) source-list (s) destination (i) warning a string containing one or more filenames, which may be wildcarded. target path and/or file name/wildcard. @TRUE if you want a warning before overwriting existing files; @FALSE if no warning desired. 307 FileCopy Returns: (i) @TRUE if all files were copied successfully (see note); @FALSE if at least one file wasn't copied. Source-list and destination may contain * and ? wildcards. Note: If warning parameter is set to @TRUE , then the return value will be @TRUE, even if it was modified by the user dialog. If a FileCopy fails, it is often for the following reason: The target file is in-use and cannot be overwritten. In this case, check the status of the file with the FileExist function. If FileExist returns a 2, the file is in-use. Use this function to copy an individual file, a group of files using wildcards, or several groups of files by separating the names with a delimiter. You can also copy files to any COM or LPT device, but do not place a colon after the name of the device. If "destination" is a file name of the form "USB###" where "#" is a digit between 0 and 9, it will now be treated as a port number. Examples: ;;;Example 1 temp=Environment("TEMP") DirChange(DirWindows(0)) FileCopy("*.ini", temp, @TRUE) Message("FileCopy","Windows ini files backed up to %temp%") Exit ;;;Example 2 ;Copies all files in "MyDir" to a "Temp" directory ;and checks that the source files are ;NOT open in read deny mode filelist=FileItemize("C:\MyDir\*.*") count=ItemCount(filelist,@TAB) Dirchange("C:\MyDir\") For xx = 1 to count file=ItemExtract(xx,filelist,@TAB) If FileExist(file)==2 Message("Copy failed","%file% is in read-deny mode.") Else FileCopy(file, "C:\Temp\*.*", @FALSE) Endif Next Message("Files copied","Sucessful") Exit ;;;Example 3 ;Print file to LPT1 example ;This example is designed to force a file ;to print on most laser printers ;file name to print 308 FileCopyAttr myfile="C:\WINDOWS\desktop\myfile.txt" ;Create a file with a formfeed to send to printer ;(Used to actually force file to print) home_dir=DirHome() formfeed_file="%home_dir%print.txt" file_handle=FileOpen(formfeed_file,"WRITE") ;inserts a form feed into the file FileWrite(file_handle, Num2Char(12)) FileClose(file_handle) ;execute file copys to LPT1 FileCopy(myfile,"LPT1",@FALSE) FileCopy(formfeed_file,"LPT1",@FALSE) ;cleanup FileDelete(formfeed_file) message("Print Job", "Complete") Exit See Also: FileDelete, FileExist, FileLocate, FileMove, FileRename, IntControl 39 FileCopyAttr Copies files, and sets file attributes. Syntax: FileCopyAttr (source-list, destination, warning, attributes) Parameters: (s) source-list (s) destination (i) warning (s) attributes Returns: (i) a string containing one or more filenames, which may be wildcarded. target path and/or file name/wildcard. @TRUE if you want a warning before overwriting existing files; @FALSE if no warning desired. attributes to be modified. @TRUE if all files were copied successfully (see note); @FALSE if at least one file wasn't copied. Note: If warning parameter is set to @TRUE , then the return value will be @TRUE, even if it was modified by the user dialog. Use this function to copy an individual file, a group of files using wildcards, or several groups of files by separating the names with a delimiter. You can also copy files to any COM or LPT device, but do not place a colon after the name of the device. Source-list and destination may contain * and ? wildcards. 309 FileCreateTemp This function is like FileCopy, but takes an additional parameter which lets you specify the file attributes for the destination files. It is equivalent to doing a FileCopy, followed by a FileAttrSet. If "attributes" is a blank string (""), the destination file(s) will inherit the same attributes as the corresponding source file(s). You only need to specify those attributes which you want to be changed. The "attribute" string consists of one or more of the following characters (an upper case letter turns the specified attribute ON, a lower case letter turns it OFF): Symbol R A S H Meaning read only ON archive ON system ON hidden ON Symbol r a s h Meaning read only OFF archive OFF system OFF hidden OFF Note: The default file delimiter used to delimit lists of files and directories is a TAB. IntControl 29 allows the file delimiter to be changed to a character of your own choosing. Example: temp=Environment("TEMP") DirChange(DirWindows(0)) FileCopyAttr("*.ini", temp, @TRUE,"R") Message("FileCopy","files backed up with Read-Only attribute set") See Also: FileDelete, FileExist, FileLocate, FileMove, FileRename, IntControl 39 FileCreateTemp Creates a temporary file. Syntax: FileCreateTemp ( prefix ) Parameters: (s) prefix Returns: (s) specifies a prefix for the file name, up to 3 characters long (the string may be longer than that, but only the first 3 characters are used). full path name of the temporary file created. This function creates a 0-byte file with a unique name, in the directory designated for temporary files (as specified by the "TMP" or "TEMP" environment variable). 310 FileDelete The temporary file name will have the form: preXXXX.tmp Where "pre" is the prefix specified by the user, and "XXXX" is a 4-character hexadecimal string generated to guarantee a unique file name. The file name will have an extension of ".tmp". Note: This file will not be automatically deleted by the system. See the function FileDelete to delete this file. Example: tempfile = FileCreateTemp("TMP") filehandle = FileOpen(tempfile,"WRITE") FileWrite(filehandle,"Temporary stuff") FileClose(filehandle) Message(tempfile,"Temp file created") FileDelete(tempfile) Message(tempfile,"Temp file deleted") exit See Also: FileDelete, FileOpen FileDelete Deletes files. Syntax: FileDelete (file-list) Parameters: (s) file-list Returns: (i) a string containing one or more filenames, which may be wildcarded. @TRUE if all the files were deleted; @FALSE if a file cannot be deleted (i.e., marked with the READ-ONLY attribute). "File-list" may contain * and ? wildcards. Use this function to delete an individual file, a group of files using wildcards, or several groups of files by separating the names with a delimiter. Example: temp=Environment("TEMP") DirChange(temp) testfile1="test1.bak" testfile2="temp.fil" handle = fileopen(testfile1, "write") 311 FileExist filewrite(handle, "dummy data one") fileclose(handle) handle = fileopen(testfile2, "write") filewrite(handle, "dummy data two") fileclose(handle) Pause("FileDelete","OK to delete *.bak & temp.fil files from %temp%") FileDelete("*.bak|temp.fil") See Also: FileExist, FileLocate, FileMove, FileRename FileDigest Computes a message digest (hash) for a file. Syntax: FileDigest( filename, algorithm, format ) Parameters: (s) filename (s) algorithm (i) format Returns: (s) either a fully qualified filename with drive and path, or just a filename and extension. specifies the hash algorithm to use, and can be one of the following: MD2, MD5, SHA, SHA1 (Note that "SHA" and "SHA1" are the same). specifies the format of the returned string. a message digest (hash) for a file. "format" specifies the format of the returned string. If "format" is 0, the message digest is returned as an unformatted sequence of hex characters, with each byte in the digest represented by two hex characters in the returned string. For example: 00112233445566778899AABBCCDDEEFF 00112233445566778899AABBCCDDEEFF00112233 (MD2/MD5 = 16 bytes) (SHA/SHA1 = 20 bytes) If "format" is 1, then hyphens (for MD2 and MD5) or spaces (for SHA and SHA1) are inserted after every 8 characters in the returned string. For example: 00112233-44556677-8899AABB-CCDDEEFF 00112233 44556677 8899AABB CCDDEEFF 00112233 See Also: FileExist, FileLocate FileExist Tests for the existence of files. 312 (MD2/MD5 = 16 bytes) (SHA/SHA1 = 20 bytes) FileExtension Syntax: FileExist (filename) Parameters: (s) filename Returns: (i) either a fully qualified filename with drive and path, or just a filename and extension. 1 if the file exists; 0 if it doesn't exist or if the pathname is invalid; 2 if the specified file exists but is currently open by another application in read deny mode. If a fully-qualified file name is used, only the specified drive and directory will be checked for the desired file. If only the root and extension are specified, then first the current directory is checked for the file, and then, if the file is not found in the current directory, all directories in the DOS path are searched. FileExist returns "2" if the specified file exists but is currently open by another application in read deny mode. If you try to access this file using (most of) the other "File..." functions, it will cause a sharing violation. FileExist does not support wild-carded file names. Here is a workaround. if FileItemize("c:\somedir\*.*")=="" message("","No files were found") else message("","Files were found") endif Examples: ; check for file in current directory fex = FileExist(StrCat(DirGet( ), "myfile.txt")) if fex Message("MyFile.Txt","Is in the current directory") else Message("MyFile.Txt","Is NOT in the current directory") endif See Also: DirExist, FileLocate FileExtension Returns the extension of a file. Syntax: FileExtension (filename) Parameters: (s) filename [optional path]full file name, including extension. 313 FileFullName Returns: (s) file extension. This function parses the passed filename and returns the extension part of the filename. Example: ; prevent the user from editing a COM or EXE file allfiles = FileItemize("*.*") editfile = AskItemList("Select file to edit", allfiles, @TAB, @unsorted, @single, @false) ext = FileExtension(editfile) If (ext == "COM") || (ext == "EXE") Message ("Sorry", "You may not edit a program file") else Run("notepad.exe", editfile) endif See Also: Dialog, FileBaseName, FilePath, FileRoot FileFullName Fleshes out a file name with drive and path information. Syntax: FileFullName(partial filename) Parameters: (s) partial filename Returns: (s) possibly incomplete filename - missing drive and/or path. a complete file name. Use this function to return the complete file name from a partial file name. Drive and path information will be added to the file name to create a full file name. If both drive and path are missing, the currently logged drive and path will be used. If only drive is missing, the currently logged drive will be used. If drive is specified without a path, then the currently logged directory on that drive will be used. Example: DirChange("C:\TEMP") a="Test.abc" b=FileFullName(a) Message(a,b) ; b will equal C:\TEMP\TEST.ABC See Also: AskFileName, ExeTypeInfo, FileBaseName, FileMapName, FileLocate 314 FileGetW FileGet Converts a file to a string variable. Syntax: FileGet(filename [, null-char]) Parameters: (s) filename (s) null-char Returns: (s) name of the file to read. [optional] specifies the character which NULL characters in the file will be replaced with in the string. If omitted or a blank string (""), then NULL characters will be removed. a string containing the file contents. Example: filename = "c:\temp\readme.txt" data = FileGet(filename , "") Message(StrCat("Contents of ",filename),data) exit See Also: FilePut, FileRead, IntControl 39 FileGetW Converts a file to a Unicode string variable. Syntax: FileGetW(filename [, null-char]) Parameters: (s) filename (s) null-char Returns: (s) name of the file to read. [optional] specifies the character which NULL characters in the file will be replaced with in the string. If omitted or a blank string (""), then NULL characters will be removed. a Unicode string containing the file contents.. This function is like FileGet, except that the return value is a Unicode string, and "null-char" specifies a Unicode character. 315 FileInfoToArray Example: filename = "c:\temp\unicode.txt" data = FileGetW(filename , "") bytecount = StrByteCount(data) bb = BinaryAlloc(bytecount) BinaryPokeStr(bb,0,data) Message("Unicode data is in the binary buffer.") BinaryFree(bb) exit See Also: FileGet, FilePutW, IntControl 39 FileInfoToArray Returns information on a set of files, as an array. Syntax: FileInfoToArray( file-list [, flags]) Parameters: (s) file-list (i) flags Value 1 2 Returns: (a) specifies a list of filenames, which may be wildcarded. [optional] can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Meaning Return file sizes as huge numbers. This is a long decimal number string, which may represent a number too large to be converted to an integer. Return file names with full paths 2-dimension array. This function creates and returns a 2-dimension array. There are [n + 1] rows in the array, where 'n' is the number of files that were returned. Each row has 7 columns. The first row (row 0) is a header containing summary information. Each subsequent row contains information about one returned file. The columns are as follows: Header row: Column 0 1 316 Value number of files returned total size of files returned FileItemize 2-6 (unused, set to 0) Other rows: Column 0 1 2 3 4 5 6 Value file name file size file last modified time, in YmdHms format file last accessed time, in YmdHms format file created time, in YmdHms format file attribute string in the form "RASH" (see FileAttrGet) file attribute bitmask (see FileAttrGetEx) Example: filelist = StrCat(ShortCutDir("Personal",0,@true),"*.*") infoarray = FileInfoToArray(filelist, 1|2) infostr = StrCat("Number of files: ",infoarray[0,0],@Crlf) infostr = StrCat(infostr,"Total size of files: ", infoarray[0,1], @Crlf, @Crlf) For xx = 1 to infoarray[0,0] infostr = StrCat(infostr,"File Name: ",infoarray[xx,0],@Crlf) infostr = StrCat(infostr,"File Size: ",infoarray[xx,1],@Crlf) infostr = StrCat(infostr,"Last Modified: ",infoarray[xx,2],@Crlf) infostr = StrCat(infostr,"Last Accessed: ",infoarray[xx,3],@Crlf) infostr = StrCat(infostr,"Created: ",infoarray[xx,4],@Crlf) infostr = StrCat(infostr,"Attribute: ",infoarray[xx,5],@Crlf) infostr = StrCat(infostr,"Attribute Bitmask: ", infoarray[xx,6], @Crlf) infostr = StrCat(infostr,@Crlf) Next tmpfile = FileCreateTemp("TMP") FilePut(tmpfile, infostr) AskFileText("File Data",tmpfile,@unsorted,@single, @false) FileDelete(tmpfile) exit See Also: FileItemize, FileAttrGet, FileAttrGetEx, FileTimeGet, FileTimeGetEx, FileSize, FileSizeEx FileItemize Returns a delimited list of files. Syntax: FileItemize (file-list) 317 FileItemPath Parameters: (s) file-list Returns: (s) a string containing a list of filenames, which may be wildcarded. a tab delimited list of files. This function compiles a list of filenames and separates the names with delimiters. This is especially useful in conjunction with the AskItemList function, which lets the user choose an item from such a delimited list. Note: Some shell or file manager applications using the WIL Interpreter allow an empty string ("") to be used as the "file-list" parameter, in which case all files highlighted in the file display are returned. However, if there are any file names or wildcards in the string, all files matching the file names are returned, regardless of which ones are highlighted. Example: a = FileItemize("*.bak") ;all BAK files b = FileItemize("*.arc|*.zip|*.lzh") ;compressed files ; Get which .INI file to edit ifiles = FileItemize("c:\windows\*.ini") ifile = AskItemList(".INI Files", ifiles, @TAB, @unsorted, @single, @false) RunZoom("notepad", ifile) Drop(ifiles, ifile) See Also: FileInfoToArray, FileItemPath, CurrentFile, DirItemize, AskItemList, AskFileText, IntControl 29, IntControl 91 FileItemPath Returns a delimited list of file paths. Syntax: FileItemPath(file-list) Parameters: (s) file-list Returns: (s) a string containing a list of filenames, which may be wildcarded. a delimited list of file paths. This function compiles a list of filepaths and separates the names with delimiters. This function is like FileItemize, but the list of file names it returns contains full path information. 318 FileLocate This is especially useful in conjunction with the AskItemList function, which lets the user choose an item from such a delimited list. Note: Some shell or file manager applications using the WIL Interpreter allow an empty string ("") to be used as the "file-list" parameter, in which case all files highlighted in the file display are returned. However, if there are any file names or wildcards in the string, all files matching the file names are returned, regardless of which ones are highlighted. Examples: a = FileItemPath("*.bak") ;all BAK files b = FileItemPath("*.arc|*.zip|*.lzh") ;compressed files ; Get which .INI file to edit DirChange("c:\windows") ifiles = FileItemPath("*.ini") ifile = AskItemList(".INI Files", ifiles, @TAB, @unsorted, @single, @false) RunZoom("notepad", ifile) See Also: FileItemize, CurrentFile, DirItemize, AskItemList, WinItemize FileLocate Finds file in current directory or along the DOS path. Syntax: FileLocate (filename) Parameters: (s) filename full file name, including extension. Returns: (s) fully-qualified path name. This function is used to obtain the fully qualified path name of a file. The current directory is checked first, and if the file is not found, the DOS path is searched. The first occurrence of the file is returned. Example: ; Edit WIN.INI winini = FileLocate("win.ini") If winini == "" Message("???", "WIN.INI not found") else Run("notepad.exe", winini) endif See Also: FileExist 319 FileMapName FileMapName Transforms a filename with a file wildcard mask and returns a new filename. Syntax: FileMapName(filename, mapping-data). Parameters: (s) filename (s) mapping-data full or partial file name. mapping and wildcard definition string (see below). Returns: (s) transformed file name. Use this function to generate a new filename based on an old filename. It can be used to generate *.bak filenames easily, or to perform assorted wildcard transformations on a filename. The mapping-data consists of the normal [optional] drive, path, legal filename characters, the period, and two special wildcard characters, the asterisk (*) and the question mark (?). The following algorithm is used to transform the file name: 1) If drive is specified in the mapping-data use specified drive, else use current drive. 2) If path is specified in the mapping-data use specified path, else use current path on the drive selected above. 3) Examine root of the filename and root position of mapping-data, sequencing through the root characters together, one character at a time. map-char 320 root transformation rule . If the mapping data position character is a period, stop processing the root filename, add a period to the end of the new filename string and proceed to process the extension as outlined below. * If mapping data position is a asterisk, copy remainder of root file name to new filename string and proceed to process the extension as outlined below. ? If mapping data position is a question mark, copy the current character from the root filename to the new filename string. other If the mapping data character is not one of the above, copy the map character to the new filename string and ignore the corresponding character in the root filename. <none> If there are no more characters in the mapping-data string, filename generation is complete. Return with the new string. FileMove 4) Examine extension of the filename and extension position of mapping-data, sequencing through the extension characters together, one character at a time. map-char extension transformation rule * If mapping data position is a asterisk, copy remainder of extension file name to new filename string and return. ? If mapping data position is a question mark, copy the current character from the extension filename to the new filename string. other If the mapping data character is not one of the above, copy the map character to the new filename string and ignore the corresponding character in the extension filename. <none> If there are no more characters in the mapping-data string, filename generation is complete. Return with the new string. Example: DirChange("C:\TEMP") a=FileMapName("d:\sample\xxx.txt", "*.bak") Message("New filename", a) ; This will return C:\TEMP\XXX.BAK a=FileMapName("d:\sample\xxx.txt", "c:\demo\??Q.bak") Message("New filename", a) ; This will return C:\DEMO\XXQ.BAK See Also: AskFileName, FileFullName, FileCopy, FileMove FileMove Moves files. Syntax: FileMove (source-list, destination, warning) Parameters: (s) source-list (s) destination (i) warning one or more filenames separated by a delimiter. target filename. @TRUE for a warning before overwriting existing files; @FALSE if no warning desired. 321 FileMoveAttr Returns: (i) @TRUE if the file was moved; @FALSE if the source file was not found, or the target filename is invalid. Use this function to move an individual file, a group of files using wildcards, or several groups of files by separating the names with a delimiter. You can move files to another drive. You can also move a file to a COM or LPT port, which would cause the file to be copied to the port and then deleted (do not put a colon after the name of the port). "Source-list" and "destination" may contain * and ? wildcards. Examples: ;Example one temp=Environment("TEMP") DirChange(temp) testfile="test.txt" destination="C:\Backup" If DirExist(destination) FileMove(testfile, destination, @FALSE) Message("FileMove","File Moved") Endif ;Example two temp=Environment("TEMP") DirChange(temp) testfile1="test1.txt" testfile2="test2.txt" handle = fileopen(testfile1, "write") filewrite(handle, "dummy data one") fileclose(handle) FileMove(testfile1, testfile2, @FALSE) Message("FileMove","File Moved") See Also: FileMoveAttr, FileCopy, FileDelete, FileExist, FileLocate, FileRename, IntControl 29 FileMoveAttr Moves files, and sets file attributes. Syntax: FileMoveAttr (source-list, destination, warning, attributes) Parameters: (s) source-list (s) destination 322 one or more filenames separated by a delimiter. target filename. FileNameLong (i) warning (s) attributes Returns: (i) @TRUE for a warning before overwriting existing files; @FALSE if no warning desired. attributes to be modified. @TRUE if the file was moved; @FALSE if the source file was not found, or the target filename is invalid. Use this function to move an individual file, a group of files using wildcards, or several groups of files by separating the names with a delimiter. You can move files to another drive. You can also move a file to a COM or LPT port, which would cause the file to be copied to the port and then deleted (do not put a colon after the name of the port). "Source-list" and "destination" may contain * and ? wildcards. The "attribute" string consists of one or more of the following characters (an upper case letter turns the specified attribute ON, a lower case letter turns it OFF): Symbol R A S H Meaning read only ON archive ON system ON hidden ON Symbol r a s h Meaning read only OFF archive OFF system OFF hidden OFF Example: temp=Environment("TEMP") DirChange(temp) testfile1="test1.txt" testfile2="test2.txt" handle = fileopen(testfile1, "write") filewrite(handle, "dummy data one") fileclose(handle) FileMoveAttr(testfile1, testfile2, @FALSE,"R") Message("FileMove","File Moved with Read Only attribute set") See Also: FileMove, FileCopy, FileDelete, FileExist, FileLocate, FileRename, IntControl 29 FileNameLong Returns the long version of a filename. Syntax: FileNameLong(filename) 323 FileOpen Parameters: (s) filename fully qualified file name, path optional. Returns: (s) the long version of a filename. FileNameLong searches the path for the filename specified, returning the long filename if found. Example: DirChange("C:\windows") a=FileNameLong("carved~1.bmp") message("Long Filename", a) See Also: FileFullName, FileNameShort FileNameShort Returns the short (i.e., 8.3) version of a filename. Syntax: FileNameShort(filename) Parameters: (s) filename fully qualified file name, path optional. Returns: (s) the short version of a filename. FileNameShort searches the path for the filename specified, returning the short filename if found. Example: DirChange("C:\windows") a=FileNameShort("carved stone.bmp") message("Short Filename", a) See Also: FileFullName, FileNameLong FileOpen Opens a file for reading, writing or appending. Syntax: FileOpen(filename, mode [, Unicode [, timeout]]) Parameters: (s) filename 324 name of the file to open. FileOpen (s) mode (i) Unicode (i) timeout Returns: (i) "READ", "WRITE", or "APPEND" If "Unicode" is @TRUE, the file will be treated as containing Unicode data, otherwise it will be treated as containing ANSI data. number of seconds to spend retrying the file open operation if it fails due to a sharing violation. filehandle, or 0 on error. The "filehandle" returned by the FileOpen function may be subsequently used by the FileRead, FileWrite, and FileClose functions. If the file cannot be opened as requested, and errors are suppressed with Errormode then FileOpen returns a filehandle of 0. You may have a maximum of 128 files open at one time. FileOpen on an existing file in "WRITE" mode, will overwrite (zero out) the file. If you specify a non-existing file in "WRITE" or "APPEND" mode, it will create the file. FileOpen by default expects each line to be terminated with a line feed character. The file must be some type of standard text file. The binary operations may be used for non-text files. The "Unicode" option will affect how FileRead and FileWrite process the file data. If the file is opened in "APPEND" mode, subsequent calls to FileWrite always write the data in the format of the existing text in the file. If you open the file in "WRITE" mode, then FileWrite will write the text lines according to the unicode parameter: Mode APPEND APPEND WRITE WRITE Unicode ignored ignored @FALSE(default) @TRUE Text in file ANSI Unicode ignored ignored FileWrite output format ANSI Unicode ANSI Unicode By default, if the file is opened in "READ" mode then subsequent calls to FileRead will read the text lines as they exist in the file. But if Unicode is @TRUE, then FileRead will always return the string as Unicode: Mode READ READ READ Unicode @FALSE(default) @FALSE(default) @TRUE Text in file ANSI Unicode ignored FileRead return format ANSI Unicode Unicode The "timeout" option specifies the number of seconds to spend retrying the file open 325 FilePath operation if it fails due to a sharing violation. The default is 0, for no retry. If "timeout" is 1 to 20, the operation will be retried 20 times, evenly-spaced over the specified time period. If "timeout" is greater than 20, the operation will be retried once every second for the specified time period. If "timeout" is -1, the operation will be retried once every second with no timeout. If the file can be opened before the specified time period has elapsed, FileOpen will return successfully, otherwise it will fail. Examples: ; To open for reading: handle = FileOpen("stuff.txt", "READ") ; To open for writing: handle = FileOpen("stuff.txt", "WRITE") ; To open for appending: handle = FileOpen("stuff.txt", "APPEND") Temp = environment("temp") if strsub(temp,strlen(temp),1)!="\" then temp=strcat(temp,"\") testfile1=strcat(temp,"test1.txt") handle=fileopen(testfile1, "write") filewrite(handle, "dummy data one") fileclose(handle) Message("FileOpen","File %testfile1% created") See Also: Binary Operations, BinaryRead, BinaryReadEx, BinaryWrite,BinaryWriteEx, IntControl 40, IntControl 39, FileClose, FileRead, FileWrite FilePath Returns the path of a file. Syntax: FilePath (filename) Parameters: (s) filename fully qualified file name, including path. Returns: (s) fully qualified path name. FilePath parses the passed filename and returns the drive and path of the file specification, if any. Example: coms = Environment("COMSPEC") compath = FilePath(coms) Message("Your command processor is located in", compath) 326 FilePutW See Also: CurrentPath, FileExtension, FileRoot FilePut Writes a string to a file. Syntax: FilePut(filename, string) Parameters: (s) filename (s) string name of the file to write to. string to write to the file. Returns: (i) number of bytes written to the file. If "filename" exists, it will be overwritten. Example: filename = "c:\temp\readme.txt" str = "Hello World" data = FilePut(filename , str) Message("Done", "Writing string to file") exit See Also: FileGet, FilePutW, FileWrite, IntControl 40 FilePutW Writes a Unicode string to a file. Syntax: FilePutW(filename, Unicode string) Parameters: (s) filename (s) Unicode string Returns: (i) name of the file to write to. Unicode string to write to the file. the number of bytes (not characters) written to the file. This will include a 2-byte Unicode header written to the beginning of the file. If "filename" exists, it will be overwritten. 327 FileRead This function is like FilePut, except that "string" specifies a Unicode string. Example: Filename = StrCat(DirScript(),"Unicode.txt") Unicodestr = AskLine("First Name", "Please Enter your first name", "Bob", 1) data = FilePutW(filename, unicodestr) Message("Done", "Writing Unicode string to file") exit See Also: FileGetW, FilePut, IntControl 40 FileRead Reads data from a file. Syntax: FileRead (filehandle) Parameters: (i) filehandle same integer that was returned by FileOpen. Returns: (s) line of data read from file. When the end of the file is reached, the string *EOF* will be returned. Note: This function expects standard DOS CR-LF terminated lines in the file. It will read the next unread line from the file and return that line without the CR-LF on the end. FileRead strips out any NULL's from the file being read. Also, the default maximum length of a line, which can be read using the FileRead function is 4096 bytes. If you need to increase the length of line that FileRead can read see IntControl 65. FileRead can be used to read files containing Unicode data, and will automatically determine the correct file type (ANSI or Unicode), regardless of the "Unicode" parameter in FileOpen, and will convert the return string if necessary. Example: ;Read through file line by line testfile = FileLocate("win.ini") handle = FileOpen(testfile, "READ") count = 0 while @TRUE ; Loop till break do us end line = FileRead(handle) If line == "*EOF*" Then Break count = count + 1 Message(StrCat("Line # ",count), line) endwhile FileClose(handle) 328 FileRoot See Also: FileClose, FileGet, FileOpen, FileWrite, IntControl 65 FileRename Renames files. Syntax: FileRename (source-list, destination) Parameters: (s) source-list (s) destination Returns: (i) one or more filenames, separated by a tab delimiter. target filename. @TRUE if the file was renamed; @FALSE if the source file was not found, or the target filename is invalid. Use this function to rename an individual file, a group of files using wildcards, or several groups of files by separating the names with a delimiter. Note: Unlike FileMove, you cannot make a file change its resident disk drive with FileRename. "Source-list" and "destination" may contain * and ? wildcards. Examples: ;Sample 1 FileRename("c:\config.sys", "config.old") ;Sample 2 FileRename("c:\*.txt", "*.bak") See Also: FileCopy, FileExist, FileLocate, FileMove, IntControl 29 FileRoot Returns root of file. Syntax: FileRoot (filename) Parameters: (s) filename [optional path] full file name, including extension. Returns: (s) file root. 329 FileSize FileRoot parses the passed filename and returns the root part of the filename. Example: allfiles = FileItemize("*.*") editfile = AskItemList("Select file to edit", allfiles,@TAB, @unsorted, single, @false) root = FileRoot(editfile) ext = FileExtension(editfile) lowerext = StrLower(ext) nicefile = StrCat(root, ".", lowerext) Message("", "You are about to edit %nicefile%.") Run("notepad.exe", editfile) See Also: FileBaseName, FileExtension, FilePath FileSize Finds the total size of a group of files. Syntax: FileSize (file-list [, format]) Parameters: (s) file-list (i) format Returns: (i) zero or more filenames, separated by a delimiter and may contain wildcards. [optional] controls the format in which the size is returned. total bytes taken up by the specified file(s). This function returns the total size of the specified files. "File-list" may contain * and ? wildcards. Format is an optional parameter that controls the format in which the size is returned. If the result is too large to be returned as an integer (larger than 2 gigabytes). Format Meaning 0 (Default) Floating Point 1 Huge number. This is a long decimal number string, which may represent a number too large to be converted to an integer.'Huge number' is a special data type. It is a long decimal number string, which may represent a number too large to be converted to an integer. This value cannot be modfied with standard arithmetic operations, it requires the use of the Huge Math extender. FileSizeEx can be used to get the size of files that are open in 'read deny' by other applications. 330 FileSizeEx Example: size = FileSize("*.*") Message("Size of All Files in Directory", size) See Also: FileSizeEx, FileInfoToArray, DiskFree FileSizeEx Finds the total size of a group of files(including open files). Syntax: FileSizeEx (file-list [,format]) Parameters: (s) file-list (i) format Returns: (i) zero or more filenames which may contain * and ? wildcards., separated by a delimiter. [optional] controls the format in which the size is returned, if it is too large to be returned as an integer. 0 - (default) The return value will be a floating point number if it is larger than 2 gigabytes. 1 - the size will be returned as a huge number. This is a long decimal number string, which may represent a number too large to be converted to an integer. total bytes taken up by the specified file(s). This function returns the total size of the specified files. "File-list" may contain * and ? wildcards. This function is like FileSize, but can be used to get the size of files that are open by other applications (which FileSize cannot). Format is an optional parameter that controls the format in which the size is returned. If the result is too large to be returned as an integer (larger than 2 gigabytes). Format Meaning 0 (Default) Floating Point 1 Huge number. This is a long decimal number string, which may represent a number too large to be converted to an integer.'Huge number' is a special data type. It is a long decimal number string, which may represent a number too large to be converted to an integer. This value cannot be modfied with standard arithmetic operations, it requires the use of the Huge Math extender. 331 FileTimeGet Example: size = FileSizeEx("*.*") Message("Size of all (including open) Files in Directory", size) See Also: FileSize, FileInfoToArray, DiskFree FileTimeCode Returns a machine readable/computable code for a file time. Syntax: FileTimeCode(filename) Parameters: (s) filename file name to get the time code from. Returns: (i) file time code. Use this function to return an 32 bit integer representing the current file time stamp. This number may be compared to other file times to compare ages of files. It is basically the DOS 16 bit date and the DOS 16 bit time in a 32 bit integer. This function returns a valid, comparable time through the year 2044. Example: a=FileTimeCode("C:\AUTOEXEC.BAT") b=FileTimeCode("C:\CONFIG.SYS") if a == b ans="Same Time" else if a > b ans = "AutoExec newer than Config" else ans = "AutoExec older than Config" endif endif Message("Comparing file times", ans) See Also: FileTimeGet, FileTimeGetEx, FileYmdHms FileTimeGet Returns file date and time in a human readable format. Syntax: FileTimeGet (filename) 332 FileTimeGetEx Parameters: (s) filename Returns: (s) name of file for which you want the date and time. file time in YmdHms format: (YYYY:MM:DD:HH:MM:SS.). This function will return the date and time of a file, in a pre-formatted string. The format of the string depends on the current settings in the [Intl] section of the registry key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\win.ini[Intl] The registry value will be examined to determine which format to use. You can adjust the registry value via the Regional and Language Options icon in Control Panel if the format isn't what you prefer. Note: If you must parse the time data returned by this function, use the ParseData function to break the day, date, and time into separate components. However you should check the FileYmdHms and FileTimeCode functions first. Example: oldtime = FileTimeGet("C:\windows\win.ini") RunWait("notepad.exe", "win.ini") newtime = FileTimeGet("C:\windows\win.ini") If StrCmp(oldtime, newtime) == 0 Message("WIN.INI not changed", "Last change was %oldtime%") else Message("WIN.INI modified", "New time stamp is %newtime%") endif See Also: FileTimeGetEx, FileTimeCode, TimeDate, FileAttrGet, FileTimeTouch, FileTimeSet, FileTimeSetEx, FileYmdHms, FileInfoToArray FileTimeGetEx Gets extended time information for a file or directory. Syntax: FileTimeGetEx(filename, time-field) Parameters: (s) filename (i) time-field Returns: (s) specifies a file or directory name. see below. file time in YmdHms format: (YYYY:MM:DD:HH:MM:SS). 333 FileTimeSet This function is like FileYmdHms, but works with directories as well as files, and lets you specify which time field you want to get. "Filename" can specify a file or directory name. "Time-field" can be one of the following: 1 file created 2 file last modified 3 file last accessed Example: oldtime = FileTimeGetEx("C:\windows\win.ini",2) RunWait("notepad.exe", "win.ini") newtime = FileTimeGetEx("C:\windows\win.ini",2) If StrCmp(oldtime, newtime) == 0 Message("WIN.INI not changed", "Last change was %oldtime%") else Message("WIN.INI modified", "New time stamp is %newtime%") endif See Also: FileTimeGet, FileTimeCode, TimeDate, FileAttrGet, FileTimeTouch, FileTimeSet, FileTimeSetEx, FileYmdHms FileTimeSet Sets the date and time of one or more files. Syntax: FileTimeSet(file-list, datetime) Parameters: (s) file-list (s) datetime Returns: (i) filename, list of files, or list of wildcards of files to set. datetime in the YmdHms format @TRUE all files specified were time stamped; @FALSE one or more files were not time stamped. Use this function to reset the date and time of a specific file or list of files. Example: ; Alter time of the WIN.INI file winini= FileLocate("Win.ini") b=FileYmdhms(winini) Message("File Time for %winini% is", b) a="1999:02:14:09:38:26" FileTimeSet(winini, a) b=FileYmdhms(winini) Message("File Time for %winini% is now", b) 334 FileTimeSetEx See Also: FileTimeSetEx, GetExactTime, FileYmdHms, IntControl 29, TimeDiffDays, TimeDiffSecs, TimeYmdHms FileTimeSetEx Sets extended time information for one or more files. Syntax: FileTimeSetEx(file-list, datetime, time-field) Parameters: (s) file-list (s) datetime (i) time-field Returns: (i) filename, list of files, or list of wildcards of files to set. datetime in the YmdHms format see below. @TRUE on success; @FALSE if any of the specified files could not be changed. "Time-field" can be one of the following: 1 2 3 file created file last modified file last accessed This function is like FileTimeSet, but lets you specify which time field you want to set. Example: ; Alter time of the WIN.INI file winini= FileLocate("Win.ini") b=FileYmdhms(winini) Message("File Time for %winini% is", b) a="1999:02:14:09:38:26" FileTimeSetEx(winini, a, 2) b=FileYmdhms(winini) Message("File Time for %winini% is now", b) ;Alter the time of all files in the temp directory a=TimeYmdHms( ) Temp = environment("temp") if strsub(temp,strlen(temp),1)!="\" then temp=strcat(temp,"\") FileTimeSetEx("%temp%*.*", a, 2) See Also: FileTimeSet, GetExactTime, FileYmdHms, TimeDiffDays, TimeDiffSecs, TimeYmdHms 335 FileVerInfo FileTimeTouch Sets file(s) to current date and time. Syntax: FileTimeTouch (file-list) Parameters: (s) file-list a delimited list of files Returns: (i) always 0. "File-list" is a delimited list of files, which may contain wildcards. The path is searched if the file is not found in current directory and if the directory is not specified in "file-list". Example: ;Alter the time of all files in the temp directory Temp = environment("temp") if strsub(temp,strlen(temp),1)!="\" then temp=strcat(temp,"\") FileTimeTouch("%temp%*.*") a=TimeYmdHms( ) Message("FileTimeTouch","All files in %temp% set to %a%") See Also: FileAttrSet, FileTimeGet, IntControl 29 FileVerInfo Returns a version resource string from a binary file. Syntax: FileVerInfo(filename, language-key, resource-string) Parameters: (s) filename (s) language-key (s) resource-string Returns: (s) name of the EXE, DLL, or other binary file containing version resource information. a hexadecimal string identifying the desired language and character-set block within the file's resource table. specifies the item to return. (see below.) version resource string from binary file or a blank string ("") if the specified item was not found. Note: if you specify blank strings for both "language-key" and "resource-string", it will now return a tab-delimited list of language keys for which version information is available in the specified file. 336 FileVerInfo "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. if you specify a blank string for "language-key", it will try to look up the item under the following language keys, in the specified order: language-key 040904E4 040904B0 000004E4 04090000 00000000 000004B0 language U.S. English U.S. English Neutral U.S. English Neutral Neutral character set Windows Multilingual Unicode Windows Multilingual Neutral Neutral Unicode For a list of all the possible language keys see the WIL help file. "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" Note: FileVerInfo can return numeric version fields, by preceding the resource string name with a '#'. The following are available: "#FileVersion" "#ProductVersion" "#FileFlagsMask" "#FileFlags" "#FileOS" "#FileType" "#FileSubtype" "#FileVersion" and "#ProductVersion" are 64-bit numbers, and are returned as comma-separated strings in the form "n1,n2,n3,n4", where n1 is the most significant word and n4 is the least significant word. The other fields each return a single 32-bit number. 337 FileVerInfo Example: ; Version Information Example WinBatch Script FileN = FileLocate("explorer.exe") ErrorMode(@OFF) FComments = FileVerInfo(FileN, "", "Comments") FCompany = FileVerInfo(FileN, "", "CompanyName") FDescription = FileVerInfo(FileN, "", "FileDescription") FVersion = FileVerInfo(FileN, "", "FileVersion") FInternalName = FileVerInfo(FileN, "", "InternalName") FLegalCopyright = FileVerInfo(FileN, "", "LegalCopyright") FOriginalFilename = FileVerInfo(FileN, "", "OriginalFilename") FProductName = FileVerInfo(FileN, "", "ProductName") FProductVersion = FileVerInfo(FileN, "", "ProductVersion") ErrorMode(@Cancel) DlgFormat=`WWWDLGED,6.2` DlgCaption=`FileVerInfo` DlgX=004 DlgY=021 DlgWidth=240 DlgHeight=147 DlgNumControls=019 DlgProcedure=`DEFAULT` DlgFont=`DEFAULT` DlgTextColor=`DEFAULT` DlgBackground=`DEFAULT,DEFAULT` DlgConfig=0 Dlg001=`067,003,168,014,VARYTEXT,"VaryText_1",FComments,DEFAULT,DEFAU LT,1,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg002=`003,003,066,014,STATICTEXT,"StaticText_Comments:",DEFAULT,"Co mments:",DEFAULT,2,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg003=`003,017,064,014,STATICTEXT,"StaticText_Company:",DEFAULT,"Com pany:",DEFAULT,3,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg004=`067,017,168,014,VARYTEXT,"VaryText_2",FCompany,DEFAULT,DEFAUL T,4,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg005=`003,031,064,014,STATICTEXT,"StaticText_Description:",DEFAULT, "Description:",DEFAULT,5,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg006=`067,031,168,014,VARYTEXT,"VaryText_3",FDescription,DEFAULT,DE FAULT,6,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg007=`003,045,064,014,STATICTEXT,"StaticText_Version:",DEFAULT,"Ver sion:",DEFAULT,7,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg008=`067,045,168,014,VARYTEXT,"VaryText_4",FVersion,DEFAULT,DEFAUL T,8,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg009=`003,059,064,014,STATICTEXT,"StaticText_5",DEFAULT,"Internal Name:",DEFAULT,9,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg010=`067,059,168,014,VARYTEXT,"VaryText_5",FInternalName,DEFAULT,D EFAULT,10,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg011=`003,073,064,014,STATICTEXT,"StaticText_6",DEFAULT,"Legal Copyright:",DEFAULT,11,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg012=`067,073,168,014,VARYTEXT,"VaryText_6",FLegalCopyright,DEFAULT ,DEFAULT,12,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg013=`003,087,064,014,STATICTEXT,"StaticText_7",DEFAULT,"Original Filename:",DEFAULT,13,DEFAULT,DEFAULT,DEFAULT,DEFAULT` 338 FileWrite Dlg014=`067,087,168,014,VARYTEXT,"VaryText_7",FOriginalFilename,DEFAU LT,DEFAULT,14,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg015=`003,101,064,014,STATICTEXT,"StaticText_8",DEFAULT,"Product Name:",DEFAULT,15,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg016=`067,101,168,014,VARYTEXT,"VaryText_8",FProductName,DEFAULT,DE FAULT,16,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg017=`003,115,064,014,STATICTEXT,"StaticText_9",DEFAULT,"Product Version:",DEFAULT,17,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg018=`067,115,168,014,VARYTEXT,"VaryText_9",FProductVersion,DEFAULT ,DEFAULT,18,DEFAULT,DEFAULT,DEFAULT,DEFAULT` Dlg019=`087,129,064,014,PUSHBUTTON,"PushButton_Ok",DEFAULT,"Ok",1,19, DEFAULT,DEFAULT,DEFAULT,DEFAULT` ButtonPushed=Dialog("Dlg") See Also: DOSVersion, Environment, Version, VersionDLL, WinVersion FileWrite Writes data to a file. Syntax: FileWrite (filehandle, output-data) Parameters: (i) filehandle (s) output-data same integer that was returned by FileOpen. data to write to file. Returns: (i) always 0. Note: This function will append a CR-LF line terminator to the end of each line written to the file, or as directed by IntControl 53. If the file is opened in "APPEND" mode, subsequent calls to FileWrite always write the data in the format of the existing text in the file. If you open the file in "WRITE" mode, then FileWrite will write the text lines according to the unicode parameter: Mode APPEND APPEND WRITE WRITE Unicode ignored ignored @FALSE(default) @TRUE Text in file ANSI Unicode ignored ignored FileWrite output format ANSI Unicode ANSI Unicode Example: handle = FileOpen("stuff.txt", "WRITE") FileWrite(handle, "Gobbledygook") 339 FindWindow FileClose(handle) Message("FileWrite","File Written.") See Also: FileClose, FileOpen, FilePut, FileRead, IntControl 53 FileYmdHms Returns a file time in the YmdHms date time format. Syntax: FileYmdHms(filename) Parameters: (s) filename filename. Returns: (s) file time in YmdHms format. Use this function to retrieve a file time in the YmdHms datetime format. Example: b=FileYMDHMS("C:\CONFIG.SYS") Message("File Time is", b) See Also: FileTimeGet, FileTimeGetEx, TimeDate, TimeAdd, TimeDiffDays, TimeYmdHms, TimeDelay, TimeWait FindWindow Returns a window title matching a specified class name. Syntax: FindWindow(class name) Parameters: (s) class name the full unique window class name. Returns: (s) a window title. FindWindow returns the window title of the first window whose class name matches the specified "class-name". It can be used to manipulate windows when the title is either unknown or there are several windows with the same title. A blank string ("") is returned if no matching window is found. 340 For Note: "Class-name" is not case sensitive but must be the full class name (i.e., not a partial name). Example: run("explorer.exe",strcat("/n,/e,",DirGet( ))) while FindWindow("ExploreWClass")=="" ;wait for it to come up Timedelay(1) endwhile See Also: IntControl 44 Floor Calculates the floor of a value. Syntax: Floor(x) Parameters: (f) x Returns: (f) value Floor is calculated from. a floating point number whose value represents the largest integer that is less than or equal to x. Use this function to calculate the floor of a value. Example: ; This example accepts a value from the user to calculate ; the ceiling and floor. a=AskLine("Ceiling and Floor", "Please enter a number", "1.23", 0) c=Ceiling(a) f=Floor(a) Message("Ceiling and Floor of %a%", "Ceiling: %c% Floor: %f%") A= 25.2 25.7 24.9 -14.3 Ceiling= 26.0 26.0 25.0 -14.0 Floor= 25.0 25.0 24.0 -15.0 See Also: Abs, Ceiling, Fabs, Min, Max For Controls the looping of a block of code based on an incrementing index. 341 ForEach Syntax: For var-name = initial-value to last-value [ by increment] Parameters: (s) var-name (f) initial-value (f) last-value (f) increment a variable name to be used for the loop index. an expression used to set the initial value of the loop index. an expression that defines last value to be used in the loop. When the initial value is incremented past the last value, the loop terminates. an expression that defines the amount to increment the loop index on each pass through the loop. The default is one. The increment may be negative. Use the For statement to execute a block of code a fixed number of times. When the For statement is executed, it initializes the specified variable "var-name" to the "initial-value" This variable is called the "loop index". It then tests the "loop index" with the "last value". If the "increment" is positive and the "loop index" is greater than the last value, or if the "increment" is negative and the "loop index" is less than the last value, then the loop terminates and control is passed to the statement after the Next statement. Otherwise the statements below the For are executed until the Next statement is reached. When the Next statement is reached, control returns to the For statement so that the "loop index" may be incremented and the test for "last value" repeated. Example: ; Compute sum of numbers between 1 and selected number a=AskLine("Sums", "Please enter a number", 5, 0) f=0 For j = 1 to a f = f + j Next Message("Sum [ 1 to %a% ] is", f) ;Compute factorials a=AskLine("Factorials", "Please enter a number", 5, 0) f=1 For j = a to 2 by -1 f=f*j Next Message("%a% Factorial is", f) See Also: Break, Continue, If, Select, Switch, While ForEach The ForEach loop is similar to the For loop, but it executes the statement block for each element in a collection, instead of a specified number of times. 342 ForEach Syntax: ForEach Elementvariable In Collection … Next Parameters: (*) Elementvariable (r) Collection A variable name. A COM/OLE collection object reference, or object property or method holding a collection. For each iteration of the loop, WinBatch sets the variable Elementvariable to one of the elements in Collection and executes the statement block between the ForEach and Next. When all the elements in Collection have been assigned to Elementvariable, the ForEach loop terminates and control passes to the statement following the Next statement. If Elementvariable is not used before the loop, it will be created for you. If it is used before the loop, the previously existing value of the variable is lost when the ForEach statement executes for the first time. The elements of Collection can be of any data type, so the data assigned to elementvariable can be of any supported type including object references. After the loop terminates, Elementvariable contains the last element of the collection. If the elements of the collection are object references, you are responsible for releasing the last references with an assignment statement or the ObjectClose function. To terminate a loop before the last element of the Collection is assigned to ElementVarible use a break statement. Goto statments are not permitted inside of ForEach...Next loops and will cause WinBatch to generate an error message. It recommended that you not modify the Elementvariables in a ForEach...Next loop. Any modification you make may affect only the local copy of the element and may not be reflected back into the collection. Attempts to modify an element may also generate an error message It is also recommended that you not alter the collection by adding, deleting, replacing, or reordering any elements. If you alter the collection after you have initiated a ForEach...Next loop, the Collection object becomes invalid, and the next attempt to access an element may result in an error message or other unexpected behavior. You can iterate through single dimension arrays returned by object properties and methods with a ForEach...Next loop. However, you should not attempt to change array elements from within the loop. 343 GetExactTime Example: This example uses a ForEach … Next loop and WMI to collect information on all installed printers on the local machine. objWMIService = ObjectGet("winmgmts:{impersonationLevel=impersonate}!\ \.\root\cimv2") colInstalledPrinters = objWMIService.ExecQuery("Select * from Win32_Printer") sPrinterInfo = "" ; Iterate through each printer and collect ForEach objPrinter in colInstalledPrinters sPrinterInfo = strcat(sPrinterInfo, "Name: ", objPrinter.Name, @crlf) sPrinterInfo = strcat(sPrinterInfo, "Location: ", objPrinter.Location, @crlf) if objPrinter.Default sYesNo = "Yes" else sYesNo = "No" endif sPrinterInfo = strcat(sPrinterInfo, "Default: ", sYesNo, @crlf, @crlf) Next Message("Installed Printers", sPrinterInfo) ; Clean up objPrinter = "" colInstalledPrinters = "" objWMIService = "" See Also For, ObjectCreate, ObjectGet GetExactTime Returns current time in hundredths of a second. Syntax: GetExactTime( ) Parameters: (none) Returns: (s) the current time in hundredths of a second. Use this function to obtain the current time in hundredths of seconds. 344 GoSub Example: a=GetExactTime( ) Message("Time is", a) See Also: TimeDate, TimeYmdHms, GetTickCount GetObject Pseudonym for ObjectGet. Returns a reference to an object provided by a COM/OLE component. See ObjectGet for details. See Also: ObjectGet, ObjectCreate GetTickCount Returns number of clock ticks used by Windows since Windows started. Syntax: GetTickCount( ) Parameters: (none) Returns: (i) the number of clock ticks. Use this function to obtain the number of clock ticks since Windows started. Example: a=GetTickCount( ) Message("Clock Ticks", a) See Also: TimeDate, GetExactTime, TimeYmdHms GoSub Transfers control to another point in a WIL program and saves the location of the next statement. Syntax: GoSub label Parameters: (s) label user-defined identifier 345 Goto GoSub label causes an unconditional transfer of control to the line in the program marked :label where the identifier is preceded by a colon (:). The location of the next statement after the GoSub statement is retained, and control may be transferred back to that statement with a Return statement. Note: If you call GoSub from within a User Defined Function, the 'label' must be defined within the User Defined Function. Labels for Goto and Gosub can be up to 249 characters. Example: a=1 b=2 c=3 x=21 GoSub Poly Message("Polynomial evaluates to", y) a=3 b=4 c=6 x=45 GoSub Poly Message("Polynomial evaluates to", y) exit ; Polynomial Computation Subroutine here :Poly y = a*(x**2) + b*x + c return See Also: For, Goto, Return, Switch, Select, While Goto Changes the flow of control in a WIL program. Syntax: Goto label Parameters: (s) label user-defined identifier. Goto label causes an unconditional branch to the line in the program marked :label, where the identifier is preceded by a colon (:). Note: Program flow control structures, such as For/Next, ForEach/Next, While/EndWhile, Switch/EndSwitch, If/EndIf must not be "jumped" by a Goto statement. If a Goto is used inside of one of these structures to send the flow of 346 IconInfo control outside of the structure, or if a Goto is used to send the flow of control inside a structure, errors will result. Labels for Goto and Gosub can be up to 249 characters. Example: If WinExist("Solitaire") == @FALSE Then Goto open WinActivate("Solitaire") Goto loaded :open Run("sol.exe", "") :loaded exit See Also: For, If, Switch, While IconExtract Extracts an icon group from an EXE/DLL. Syntax: IconExtract(filename, icon filename, index) Parameters: (s) filename (s) icon filename (i) index Returns: (i) specifies a fully qualified filename of the EXE or DLL from which the icon group will be extracted. specifies the name of the ICO file to which the icon group will be written. If the file exists, it will be overwritten. specifies the ordinal position in "filename" of the icon group to be extracted, where the first icon group is 1. the number of images in the icon group that was extracted. Example: num = IconExtract(StrCat(DirWindows(0),"notepad.exe"),"ICONFILE.ICO",1) Message("Number of images in icon group extracted ",num) exit See Also: IconInfo, IconReplace IconInfo Returns information about the icons in an EXE/DLL or ICO file. 347 IconInfo Syntax: IconInfo(filename, filetype) Parameters: (s) filename (i) filetype Returns: (a) specifies a fully qualified filename of the file from which the icon information will be returned. specifies the type of file: 0 = EXE or DLL (Win32) 1 = ICO file an array of icon information. For filetype 0, the array is a three-dimension array in the following format: arr[0,0,0] = number of icon groups in the file arr[1,*,*] = icon group 1 arr[2,*,*] = icon group 2 (if any) etc. For each icon group 'x': arr[x,0,0] = number of icon images in the group arr[x,0,1] = the string "WIDTH" arr[x,0,2] = the string "HEIGHT" arr[x,0,3] = the string "COLOR DEPTH" Then, for each icon image 'y' in the group: arr[x,y,0] = image index, where the first image in the group is 1 arr[x,y,1] = image width, in pixels arr[x,y,2] = image height, in pixels arr[x,y,3] = image color depth, in bits For filetype 1, the array is a two-dimension array in the following format: arr[0,0] = number of icon images in the file arr[0,1] = the string "WIDTH" arr[0,2] = the string "HEIGHT" arr[0,3] = the string "COLOR DEPTH" arr[1,*] = icon image 1 arr[2,*] = icon image 2 (if any) etc. For each icon image 'x': arr[x,0] = image index, where the first image in the file is 1 arr[x,1] = image width, in pixels arr[x,2] = image height, in pixels arr[x,3] = image color depth, in bits 348 IconReplace The "color depth" value is the number of bits per pixel. This corresponds to the number of colors as follows: Depth 1 2 4 8 16 24 32 Colors 2 4 16 256 65536 16 million 4 billion Example: arr = IconInfo(StrCat(DirWindows(0),"notepad.exe"), 0) groups = arr[0,0,0] info = "" For i = 1 to groups info = StrCat(info, "Group #", i, @crlf, "--------",@crlf) icons = arr[i,0,0] For j = 1 to icons info = StrCat(info, "Icon #", j, @crlf, "--------", @crlf) For k = 1 to 3 info = StrCat(info, @tab, arr[i,0,k], " = ", arr[i,j,k],@crlf) Next Next Next Message("Icon Info",info) exit See Also: IconExtract, IconReplace IconReplace Replaces an existing icon group with a new icon group. Syntax: IconReplace(filename, icon filename [, index [, flags]]) Parameters: (s) filename (s) icon filename (i) index (i) flags either a fully qualified filename with drive and path, or just a filename and extension. the filename of the icon. [optional] specifies the ordinal position of the icon group to modify, where the first icon group is 1. [optional] see below. 349 IconReplace Returns: (i) number of icons replaced. "flags" can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value 0 1 Meaning Default Delete un-replaced icon images in the target icon group (32-bit EXE's only) (Windows NT and newer) For example, if the target icon group in the EXE has 6 icon images, and the specified .ICO file has only one icon image, if you specify this flag then the one matching icon image in the EXE will be replaced and the other 5 will be deleted. It is suggested that caution be used when using this command, keeping the following points in mind: 1) The EXE file might become damaged and be unable to run. This is especially true of some programs that checksum themselves to verify the EXE. KEEP BACKUPS. 2) System anti-virus tools might detect the alteration of an EXE file and complain. If this is true, then either the anti-virus program must be disabled, or another work around must be used. Some anti-virus programs allow the specification of a "trusted" program - the trusted feature may be used with due caution. 3) The application whose icon is being modified must not be running while its EXE file is being modified. Note: An icon group is a set of one or more associated icon images, of different dimensions and color depths. An EXE file can contain multiple icon groups; an icon (.ICO) file contains a single icon group. Each icon image in the targeted icon group in the EXE file is compared with each icon image in the specified .ICO file, and if the .ICO file contains an icon image whose size (and dimensions and color depth) is the same as the targeted icon image in the EXE, then the targeted icon image in the EXE is replaced with the corresponding icon image from the .ICO file. If no suitable replacement icon is found in the .ICO file, then that particular icon image in the EXE is left unchanged. Requirements for Icons The .ICO file must have all the following image formats to successfully replace all the icons in the icon group. 350 If ... Else ... Endif If ... Then ... Else Dimensions 16x16 16x16 16x16 32x32 32x32 32x32 48x48 48x48 48x48 Color Depth 4 bit color 8 bit color 32 bit color 4 bit color 8 bit color 32 bit color 4 bit color 8 bit color 32 bit color Example: IconReplace("FILENAME.EXE", "ICONFILE.ICO",1) See Also: IconExtract, IconInfo If ... Else ... Endif If ... Then ... Else Conditionally performs a function or series of statements. Syntax: Note: There are several forms of the if statement: if ... endif (structured): if expression series of statements endif if ... else ... endif (structured): if expression series of statements else series of statements endif if ... then (single statement): 351 If ... Else ... Endif If ... Then ... Else if expression then statement if ... then ... else ... (single statement): if expression then statement else statement Parameters: (s) expression a condition to be evaluated. (s) statement any valid WIL function or command. (s) series of statements multiple lines of valid WIL statements. The if statement evaluates the expression following it. The expression must evaluate to an integer. In the structured forms of the if syntax, if the expression evaluates to a non-zero value (@TRUE) the series of statements after the if statement up to the first matching else or endif are executed, otherwise they are skipped. In the if ... else ... endif syntax, the series of statements after the else are executed if the result of evaluating the expression is zero (@FALSE). In the single statement forms of the if syntax, if the expression evaluates to a nonzero value (@TRUE) the statement following the then keyword is executed, otherwise it is skipped. In the if ... then ... else ... syntax, the statement following the else is executed if the result of evaluating the expression is zero (@FALSE). Example: ; This example guesses a # between 1 and 1023. Message("Think of a number", "Any number between 0 and 1023") start = 0 stop = 1023 for i = 1 to 10 guess = (start+stop+1) /2 if AskYesNo("Hmmmm", "Is your number smaller than %guess%") stop = guess - 1 else start = guess endif next guess = (start+stop+1) /2 if guess==0 || guess==1023 Message("Hmmm", "%guess% eh? Testing the limits again I assume") else if guess==13 Message("Hmmm", "%guess% seems rather unlucky to me") else a = guess mod 2 if a==0 then Message("Hmmm", "Even I can figure %guess%") else Message("Hmmm", "It must be %guess%",oddly enough") 352 IniDelete endif endif See Also: For, Select, Switch, While IgnoreInput Turns off hardware input to Windows. Syntax: IgnoreInput (mode) Parameters: (i) mode Returns: (i) @TRUE or @FALSE. Specify -1 to retrieve the current state. previous IgnoreInput mode, or -1 if this function is not supported. Note: If you explicity request input, using any WIL function that displays a dialog/window, while in IgnoreInput(@TRUE) mode, input will be enabled as the program awaits user input, and the re-disabled afterwards. Examples: Message("IgnoreInput","Turns off Keyboard/Mouse input for 10 seconds") IgnoreInput(@TRUE) Run("notepad.exe", "") TimeDelay(10) IgnoreInput(@FALSE) Message("IgnoreInput","Keyboard/Mouse input restored") See Also: Sendkey IniDelete Removes a line or section from WIN.INI. Syntax: IniDelete (section, keyname) Parameters: (s) section (s) keyname the major heading under which the item is located. the keyword name of the item to delete. 353 IniDeletePvt Returns: (i) always 0. This function will remove the specified line from the specified section in WIN.INI. You can remove an entire section, instead of just a single line, by specifying a "keyname" of @WHOLESECTION. Case is not significant in "section" or "keyname". Note: INI files are mapped to registry Example: IniDelete("Desktop", "Wallpaper") IniDelete("Quicken", @WHOLESECTION) Message("IniDelete","Ini Deleted.") See Also: IniDeletePvt, IniItemize, IniRead, IniWrite IniDeletePvt Removes a line or section from a private INI file. Syntax: IniDeletePvt (section, keyname, filename) Parameters: (s) section (s) keyname (s) filename the major heading under which the item is located. the keyword name of the item to delete. path and file name of the INI file. Returns: (i) always 0. This function will remove the specified line from the specified section in a private INI file. You can remove an entire section, instead of just a single line, by specifying a "keyname" of @WHOLESECTION. Case is not significant in "section" or "keyname". Note: Path information must be specified if the INI file is not in the Windows directory. If there is no path information provided, then the INI file is assumed to be in the Windows directory (as shown by DirWindows(0) ). Example: IniDeletePvt("Current Users", "Excel", "meter.ini") Message("IniDeletePvt"," Pvt Ini Deleted.") See Also: IniDelete, IniItemizePvt, IniReadPvt, IniWritePvt 354 IniItemizePvt IniItemize Lists keywords or sections in WIN.INI. Syntax: IniItemize (section) Parameters: (s) section the major heading to itemize. Returns: (s) list of keywords or sections. IniItemize will scan the specified section in WIN.INI, and return a tab-delimited list of all keyword names contained within that section. Note: The WIN.INI is mapped to registry. IniItemize cannot accept a blank string "" to get all the section names. The INI files are mapped to the registry, and null section names are not valid for mapped INI files. Use the following instead: allsections=IniItemizePvt("","WIN.INI") message("All Sections", allsections) IniItemize returns the string "(NONE)" if the specified section does not exist. Case is not significant in section names. Example: ; Returns all keywords in the [Extensions] section keywords = IniItemize("Extensions") AskItemList("Keywords in [Extension] of in.INI",keywords, @tab, @sorted, @single, @false) See Also: IniDelete, IniItemizePvt, IniRead, IniWrite IniItemizePvt Lists keywords or sections in a private INI file. Syntax: IniItemizePvt (section, filename) Parameters: (s) section (s) filename the major heading to itemize. path and file name of the INI file. Returns: (s) list of keywords or sections. 355 IniRead IniItemizePvt will scan the specified section in a private INI file, and return a tabdelimited list of all keyword names contained within that section. If a null string ("") is given as the section name, IniItemizePvt will return a list of all section names contained within the file. It returns the string "(NONE)" if the specified section does not exist. Case is not significant in section names. Note: Path information must be specified if the INI file is not in the Windows directory. If there is no path information provided, then the INI file is assumed to be in the Windows directory (as shown by DirWindows(0) ) There is no distinction between an empty section and a section that doesn't exist. Example: ; Returns all keywords in the [Boot] section of SYSTEM.INI keywords = IniItemizePvt("Boot", "system.ini") Message("IniItemizePvt","Pvt Ini Itemized.") See Also: IniDeletePvt, IniItemize, IniReadPvt, IniWritePvt IniRead Reads data from the WIN.INI file. Syntax: IniRead (section, keyname, default) Parameters: (s) section (s) keyname (s) default the major heading to read the data from. the name of the item to read. string to return if the desired item is not found. Returns: (s) data from WIN.INI file. This function allows a program to read data from the WIN.INI file. The WIN.INI file has the form: [section] keyname=settings Most of the entries in WIN.INI are set from the Windows Control Panel program, but individual applications can also use it to store option settings in their own sections. Notes: INI files are mapped to registry. IniRead and IniReadPvt support strings up to 65,535 characters, if supported by the operating system. 356 IniReadPvt Example: ; Find the default output device a = IniRead("windows", "device", "No Default") Message("Default Output Device", a) See Also: Environment, IniDelete, IniItemize, IniReadPvt, IniWrite IniReadPvt Reads data from a private INI file. Syntax: IniReadPvt (section, keyname, default, filename) Parameters: (s) section (s) keyname (s) default (s) filename the major heading to read the data from. the name of the item to read. string to return if the desired item is not found. path and file name of the INI file. Returns: (s) data from the INI file. Looks up a value in the "filename" .INI file. If the value is not found, the "default" will be returned. Note: Path information must be specified if the INI file is not in the Windows directory. If there is no path information provided, then the INI file is assumed to be in the Windows directory (as shown by DirWindows(0) ). IniRead and IniReadPvt support strings up to 65,535 characters, if supported by the operating system. Example: ;IMPORTANT Path information must be specified if the ;INI file is not in the Windows directory. a=IniReadPvt("Main", "Lang", "English", "WB.INI") Message("IniReadPvt",a) Given the following segment from WB.INI: [Main] Lang=French The previous statement would return: French See Also: Environment, IniDeletePvt, IniItemizePvt, IniRead, IniWritePvt 357 IniWritePvt IniWrite Writes data to the WIN.INI file. Syntax: IniWrite (section, keyname, data) Parameters: (s) section (s) keyname (s) data major heading to write the data to. name of the data item to write. string to write to the WIN.INI file. Returns: (i) always 1. This command allows a program to write data to the WIN.INI file. The "section" is added to the file if it doesn't already exist. INI files may be mapped to to the registry. INI files are limited to 64K in size, on Windows 95/98 and ME. No real limit on other windows platforms. To force the INI updates to disk, add an additional IniWrite statement as follows: IniWrite("","","") Example: ; Change the list of pgms to load upon Windows loadprogs = IniRead("windows", "load", ""); startup newprogs = AskLine("Add Pgm To LOAD= Line", "Add:", loadprogs, 0) IniWrite("windows", "load", newprogs) See Also: IniDelete, IniItemize, IniRead, IniWritePvt IniWritePvt Writes data to a private INI file. Syntax: IniWritePvt (section, keyname, data, filename) Parameters: (s) section (s) keyname (s) data (s) filename major heading to write the data to. name of the data item to write. string to write to the INI file. path and file name of the INI file. Returns: (i) always 1. 358 InstallFile Writes a value in the "filename" .INI file. Notes: You cannot use this function to add or update any of the "Device=" entries in the [386Enh] section of SYSTEM.INI, because that section contains multiple entries with the same keyword. See BinaryPokeStr for an example on how to modify the device= lines of the SYSTEM.INI file. INI files are limited to 64K in size, on Windows 95/98 and ME. No real limit on other windows platforms. Path information must be specified if the INI file is not in the Windows directory. If there is no path information provided, then the INI file is assumed to be in the Windows directory (as shown by DirWindows(0) ) To force the INI updates to disk, add an additional IniWritePvt statement as follows: IniWritePvt("","","",filename) Example: IniWritePvt("Main", "Lang", "French", "MYFILE.INI") This would create the following entry in MYFILE.INI: [Main] Lang=French See Also: Binary Operations, BinaryPokeStr, IniDeletePvt, IniItemizePvt, IniReadPvt, IniWrite InstallFile Installs and uncompresses a file. Syntax: InstallFile(filename, targname, default-targdir, delete-old, flags) Parameters: (s) filename (s) targname (s) default-targdir (i) delete-old (i) flags source file to be installed. (path optional, short , 8.3 version required) the name of the target file to be created. (without path) directory where the file is to be installed. @TRUE - to delete existing same name files. @FALSE - to ignore existing same name files. 1 - shared file 2 - force install 359 InstallFile Returns: (s) "result|tempname", or "result|". When installing 32-bit image files (EXE's, DLL's, etc.), this function uses the version information embedded in the files to determine whether a file being installed is newer than an existing file with the same name. When installing any other type of file, which does not contain appropriate version information, this function uses the time stamps of the respective files instead. The return value is in the form: "result|tempname", or "result|" where "result" is the value returned by the "VerInstallFile" Windows API function; and "tempname" is the name of the temporary file that was created if the file could not be installed, or blank otherwise. "Default-targdir" is the directory where you want the file to be installed. The file will be installed to this directory, unless it is a shared file or a file with the same name already exists elsewhere. If "Delete-old" is @TRUE (or non-zero), and a file with the same name as the file being installed already exists, it will be deleted, even if it is located in a directory (on the path) other than the target directory. If "delete-old" is @FALSE, such a file will not be deleted. "Flags" specifies other optional flags that affect the operation of this function, combined with the OR ('|') operator. They are: 1 - shared file (file should be installed to a shared directory) 2 - force install (install file even if older than existing file) Note: InstallFile can uncompress files compressed by the Microsoft setup compress utility. The image version can only be interpreted by a corresponding platform version, i.e.. 32-bit images by a 32-bit platform. Example: InstallFile("a:\ctl3d.dl_", "ctl3d.dll", DirWindows(1), @TRUE, 1) ;or in the case of a long filename: InstallFile(FileNameShort("a:\carved stone.bm_"), "carved~1.bmp", DirWindows(0), @TRUE, 0) DirChange(DirWindows(0)) FileRename("carved~1.bmp", "carved stone.bmp") See Also: FileCopy, RegApp 360 IntControl Int Converts a floating point number or a string to an integer. Syntax: Int(x) Parameters: (s) x value to be converted. Returns: (i) an integer. Use this function to convert a floating point number or a string to an integer. If the argument is a string, it is first converted to a number- if possible. If the argument is a floating point number within integer range, it will be converted to the closest integer. Example: a=int(5.1) + int("123") Message("Result is", a) ; a= 5+123 = 128 See Also: IsInt, IsFloat, IsNumber IntControl Internal control functions. Syntax: IntControl (request#, p1, p2, p3, p4) Parameters: (i) request# (s) p1 - p4 Returns: (s) specifies which sub-function is to be performed (see below). parameters which may be required by the function (see below). varies (see below). Short for Internal Control, a special function that permits numerous internal operations in the various products. The first parameter of IntControl defines exactly what the function does, while the other parameters are possible arguments to the function. Refer to your product documentation for any further information on this function. Warning: Many of these operations are useful only under special circumstances, and/or by technically knowledgeable users. Some could lead to adverse side effects. If it isn't clear to you what a particular function does, don't use it. 361 IntControl IntControl (1, p1, p2, p3, p4) Just a test IntControl. It echoes back p1 & p2 and p3 & p4 in a pair of message boxes. Returns 1. IntControl (4, p1, 0, 0, 0) Controls whether or not the Dialog box with a file-list box.must have an item selected or not. p1 0 1 Meaning Allows no item to be selected. Returns "NOFILESSELECTED" An item must be selected. Returns a file name (default) IntControl (5, p1, 0, 0, 0) Controls whether system & hidden files or directories are seen and processed. p1 Meaning 0 System & Hidden files or directories not used (default) 1 System & Hidden files or directories seen and used Returns previous setting. IntControl (12, p1, p2, 0, 0) IntControl 12 is used to direct WIL and its parent application (if the parent application supports this function) as to how to handle users either terminating WinBatch via the "Ctrl-Break" keystroke sequence or perhaps a menu item, or by simply exiting windows. p1 includes one value from BOTH the Exit Windows value and the Terminate WIL value. 1) Exit Windows: Used to direct how and if Windows will exit. (choose one) p1 0 1 2 3 Meaning Pop up message box giving user a chance to either cancel bat file or continue. Allow Windows to be exited with no warning. Refuse any attempt to exit Windows and give optional warning. When p2 is not "" or "0", a message box will display p2. e.g. IntControl(12,2,"Attention! Close all apps first",0,0) Reserved 2) Terminate WIL: Used to direct WIL to allow itself to be terminated without 362 IntControl warning or to simply refuse any termination request (such as Ctrl-Break). (choose one) p1 0 Meaning Provide notification message when program terminated by user. Allow quiet termination. 4 Refuse to terminate. 8 p2 Codes: When the “Exit Windows” group code "2" is included in p1, p2 provides the message to display to the user. Use "" or "0" to clear any previously-set exit message. Returns previous setting. Example: ; We want to refuse any attempt to exit Windows until the WIL ; script is complete and also refuse any attempts to close the ; WIL script. IntControl(12,2|8,"Close Net apps before exiting Windows", 0, 0 ) Message("IntControl"," Done.") IntControl (20, 0, 0, 0, 0) Returns window handle of current parent window. (Similar to DllHwnd) IntControl (21, p1, 0, 0, 0) Returns window handle of window matching the partial window-name in p1. IntControl (22, p1, p2, p3, p4) Issues a Windows "SendMessage". IntControl 22 has been superceded with the functions SendMessageA and SendMessageW. IntControl (23, p1, p2, p3, p4) Issues a Windows "PostMessage" p1 p2 p3 p4 Window handle Message ID number (in decimal) wParam lParam - assumed to be numeric Returns @TRUE on success and @FALSE on failure 363 IntControl IntControl (26, 0, 0, 0, 0) Re-assesses the language currently being used and makes any necessary changes to the language strings used by the WIL Interpreter. Normally, this is done at program startup. IntControl(28, p1, 0, 0, 0) Selects system font used in list boxes. Note: this function only works for AskItemList,AskLine,AskPassword, and AskFileText type dialogs. It will not affect fonts in Dialog Editor created dialogs. p1 0 1 2 Meaning proportional font (default) fixed pitch font GUI font Note: that this option applies to AskLine, AskPassword, AskFileText and AskItemList Returns the current font type (0 or 1, as above) Note: If you use IntControl 28 to specify a fixed pitch font for list boxes, a fixed pitch font will now also be used for ITEMBOX controls in WIL dialogs. IntControl(29, p1, 0, 0, 0) Changes the default file delimiter. p1 New delimiter We have added the ability to change the file delimiter to a character of your own choosing, using the new IntControl 29. IntControl(29, " ", 0, 0, 0) ;makes file delimiter a SPACE Conversely, if you want to restore the TAB delimiter, you can use: IntControl(29, @TAB, 0, 0, 0) ;restores default TAB delimiter The first parameter for IntControl 29 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. IntControl(30, p1, p2, 0, 0) {*NT} Performs a delayed file move. 364 IntControl p1 p2 source file destination The file is not actually moved until the operating system is restarted. This can be useful for replacing system files. "Sourcefile" must be a single file name, with no wildcards. "Destination" may be a file name (which may contain wildcards) or a directory name. The destination file MUST be on the same drive as the source file. If the destination file exists, it will be replaced without warning. "Destination" can also be a NULL string (""), in which case the source file will be deleted when the operating system is restarted. This function returns "1" on success, "2" if it performed a regular FileMove instead, and "0" on failure. IntControl(31, 0, 0, 0, 0) Returns "Window ID's" for all Explorer windows. p1 0 1 Meaning Enumerate Explorer windows of class ExploreWClass. 32 bit Explorer windows of class CabinetWClass. Windows 7 64-bit and newer: Windows 7 no longer supports 32-bit Explorer windows. This function returns a tab-delimited list of Window ID's for all open Explorer windows.IntControl (32, address, data-type, operation, new-value) Returns or sets the contents of the memory location specified by "address". Parameters: (i) address (s) data type (i) operation (s/i) new-value address of a memory location. specifies the type of data to be retrieved: "BYTE" - returns a byte "WORD" - returns a word "LONG" - returns a long integer can be one of the following: value meaning 0 Read from memory 1 Write to memory specifies the value to be written to the memory location (if "operation" == 1). It must be a single character or integer, corresponding to "data-type". IntControl(33, p1, 0, 0, 0) Controls whether a listbox control in a dialog box allows multiple items to be selected. 365 IntControl p1 0 1 Meaning Single selection Multiple selection (default) Note: This function must be called before the dialog box is displayed. It cannot be used to modify an existing dialog. For example, you cannot call this function from a dialog callback procedure. Returns previous setting. IntControl(34, p1, p2, 0, 0) Returns the error message string which corresponds to the specified error. p1 {error number} -1 Meaning returns the error message string which corresponds to the specified error returns the error message string corresponding to the last extender error or user-defined error. Type of error passed. p2 0 1 Meaning WIL error code Windows error code Explanation of various parameters: p1 value {error number} {error number} -1 -1 p2 value 0 1 0 1 Result Returns WIL error string Returns Windows error string Returns WIL Extender error string Returns the last Windows error string Note: Windows Error codes are returned with a trailing carriage return line feed. IntControl(35, p1, p2, 0, 0) Slows down SendKey and/or mouse clicks. 366 p1 amount of time to delay between each keypress (SendKey, SendKeyChild, SendKeysto), in milliseconds. Default delay is 0 milliseconds. Set to zero to return to default. p2 amount of time to delay in MouseClick and MousePlay between pressing and releasing the mouse button for a single click (not a double-click), in milliseconds. Default is 0 (no delay). IntControl 1000 milliseconds = 1 second Specify a larger number to slow down, or a smaller number to speed up. Returns previous delay setting. IntControl(36, p1, p2, 0, 0) Waits until an application is waiting for user input. IntControl 36 has been superceded with the function WinWaitReady IntControl(37, p1, p2, p3, p4) Replaces multiple images in an icon group in an EXE file. Note: This function is now obsolete. Use IconReplace instead. IntControl( 38, p1, p2, 0, 0) Sets quiet mode. p1 -1 0 1 Meaning Don't change (just return current setting) Disable quiet mode (default). Enable quiet mode. p2 = error log filename, or a blank string ("") for no error log. In "quiet mode": 1. No error messages are displayed. If an error log filename is specified, then error messages will be written to that file. 2. You MUST set the "warning" parameter in any FileCopy or FileMove commands to @FALSE, or else a fatal error will occur. 3. Sounds that would normally be controlled by the Sounds function are suppressed. Returns previous setting. 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: p1 -1 0 Meaning don't change (keep current setting) prevent the file from being shared 367 IntControl 1 2 3 allow other open operations for read access allow other open operations for write access allow other open operations for read and write access IntControl 39 will affect the following functions: ArrayFileGet ArrayFileGetCsv BinaryRead BinaryReadEx FileCopy where the destination parameter is a port. FileCopyAttr where the destination parameter is a port. FileGet FileGetW FileOpen in "READ" mode. Returns previous setting. IntControl(40, p1, 0, 0, 0) Sets the file sharing mode for file writes. p1 share mode for file writes (default = 0) See IntControl 39 for a list of valid share modes. IntControl 40 will affect the following functions: ArrayFilePut ArrayFilePutCsv BinaryWrite BinaryWriteEx FileOpen in "WRITE" / "APPEND" modes. FilePut FilePutW Returns previous setting. IntControl(41, p1, 0, 0, 0) Controls YmdHms format returned by time functions. p1 0 1 -1 Meaning 2-digit year (YY:MM:DD:HH:MM:SS) 4-digit year (YYYY:MM:DD:HH:MM:SS) (default) Don't change (just return current setting) Note: The YY’s in the range 50 to 99 are assumed to be in the range 1950 to 1999. YY’s in the range 00 to 49 are assumed to be in the range of 2000 to 2049. 368 IntControl 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 the pointer to a binary buffer. p1 specifies the binary buffer (see BinaryAlloc). This returns the address of a pointer to a binary buffer. The address will be within the memory space of the WIL Interpreter. IntControl(43, p1, 0, 0, 0) Enable/disable "WaitForInputIdle". p1 0 1 -1 Meaning Don't wait for application to be ready. Wait for application to be ready (default). Don't change (just return current setting) This controls whether SendKey, SendKeysTo and SendKeysChild attempts to wait until the active application is ready to accept input before sending each keystroke. Returns the previous setting. IntControl(44, p1, 0, 0, 0) Returns 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) Enable/disable "SendKey speedup" in DOS programs in Windows NT. p1 -1 0 1 Meaning Don't change (returns current setting) Don't speed up SendKey in DOS programs in Windows NT. Speed up SendKey in DOS programs in Windows NT (default). Normally, SendKey, SendKeysTo and SendKeysChild yield processor time between keystrokes, allowing other Windows programs to multitask. However, when sending keystrokes to a DOS program in Windows NT, this yielding can result in excessive delays between keystrokes. When this occurs, SendKey goes into "speedup" mode and dominates the processors time. 369 IntControl SendKey speed is also affected by the delay inserted between keystrokes. By default, the delay between keystrokes is 25 milliseconds. This length can be adjusted with IntControl 35. However, when "SendKey speedup" mode is in effect, no such delay is inserted. IntControl 45 allows you to disable the "SendKey speedup" behavior in the case that it causes problems or is not desired. Returns previous setting. IntControl(46, p1, 0, 0, 0) Sets window retry timeout. p1 -1 0 secs Meaning Don't change (returns current setting) No retries The number of seconds to wait (default = 9) WIL functions which take a window title as a parameter (except for WinExist) and will wait up to 9 seconds for the specified window to appear. IntControl 46 allows the timeout setting to be changed. Returns previous setting. IntControl(47, p1, 0, 0, 0) Closes another WinBatch program. IntControl 47 has been superceded with the function TerminateApp. IntControl(48, p1, 0, 0, 0) Closes a DOS program. IntControl 48 has been superceded with the function TerminateApp. IntControl(49, p1, p2, 0, 0) Adds system menus to WIL popup windows. p1 specifies which popup windows will have system menus: p1 -1 0 1 370 Meaning Don't change (return current setting) No system menus (default). Dialog boxes (created with Dialog or the WIL Dialog Editor). Note: If using dialog callback procedure use DialogProcOption code 1002 instead. IntControl 2 3 Item listboxes (e.g., created with "AskItemList", "AskFileText" or related functions). Both Dialog boxes (1) and Item list boxes (2). p2 Specifies the value that a dialog box (created using the Dialog function) will return if the user closes the dialog without pressing one of the pushbuttons in the dialog (e.g., by pressing <Alt-F4>, or by clicking on the "Close" icon in the title bar) . If a dialog returns 0, processing will be transferred to the label in the script marked ":Cancel" (if any). IntControl 49 allows certain types of WIL popup windows to have system menus (the drop down menu of minimize/maximize options accessed via the small icon or box to the left side of a windows title bar). Returns previous setting of p1. IntControl(50, p1, p2, 0, 0) Controls whether "Go to web page" button is added to WIL error boxes. p1 -1 0 1 Meaning Don't change (return current setting) Remove "Go to web page" button from error boxes. Add "Go to web page" button to error boxes (default). When an error occurs in a WIL program an error message box is displayed. Prior to display, WIL checks the system to see if a Web browser has been configured; if so, a "Go to Tech Support Web Page" push-button is added to the error message box. When pressed, the button launches the Web browser and opens to the Wilson WindowWare Tech Support Web Page. IntControl 50 prevents the "Go to Tech Support Web Page" button from being added. Returns previous setting. p2 default user defined URL "http://www.winbatch.com/" "http://www.domain.com" p2 can specify the URL of the web page to be launched when the user clicks on the "Go to Tech Support Web Page" button. If p2 is "" or 0, no change is made to URL that is currently set. The default is: IntControl(50, 1, "http://techsupt.winbatch.com/", 0, 0) 371 IntControl IntControl(51, p1, 0, 0, 0) Specifies flags for CreateProcess. p1 one or more of the following flags, combined using the binary "OR" ("|") operator. The default setting is 32. 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. Returns previous setting Value 1 2 4 8 16 512 372 Flag Name/ Meaning 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. 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. 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. 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. 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. 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 IntControl 1024 2048 4096 67108864 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. CREATE_UNICODE_ENVIRONMENT If set, the environment block pointed to by lpEnvironment uses Unicode characters. If clear, the environment block uses ANSI characters. 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 Windowsbased 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. 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. 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 are 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: 373 IntControl Value 32 64 128 256 Flag Name/Meaning NORMAL_PRIORITY_CLASS Indicates a normal process with no special scheduling needs. 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. 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 CPUbound application can use nearly all available cycles. 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. IntControl(53, p1, 0, 0, 0) Set line terminator type for FileWrite. p1 -1 0 1 2 3 4 Terminator Don't change (just return current setting) No line terminator CR/LF (DOS) (default) LF (UNIX) CR (Macintosh) Tab Normally, FileWrite adds a carriage return and line feed (CR/LF) after writing each line to the file. This IntControl lets you select a different line terminator, or none at all, as specified by "p1". Returns previous setting. 374 IntControl IntControl(54, p1, p2, 0, 0) Keep window on top. IntControl 54 has been superceded with the function WindowOnTop. IntControl(56, p1, p2, p3, 0) Terminate an application. IntControl 56 has been superceded with the function TerminateApp. IntControl(58, p1, 0, 0, 0) Set system time. p1 new system time, in YmdHms format. This IntControl changes the time of the computer's system clock. Returns @TRUE on success, @FALSE on failure. IntControl(59, p1, p2, 0, 0) Sends a WM_SETTINGCHANGE message. This IntControl sends a message to one or all application windows, informing them that a change has been made to the registry. p1 handle p2 key Meaning window handle of the window to send the message to, or -1 for all top-level windows. Meaning name of the registry key that has been changed. Specify only the leaf node in the registry, not the whole path, but this will be applicationdependent. You can specify a blank string ("") to request that the application re-read all sections or keys that affect it. Returns @TRUE on success; @FALSE on error. IntControl(60, p1, p2, 0, 0) Sends a WM_DEVMODECHANGE message. This IntControl sends a message to one or all application windows, informing them that a change has been made to device mode settings. p1 handle Meaning window handle of the window to send the message to, or minus one (-1) for all top-level windows. 375 IntControl p2 device Meaning name of the device (as specified in the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\win.ini[Devices]) whose settings have been changed. Returns @TRUE on success; @FALSE on error. IntControl(61, p1, 0, 0, 0) Sets WinActivate() method. p1 -1 0 1 2 3 4 5 Method to use Don't change (just return current setting). Standard method (SetForegroundWindow API call). Switch to the window, then click on it. Iconize the window, then switch to it. Change foreground lock timeout. Attach to the input thread of the foreground window. Display invisible window, then attach to the input thread of the foreground window This IntControl lets you change the current method being used. Some methods may work with some particular windows and not others, so you may need to experiment. Note: The default WinActivate method used: 5 Windows 2000 and newer. 0 Previous versions of Windows Returns previous setting. IntControl(62, p1, 0, 0, 0) Sets dialog activation method. This IntControl lets you change the method used to activate dialog windows that are displayed by the WIL Interpreter. See IntControl 61 for more information. p1 -2 -1 0 1 2 376 Method to use Don't activate dialogs. Don't change (just return current setting). Standard method (SetForegroundWindow API call). Switch to the window, then click on it. Iconize the window, then switch to it. IntControl 3 4 5 Change foreground lock timeout. Attach to the input thread of the foreground window. Display invisible window, then attach to the input thread of the foreground window. Note: The default methods used: 5 Windows 2000 and newer. 0 Previous versions of Windows Returns previous setting. IntControl(63, p1, p2, p3, p4) Sets coordinates for AskFileText, AskItemList and AskTextBox windows. This function sets the window coordinates for the dialog displayed by the next AskFileText, AskItemList, AskTextBox function call. The coordinates will be reset to default values after the Ask[..] function is called. Note: This function is designed to enlarge dialogs. Reducing the size could produce unwanted output. Coordinates are based on a virtual 1000 x 1000 screen: p1 p2 p3 p4 = = = = left (upper-x) top (upper-y) right (lower-x) bottom (lower-y) To explicitly indicate that default values should be used, use: IntControl(63, 0, 0, 0, 0) Returns 1. IntControl(64, 0, 0, 0, 0) Gets the exit code returned by the last program run. This function gets the exit code (also known as the "errorlevel") that was returned by the program that was most-recently run using RunWait, RunShell or RunWithLogon with the @WAIT flag specified. If no program has been run, or if the last-run program was not run in @WAIT mode, this function will return 99999. IntControl (65, p1, 0, 0, 0) Sets maximum line length for FileRead. p1 specifies the maximum length of a line which can be read using the FileRead function, in bytes. This is also the number of bytes which are buffered internally with each file read operation. 377 IntControl The default is 4096. You can specify a value of 0, in which case file reads are not buffered internally, and the maximum line length is 1280 bytes (although this number is subject to change). p1 -1 -2 0 ## Meaning Don't change (just return current setting) (default) Smart size. By default, the allocated buffer size will be between 4K and 32K according to a "smart size" method, based on the file size Don't buffer file reads - max line length limited by generic buffer (currently 1280 bytes) Any other positive value specifies the actual buffer size This IntControl affects subsequent FileOpen commands, and has no effect on files which are already open. Returns previous setting. IntControl (66, 0, p2, 0, 0) Logs the user out of the current session. p2 0 1 Meaning default. Normal shutdown. User is prompted for open files. Force. Forces the restart of Windows by not giving notice to any running applications about the restart. This doesn't allow the applications to save information or to display shut down messages. Be very careful using IntControl(66,0,1,0,0) . This can cause the loss of data. Note: This function is not supported when run as a service. Returns 0. IntControl (67, 0, p2, 0, 0) Reboot system. p2 0 1 Meaning default. Normal shutdown. User is prompted for open files. Force. Forces the reboot of the system by not giving notice to any running applications about the reboot. This doesn't allow the applications to save information or to display shut down messages. Be very careful using IntControl(67,0,1,0,0). This can cause the loss of data. Note: This function is not supported when run as a service. Returns 0. 378 IntControl IntControl (68, 0, p2, p3, 0) This will cause a shutdown of the machine, awaiting power off. p2 0 1 Meaning default. Normal shutdown. User is prompted for open files. Force. Forces the reboot of the system by not giving notice to any running applications about the reboot. This doesn't allow the applications to save information or to display shut down messages. p3 0 1 2 Meaning Power-off if supported by the computer (*see note below*) Don't attempt to power-off Attempt to power-off in any case Note: We don't currently have a reliable method of determining if a computer supports the power-off feature, so 0 will attempt to do a power-off in any case. Be very careful using IntControl(68,0,1,0,0). This can cause the loss of data. Note: This function is not supported when run as a service. Returns 0. IntControl (69, p1, p2, 0, 0) Suspends machine by shutting power down. p1 0 1 p2 0 1 Meaning (NT or newer only) hibernate mode suspend mode Meaning Don't force apps to suspend. The function broadcasts a PBT_APMQUERYSUSPEND event to each application to request permission to suspend operation. Force apps to suspend. The function broadcasts a PBT_APMSUSPEND event to each application and driver, then immediately suspends operation This IntControl puts the system into standby mode, if supported by the hardware and device drivers. Note: This function is not supported when run as a service. IntControl (70, p1, p2, 0, 0) Set delay after WinWait[..] functions or PostMessage's. 379 IntControl p1 - specifies the delay, in milliseconds, after the type of operation specified by "p2".. p2 specifies the type of operation that the delay applies to: 0 "p1" specifies the delay after a successful WinWaitExist, WinWaitChild, or WinWaitClose. The default is 500 (ie, 1/2 second). Specify 0 for no delay. 1 "p1" specifies the delay after successful calls to the Windows PostMessage API (except when performing mouse clicks). The default is 100 (ie, 1/10 second). Specify 0 for no delay. Returns previous setting. IntControl(72, p1, p2, p3, 0) Sets Cancel handler. This IntControl lets you specify what should happen when the next Cancel event occurs in the script. p1 -1 0 1 2 3 Meaning Don't change (just return current setting) Exit on cancel processing (i.e., the script exits) Goto the label :CANCEL Gosub the label :CANCEL Call the UDF specified by p3 p2 @TRUE or @ FALSE. Specifies whether any existing "wberroradditionalinfo" data should be cleared first. This is a one-time flag, which gets reset to 0 after the next error occurs. p3 Name of the cancel handling UDF. The cancel handler UDF must be defined to accept exactly one parameter. The parameter it receives will be the "wberrorarray" array. None of the other WIL variables will be automatically set. The return value of the cancel handling UDF has special meaning. The following values may be specified: Value 0 1 2 3 380 Meaning (default) UDF handling is canceled. Continue handling cancel events with this UDF. Treat this cancel event as unhandled, and do normal cancel processing Treat this cancel event as unhandled, but continue handling cancel events with this UDF. IntControl If the cancel handler UDF is invoked during a variable assignment statement (eg, "variable = function()"), and you set wberrorarray[11] to a specific value inside the handler UDF, that value will be assigned to the variable (x). Note that this does not work for a property assignment. By default, the value assigned when a cancel occurs is 0. By default, if you don't use this IntControl at all, then every time a Cancel event occurs, WIL does a "Goto Cancel". The first time you use this IntControl, the behavior changes to being a one-time flag, which gets reset to 0 after the next Cancel event occurs. When processing goes to :CANCEL, the following WIL variables are automatically set: Variable wberrorhandlerline wberrorhandleroffset wberrorhandlerassignment wberrorhandlerfile wberrortextstring wberroradditionalinfo wberrorinsegment wberrorhandlerlinenumber wberrorarray Meaning (s) Cancel line (i.e., line in script that caused Cancel) (i) offset into script of Cancel line, in bytes (s) variable being assigned on Cancel line, or "" if none (s) name of the currently-executing script (s) description of the WIL error (s) delimited string of additional error information, if any. ASCII 160 is delimiter character between each error incident. (s) name of the currently-executing UDF, or a blank string ("") if not in a UDF. (i) line number in the currently executing script or 0 if the cancel cannot be matched to a particular line. (a) WIL array with the following elements: wberrorarray[0]= LastError() wberrorarray[1]= wberrorhandlerline wberrorarray[2]= wberrorhandleroffset wberrorarray[3]= wberrorhandlerassignment wberrorarray[4]= wberrorhandlerfile wberrorarray[5]= wberrortextstring wberrorarray[6]= wberroradditionalinfo wberrorarray[7]= wberrorinsegment wberrorarray[8]= wberrorhandlerlinenumber wberrorarray[9]= line number in the UDF where the cancel occurred or 0. wberrorarray[10]= a positive number if reported line numbers are accurate, zero (0) if possibly inaccurate or -1 if run from WinBatch Studio, in which case both wberrorarray[8] and wberrorarray[9] will contain the line number of 381 IntControl the cancel in the UDF. wberrorarray[11]= Used only with cancel handler UDF method to set return value of the function the cancel occurred on.. Note: The :CANCEL label must be in the same script where the Cancel event occurred. If a Cancel event occurs in a called script, it will go to the label in the called script, not the calling script. If you want to have cancel handling in a User Defined Function/UserDefined Subroutine, then IntControl 72 must either: 1) Be defined within the User Defined Function/User Defined Subroutine. The :CANCEL label must also be contained within the User Defined Function/User Defined Subroutine. 2) Or p1 must be the value of 3 and p3 must specify the name of the cancel handler UDF. Returns previous setting, or -1 if the setting had not previously been changed from the default behavior. IntControl(73, p1, p2, p3, 0) Sets Error handler. This IntControl lets you specify what should happen when the next error occurs in the script. p1 -1 0 1 2 3 Meaning Don't change (just return current setting) Normal error processing (default) Goto the label :WBERRORHANDLER Gosub the label :WBERRORHANDLER Call the UDF specified by p3 p2 @TRUE or @ FALSE. Specifies whether any existing "wberroradditionalinfo" data should be cleared first. This is a one-time flag, which gets reset to 0 after the next error occurs. p3 Name of the error handling UDF. The error handler UDF must be defined to accept exactly one parameter. The parameter it receives will be the "wberrorarray" array. None of the other WIL variables will be automatically set. The return value of the error handling UDF has special meaning. The following values may be specified: Value 0 382 Meaning (Default) UDF error handling is canceled. IntControl 1 2 3 Continue handling error events with this UDF. Treat this error event as unhandled, and do normal error processing Treat this error event as unhandled, but continue handling errors with this UDF. If the error handler UDF is invoked during a variable assignment statement (eg, "variable = function()"), and you set wberrorarray[11] to a specific value inside the handler UDF, that value will be assigned to the variable (x). Note that this does not work for a property assignment. By default, the value assigned when an error occurs is 0. When processing goes to :WBERRORHANDLER, the following WIL variables are automatically set: Variable wberrorhandlerline wberrorhandleroffset wberrorhandlerassignment wberrorhandlerfile wberrortextstring wberroradditionalinfo wberrorinsegment wberrorhandlerlinenumber wberrorarray Meaning (s) Error line (i.e., line in script that caused Error) (i) offset into script of error line, in bytes (s) variable being assigned on error line, or "" if none (s) name of the currently-executing script (s) description of the WIL error (s) delimited string of additional error information, if any. ASCII 160 is delimiter character between each error incident. (s) name of the currently-executing UDF, or a blank string ("") if not in a UDF. (i) line number in the currently executing script or 0 if the error cannot be matched to a particular line. (a) WIL array with the following elements: wberrorarray[0]= LastError() wberrorarray[1]= wberrorhandlerline wberrorarray[2]= wberrorhandleroffset wberrorarray[3]= wberrorhandlerassignment wberrorarray[4]= wberrorhandlerfile wberrorarray[5]= wberrortextstring wberrorarray[6]= wberroradditionalinfo wberrorarray[7]= wberrorinsegment wberrorarray[8]= wberrorhandlerlinenumber wberrorarray[9]= line number in the UDF where the error occurred or 0. wberrorarray[10]= a positive number if reported line numbers are accurate, zero (0) if possibly inaccurate or 1 if run from WinBatch Studio, in which case both wberrorarray[8] and wberrorarray[9] will contain the line number of the error in the UDF. wberrorarray[11]= Used only with error handler UDF method to set return value of the function the error occurred on. 383 IntControl Note: The :WBERRORHANDLER label or User Defined Function/User Defined Subroutine must be in the same script where the error occurred. If an error occurs in a called script, it will go to the label in the called script, not the calling script. If you want to have error handling occur in a User Defined Function / User Defined Subroutine, then IntControl 73 must be defined with in the User Defined Function/User Defined Subroutine. Returns previous setting. Example: IntControl(73,2,0,0,0) a=5 b=c+7 Message(a,b) exit :WBERRORHANDLER Error=LastError() Message("LastError Value is",Error) Message("wberrorhandlerline",wberrorhandlerline) Message("wberrorhandleroffset",wberrorhandleroffset) Message("wberrorhandlerassignment",wberrorhandlerassignment) Message("wberrorhandlerfile", wberrorhandlerfile) Message("wberrortextstring", wberrortextstring) Message("wberroradditionalinfo", wberroradditionalinfo) Message("wberrorinsegment", wberrorinsegment) Message("wberrorhandlerlinenumber", wberrorhandlerlinenumber) %wberrorhandlerassignment%="eeek" return See Also: IntControl 34 IntControl(74, p1, 0, 0, 0) Set idle wait after Run commands. (32-bit only) p1 specifies the amount of time, in milliseconds, that the WIL Interpreter will wait, after launching an application with the Run (and similar) commands, for the application to become "idle" (i.e., ready for user input). The default is 10000 (i.e., 10 seconds). Specify 0 for no idle wait. Returns previous setting. See Also: IntControl 43 384 IntControl IntControl(75, p1, 0, 0, 0) Gets last dialog coordinates. p1 1 2 Meaning Returns last X coordinate Returns last Y coordinate This IntControl returns the X or Y coordinate of the most recently displayed dialog (created with the Dialog function), at the time the previous dialog was closed. Coordinates are in dialog units. Returns -1 if there was no previous dialog. IntControl(76, p1, 0, 0, 0) Sets the computer name. IntControl 76 has been superceded by the function ComputerNameSet. IntControl(77, p1, 0, 0, 0) Gets internal operating parameters. This IntControl returns internal values which may be useful in script debugging. p1 specifies one of the following request codes: Request 0 10 11 12 20 21 30 31 40 41 42 50 51 60 62 70 71 72 Meaning total memory allocated for strings, in bytes number of variables assigned number of variable slots available tab-delimited list of variables assigned number of files open number of file slots available number of binary buffers open number of binary buffer slots available number of extenders loaded number of extender slots available tab-delimited list of extenders loaded number of extender functions loaded number of extender function slots available number of COM/OLE objects open tab-delimited list of COM/OLE objects current structure depth current structure slots remaining line feed-delimited list of tab-delimited structure stack 385 IntControl information current Call level depth number of UDF's defined number of UDF slots available tab-delimited list of WIL function table entries tab-delimited list of parent application function table entries tab-delimited list of loaded extender function table entries tab-delimited list of UDF's number of DDE conversations open number of DDE conversations available 80 90 91 100 101 102 103 110 111 Requests 100, 101 and 102 return a tab-delimited list of table entries. Each entry consists of a list of fields delimited with an ASCII 255 character, as follows: Item 1 2 3 4 5 6 Value Index Entry Type Type Value 0 BINARYOP 1 UNARYOP 2 FUNCTION 3 CONSTANT 4 COMMAND 5 COMPOP 6 FUNCTBYNAME 7 UNDEFINED 8 STRUCTOP Parameter type mask Parameter count OR constant value Name length Name Returns the indicated integer or string. IntControl (78, 0, 0, 0, 0) Frees all UDF's. This IntControl frees (undefines) all user-defined functions. It cannot be used while a User-Defined Function is currently executing. Returns the number of User-Defined Function's that were freed. 386 IntControl IntControl (79, p1, p2, p3, 0) Causes a user-defined error. IntControl 79 has been superceded with the function ErrorEvent IntControl(80, 0, 0, 0, 0) Waits until no keys on the keyboard are pressed. Returns 1. IntControl (81, p1, 0, 0, 0) Sets seed for the Random function. This IntControl sets the seed value used in subsequent calls to Random. p1 - seed value or control value p1 -1 (Control Value) 1 (Control Value) Other positive numbers (Seed Value) Other negative numbers (Seed Value) Meaning Reseed the random number generator with a WIL generated seed value. The WIL generated seed value has various time based components and will change many times in one second. Allow the run time library to select a seed. This may allow a predictable pattern to the generated numbers Use provided value for the seed. This will allow a predictable pattern to the generated numbers Undefined results Note: Providing a fixed seed value in a program will result in a predictable pattern to the generated numbers. This is often used for program debugging. For normal programs, it is recommended that either the default WIL-generated seed value be used or that a provided seed value have a truly random or timebased component so that the pseudo-random numbers generated are more difficult to predict. Returns 1 IntControl(84, p1, 0, 0, 0) Itemize desktops, or windows on specified desktop. (Windows NT or newer only) If p1 is a blank string (""), this returns a tab-delimited list of desktops, or a blank string ("") if the function fails. 387 IntControl If p1 specifies a desktop name, this returns a tab-delimited list of "Window ID's" of all top-level windows on that desktop, or a blank string ("") if the function fails. IntControl(87, p1, 0, 0, 0) Sets Execute recovery mode. This specifies what should happen if the Execute command causes an error. p1 -1 0 1 2 Meaning Don't change (just return current setting) Display a dialog with an option to continue or cancel. Display a notification dialog then continue. Continue automatically without displaying a dialog. Returns the previous setting. See Also: Execute IntControl (91, p1, 0, 0, 0) Sets file mask matching mode. p1 0 1 2 Meaning Only match long version of file names (default). Match long and short versions of file names. Only match long version of file names, using alternate method (PathMatchSpec API). This controls the behavior of functions which take file masks. By default, masks only match the long version of the file name. For example, if you do FileItemize("*.htm"), it will not match a file "home.html" whose short name is "home~1.htm". If you want it to match the short version of the file name as well, set "p1" to 1. Returns the previous setting. IntControl(92, operation, value, 0, 0) (64-bit Windows only) Disables or reverts file system redirection when running in WOW64 (32-bit emulation under 64-bit Windows). "operation" may be either "Disable" or "Revert". If "operation" is "Disable", file system redirection is disabled, and the function returns a value that should be specified on a subsequent "Revert" operation. "Value" should be set to 0. 388 IntControl If "operation" is "Revert", file system redirection is reverted to the state specified by "value", which should be the result of a previous "Disable" operation. Returns a non-zero value on success. Returns a value as specified above, or -1 on error. Example: oldvalue = IntControl( 92, "disable", 0, 0, 0 ) ret = FileExist( "C:\Windows\System32\cmd.exe" ) IntControl( 92, "revert", oldvalue, 0, 0 ) IntControl (93, p1, p2, p3, 0) Performs certificate operations. p1 0 1 2 Meaning Sign a file (Windows XP/Vista only) p2 specifies a tab-delimited string with the following five parameters: • file to sign • certificate friendly name • description of file being signed (can be "" if not needed) • location (URL) of information about file (can be "" if not needed) • URL of timestamp server (can be "" if not needed) Get the thumbprint of a certificate in a file p2 specifies a .CER or .SPC file Set the friendly name of a certificate p2 specifies the thumbprint of a certificate p3 specifies the friendly name to set IntControl(1000, p1, 0, 0, 0) Sets the exit code returned by WinBatch. p1 exit code This specifies the value returned by WinBatch's "WinMain" (entry point) function. Returns the previous setting. IntControl(1001, p1, 0, 0, 0) Set service process status. 389 IntControl p1 0 1 Meaning Run as a normal application (default). Run as a service. If WinBatch is running as a service, it will not be closed when the user logs out. Windows NT and newer: It is not necessary to use IntControl 1001 in order to run a WinBatch service, but doing so will not hurt. To create a compiled WinBatch program that will run as a native service under Windows NT or newer: compile the WinBatch script as usual using the WinBatch Compiler, but specify an output file with an extension of ".EXS" instead of ".EXE". Alternatively, you can simply rename an existing WinBatch program by changing its extension from ".EXE" to ".EXS". You can install a WinBatch service (or any service) using the Win32 Network Extender function wntSvcCreate. See the WinBatch help file for further details on running a WinBatch script as a NT native service. Returns @TRUE on success, @FALSE on failure. IntControl(1002, p1, 0, 0, 0) Sets WinBatch icon display state. p1 -1 0 1 Meaning Don't change (returns current setting) Hide WinBatch icon. Show WinBatch icon (default). This function sets the display state of the WinBatch icon for the duration of the script. The default display state is minimized. This IntControl is equivalent to using WinShow or WinHide on the current WinBatch window. However, WinShow and WinHide do not have the capability of hiding the icon permanently. If any Box[..] functions are used to display information, the WinBatch icon will return to its previous display state. Returns previous setting. IntControl(1003, p1, 0, 0, 0) Prevents the WinBatch icon from being opened. This function sets the "open-able" flag for the WinBatch icon. If the flag is on (default), then the WinBatch icon can be opened (restored) to a normal window by clicking on the icon. If the flag is off, then it is not possible to open the WinBatch icon by any method, including WinShow or BoxOpen. 390 IntControl p1 -1 0 1 Meaning Don't change (returns current setting) WinBatch icon cannot be opened. WinBatch icon can be opened (default). Returns previous setting. IntControl(1004, 0, 0, 0, 0) Returns the path and 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. IntControl(1006, 0, 0, 0, 0) Returns the un-parsed WinBatch command line. This returns the actual command line string that WinBatch was launched with. Example: ; get un-parsed WinBatch command line rc = IntControl(1006, 0, 0, 0, 0) Message("Un-parsed Command Line String =", rc) IntControl (1007, p1, p2, p3, p4) Add/remove/check tray icon. p1 Parameters Meaning Notes 0 p2, p3, p4 ignored Check whether tray icon has been clicked (and reset "clicked" state) This function will return one of the following values: Val Meaning 0 Not clicked 1 Left click 2 Right click Note: Each time you call this function the "click state" will be reset to 0 (not clicked). 1 p2 = 1 or 2 p3 = tool tip p4 = icon file Add currently-running script to the system tray p2 can be one or more of the following flags, combined with the binary OR ("|") operator: Val Meaning 1 Hide regular WinBatch icon while the icon is in the system tray 2 Suspend script until user clicks on the tray icon. The WinBatch script will be suspended until the user clicks on the tray icon, at which 391 IntControl point the script will continue, and this function will return one of the click values. Otherwise, the WinBatch script will continue running, and you can periodically check to see whether the user has clicked on the tray icon by calling this function with p1 == 0. 2 p2, p3, p4 ignored Remove currentlyrunning script from the system tray 3 p2 = timeout value in milliseconds after which the script will automatically continue. If 0, there is no timeout. p3, p4 ignored Suspend script until user clicks on the tray icon This can be used at any point after a WinBatch script has already been placed in the tray. When the user clicks on the tray icon, it will return one of the click values as listed for p1 == 0. 4 p2 = 1 or 2 p3 = tool tip p4 = icon resource Modify currentlyrunning script in the system tray p2 can be one or more of the following flags, combined with the bitwise OR ("|") operator: Val Meaning 1 Modify tool tip (p3 specifies the new tool tip) 2 Modify icon (p4 specifies the new icon file) p3 can be the tool tip (i.e., string that is displayed when the mouse passes over the tray icon), or "" for none. p4 can be icon file, or "" for the default icon. If a file name is specified, it can be a .ICL file (icon library), or an .EXE or .DLL (or similar resource file) containing icons. If it is a resource containing multiple icons, by default the first icon in the file is used. You can specify a different icon using the following format: "filename|#" where "filename" is the name of the file, followed by a vertical bar and then the index of the desired icon in the file ("#"). The first icon in a file has an index of 0. If an invalid icon file is 392 IntControl specified, the default icon will be used. Note: The icon resource must contain multiple images if you want to specify an index greater than zero. Returns @TRUE (success) or @FALSE (failure), or a click value. Example: ;This intcontrol puts script in systray and hides icon on taskbar IntControl(1007, 1, 1, "YooHoo", "") while 1 ;This intcontrol Suspends the script ;until user clicks on the tray icon IntControl(1007, 3, 1, "", "") Pause("BEEEP","Icon was clicked") ;do stuff here endwhile exit IntControl(1008, p1, 0, 0, 0) Enables/disables Close command. This function sets the "allow close" flag for the WinBatch icon/window. By default, the "Close" item on the control menu and the "Close" icon to the right of the window title are grayed out, and WinBatch does not respond to WM_CLOSE messages sent by applications. Using this IntControl, you can enable all these, in which case the Close command behaves the same as the existing Terminate/Ctrl-Break command. p1 -1 0 1 Meaning Don't change (just return current setting) Close command is disabled (default). Close command is enabled. Returns previous setting. Example: IntControl(12, 1+4, 0, 0, 0) ;Close Quietly IntControl(1008, p1, 0, 0, 0) ;Enable Close button IntControl(1009, p1, 0, 0, 0) Gets name of current service. If the current script is running as a service, this function returns the name of the service. Otherwise it returns a blank string (""). "p1" specifies which name to return: 393 IsFloat p1 0 1 Meaning Returns the service name (the actual registry key name) Returns the display name (the name shown in Control Panel) Example: svcname = IntControl(1009, 0, 0, 0, 0) Message("Service name",svcname) IsDefined Determines if a variable name is currently defined. Syntax: IsDefined (var) Parameters: (s / a) var Returns: (i) a variable name. @YES if the variable is currently defined; @NO if it was never defined or has been dropped; -1 if the specified name is a function name or other reserved word. A variable is defined the first time it appears to the left of an equal sign in a statement. It stays defined until it is explicitly dropped with the Drop function, or until the current invocation of the WIL Interpreter gets closed. Generally speaking: in batch file-based implementations of WIL, all variables are dropped automatically at the end of every batch file; and in menu-based implementations of WIL, variables stay defined until explicitly dropped. IsDefined can accept an array name as a parameter. Example: if IsDefined(thisvar) Message("Value of thisvar is", thisvar) else Message("ERROR!", "Variable not defined") endif See Also: Drop, DropWild, VarType IsFloat Tests whether a variable can be converted to a floating point number. 394 IsInt Syntax: IsFloat(x) Parameters: (s) x Returns: (i) value to be tested. @TRUE if the data can be converted to a floating point number; @FALSE if the data cannot be converted to a floating point number. Use this function to test whether a variable can be converted into a floating point number. Example: A=IsFloat(4) Message("Is 4 a floating point number", A) B=IsFloat("Hamburger") Message(‘Is "Hamburger" a floating point number’, B) C=IsFloat(4.5) Message("Is 4.5 a floating point number", C) See Also: IsInt, IsNumber IsInt Tests whether a variable is or can be converted into a valid integer. Syntax: IsInt(x) Parameters: (s) x Returns: (i) value to be tested. @TRUE if the data is or can be converted to a valid integer; @FALSE if the data is not or cannot be converted to a valid integer. Use this function to test whether a variable can be converted into a valid integer. Example: A=IsInt(4) Message("Is 4 an integer", A) B=IsInt("Hamburger") Message('Is "Hamburger" an integer', B) C=IsInt(4.5) Message("Is 4.5 an integer", C) 395 IsLicensed See Also: IsFloat, IsNumber IsKeyDown Tells about keys/mouse. Syntax: IsKeyDown(keycodes) Parameters: (i) keycodes @SHIFT and/or @CTRL. Returns: (i) @YES if the key is down; @NO if the key is not down. Determines if the Shift key or the Ctrl key is currently down. Note: The right mouse button is the same as Shift, and the middle mouse button is the same as Ctrl. Examples: IsKeyDown(@SHIFT) IsKeyDown(@CTRL) IsKeyDown(@CTRL | @SHIFT) IsKeyDown(@CTRL & @SHIFT) Message("IsKeyDown","Key Is Down.") See Also: WaitForKey IsLicensed Tells if the calling application is licensed. Syntax: IsLicensed ( ) Parameters: (none) Returns: (i) @YES if it is licensed; @NO if it is not licensed. Returns information on whether or not the currently-running version of the calling application is a licensed copy. Example: a=IsLicensed( ) If a == @TRUE Message("IsLicensed","It's Licensed.") 396 ItemCount else Message("IsLicensed","No, it's not licensed.") endif See Also: Version, VersionDLL IsNumber Tests whether a variable is or can be converted into a valid number. Syntax: IsNumber(x) Parameters: (s) x Returns: (i) value to be tested @TRUE if the data is or can be converted to a valid number; @FALSE if the data is not or cannot be converted to a valid number. Use this function to test whether a variable can be converted into a valid number, either an integer or a floating point number. Example: A=IsNumber(4) Message("Is 4 a number", A) B=IsNumber("Hamburger") Message('Is "Hamburger" a number', B) C=IsNumber(4.5) Message("Is 4.5 a number", C) See Also: IsFloat, IsInt ItemCount Returns the number of items in a list. Syntax: ItemCount (list, delimiter) Parameters: (s) list (s) delimiter a string containing a list of items. a character to act as a delimiter between items in the list. Returns: (i) the number of items in the list. 397 ItemCountCsv Note: leading and trailing delimiters are significant. This means that the commadelimited list "a,b,c," has 4 items in it. A single item null list ("") is not a valid list. Example: a = FileItemize("*.*") n = ItemCount(a, @TAB) Message("Note", "There are %n% files") See Also: ItemCountCsv, ItemExtract, ItemExtractCsv, ItemInsert, ItemLocate, ItemRemove, ItemReplace, ItemSort, Lists Explained ItemCountCsv Returns the number of items in a Comma Separated Values line. Syntax: ItemCountCsv (line, flags [, delimiter]) Parameters: (s) line (i) flags (s)delimiter specifies a Comma Separated Values line (see below). can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value Meaning 1 treat leading and trailing whitespace as significant [optional] specifies the character used to separate values in the line. It can be any single character except a space, null, carriage return, line feed or quotation mark (double quote). If omitted, a comma will be used as the delimiter. Returns: the number of items in the Comma Separated Value line. This function is like ItemCount, but instead of a list, it counts items in a CSV line. A CSV ("comma separated values") line consists of comma-delimited items. Items may optionally be enclosed in quotation marks (aka, "double quotes"). There are two cases where an item *must* be enclosed in quotation marks: (1) If the item contains a comma (2) If the item contains a quotation mark Here are some examples: 398 ItemExtract 1,2,3,4,5 "January","February","March" "Doe, John",20 In order to embed a quotation mark in an item, you must replace it with two quotation marks (i.e., add an extra quotation mark). For example, you would specify the item "My Fair Lady" (with quotes) as: """My Fair Lady""" Each quotation mark is doubled, and the entire item is enclosed in a set of quotation marks. Normally, whitespace outside of quoted strings is ignored. The following two lines would be considered identical: A,B,C A, B, C But if you specify a "flags" value of 1, then the whitespace will be considered part of the items. Whitespace *inside* a quoted string is always preserved, regardless of the "flags" value: " This line has spaces around it " Similarly, whitespace outside of a quoted string is always ignored. i.e., the following two lines are considered identical, regardless of the "flags" value "String 1","String 2","String 3" "String 1", "String 2", "String 3" Example: line = '"January","February","March"' n = ItemCountCsv(line, 0, ",") Message("Note", "There are %n% items in this CSV line") See Also: ItemCount, ItemExtract, ItemExtractCsv, ItemInsert, ItemLocate, ItemRemove, ItemReplace, ItemSort, Lists Explained ItemExtract Returns the selected item from a list. Syntax: ItemExtract (index, list, delimiter) Parameters: (i) index (s) list (s) delimiter the position in list of the item to be selected. a string containing a list of items. a character to act as a delimiter between items in the list. 399 ItemExtractCsv Returns: (s) the selected item. Note: Using -1 as the index will return the last item in the list. A single item null list ("") is not a valid list. Example: DirChange(DirWindows(0)) bmpfiles = FileItemize("*.bmp") bmpcount = ItemCount(bmpfiles, @TAB) pos = (Random(bmpcount - 1)) + 1 paper = ItemExtract(pos, bmpfiles, @TAB) Wallpaper(paper, @FALSE) Message("ItemExtract","Wallpaper changed to %paper% - not tiled") See Also: ItemCount, ItemCountCsv, ItemExtractCsv, ItemInsert, ItemLocate, ItemRemove, ItemReplace, ItemSort, Lists Explained ItemExtractCsv Returns the selected item from a CSV line. Syntax: ItemExtractCsv (index, line, flags [, delimiter]) Parameters: (i) index (s) line (i) flags (s) delimiter Returns: (s) the ordinal position of the item to be returned. a CSV line (see below). can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value Meaning 1 treat leading and trailing whitespace as significant [optional] specifies the character used to separate values in the line. It can be any single character except a space, null, carriage return, line feed or quotation mark (double quote). If omitted, a comma will be used as the delimiter. the selected item. This function is like ItemExtract, but instead of a list, it extracts items from a CSV line. A CSV ("comma separated values") line consists of comma-delimited items. Items may optionally be enclosed in quotation marks (aka, "double quotes"). 400 ItemExtractCsv There are two cases where an item *must* be enclosed in quotation marks: (1) If the item contains a comma (2) If the item contains a quotation mark Here are some examples: 1,2,3,4,5 "January","February","March" "Doe, John",20 In order to embed a quotation mark in an item, you must replace it with two quotation marks (i.e., add an extra quotation mark). For example, you would specify the item "My Fair Lady" (with quotes) as: """My Fair Lady""" Each quotation mark is doubled, and the entire item is enclosed in a set of quotation marks. Normally, whitespace outside of quoted strings is ignored. The following two lines would be considered identical: A,B,C A, B, C But if you specify a "flags" value of 1, then the whitespace will be considered part of the items. Whitespace *inside* a quoted string is always preserved, regardless of the "flags" value: " This line has spaces around it " Similarly, whitespace outside of a quoted string is always ignored. i.e., the following two lines are considered identical, regardless of the "flags" value "String 1","String 2","String 3" "String 1", "String 2", "String 3" The function returns the selected item, with any enclosing quotes removed, and any doubled quotation marks converted to normal quotation marks. Leading and trailing whitespace may be stripped out, as described above. Example: line = '"January","February","March"' count = ItemCountCsv(line, 0, ",") For x = 1 to count item = ItemExtractCsv(x,line,0, ",") Message(StrCat("Item number ",x),item) Next See Also: ItemCount, ItemCountCsv, ItemExtract, ItemInsert, ItemLocate, ItemRemove, ItemReplace, ItemSort, Lists Explained 401 ItemLocate ItemInsert Adds an item to a list. Syntax: ItemInsert (item, index, list, delimiter) Parameters: (s) item (i) index (s) list (s) delimiter a new item to add to list. the position in list after which the item will be inserted. a string containing a list of items. a character to act as a delimiter between items in the list. Returns: (s) new list, with item inserted. This function inserts a new item into an existing list, at the position following index. It returns a new list, with the specified item inserted; the original list (list) is unchanged. For example, specifying an index of 1 causes the new item to be inserted after the first item in the list; i.e., the new item becomes the second item in the list. You can specify an index of 0 to add the item to the beginning of the list, and an index of -1 to append the item to the end of the list. Note: trailing delimiters are significant. This means that if you specify a blank item ("") and an offset of -1, a blank item will be added to the end of the list, even if the list already has a trailing delimiter. Example: item="apricots" list="apples pears oranges grapes" newlist = ItemInsert(item, -1, list, " ") message("List after ItemInsert", newlist) See Also: ItemCount, ItemCountCsv, ItemExtract, ItemExtractCsv, ItemLocate, ItemRemove, ItemReplace, ItemSort, Lists Explained ItemLocate Returns the position of an item in a list. Syntax: ItemLocate (item, list, delimiter) Parameters: (s) item (s) list (s) delimiter 402 item to search for in list. (this is case sensitive) a string containing a list of items. a character to act as a delimiter between items in the list. ItemRemove Returns: (i) position in list of item, or 0 if no match found. This function finds the first occurrence of item in the specified list, and returns the position of the item (the first item in a list has a position of 1). If the item is not found, the function will return a 0. A single item null list ("") is not a valid list. Example: list="apples pears oranges grapes" index=ItemLocate("oranges", list, " ") message("The item is located at index #", index) See Also: ItemCount, ItemCountCsv, ItemExtract, ItemExtractCsv, ItemInsert, ItemRemove, ItemReplace, ItemSort, Lists Explained ItemRemove Removes an item from a list. Syntax: ItemRemove (index, list, delimiter) Parameters: (i) index (s) list (s) delimiter the position in list of the item to be removed. a string containing a list of items. a character to act as a delimiter between items in the list. Returns: (s) new list, with item removed. This function removes the item at the position specified by index from a list. The delimiter following the item is removed as well. It returns a new list, with the specified item removed; the original list (list) is unchanged. Note: Using -1 as the index will remove the last item in the list. A single item null list ("") is not a valid list. Example: Exlist="apples pears oranges grapes" index=ItemLocate("oranges", list, " ") newlist = ItemRemove(index, list, " ") message("List after item is removed", newlist) See Also: ItemCount, ItemCountCsv, ItemExtract, ItemExtractCsv, ItemInsert, ItemLocate, ItemReplace, ItemSort, Lists Explained 403 ItemSort ItemReplace Replaces an item in a list. Syntax: ItemReplace (item, index, list, delimiter) Parameters: (s) item (i) index (s) list (s) delimiter replacement item. the position in list of the item to be replaced. a string containing a list of items. a character to act as a delimiter between items in the list. Returns: (s) new list, with item replaced. This function replaces an item in a list with a new item. It returns a new list, with the specified replacement made; the original list ("list") is unchanged. For example, specifying an index of 1 causes the first item in the list to be replaced with the new item ("item"). Note: Using -1 as the index will replace the last item in the list. A single item null list ("") is not a valid list. Example: list="apples pears oranges grapes" index=ItemLocate("oranges", list, " ") newlist = ItemReplace("tangerine", index, list, " ") message("List after item is replaced", newlist) See Also: ItemCount, ItemCountCsv, ItemExtract, ItemExtractCsv, ItemInsert, ItemLocate, ItemRemove, ItemSort, Lists Explained ItemSort Sorts a list. Syntax: ItemSort (list, delimiter) Parameters: (s) list (s) delimiter a string containing a list of items. a character to act as a delimiter between items in the list. Returns: (s) new, sorted list. 404 KeyToggleSet This function sorts a list, using an "ANSI Collating Sequence" sort, also known as a "dictionary sort".. It returns a new, sorted list; the original list is unchanged. A single item null list ("") is not a valid list. Example: list=" one two three four " newlist = ItemSort(list, " ") message("List generated by ItemSort", newlist) See Also: ItemCount, ItemCountCsv, ItemExtract, ItemExtractCsv, ItemInsert, ItemLocate, ItemRemove, ItemReplace, Lists Explained KeyToggleGet Returns the status of a toggle key. Syntax: KeyToggleGet(@key) Parameters: (i) @key Returns: (i) the toggle key in question. Values may be one of: @CAPSLOCK for the CapsLock key @NUMLOCK for the NumLock key @SCROLLLOCK for the ScrollLock key @ON key was set; @OFF key was unset. Use this function to obtain the state of one of the toggle keys - the CapsLock, NumLock, and ScrollLock keys. Example: a1=KeyToggleGet(@NUMLOCK) a2=KeyToggleGet(@CAPSLOCK) a3=KeyToggleGet(@SCROLLLOCK) b= strcat(a1," ",a2," ",a3) Message("NumLock CapsLock ScrollLock", b) See Also: KeyToggleSet, SendKey KeyToggleSet Sets the state of a toggle key and returns the previous value. Syntax: KeyToggleSet(@key, value) 405 LastError Parameters: (i) @key (i) value Returns: (i) the toggle key in question. Values may be one of: @CAPSLOCK for the CapsLock key @NUMLOCK for the NumLock key @SCROLLLOCK for the ScrollLock key The new value of the toggle key. @OFF for the unset state @ON for the set state Previous toggle state of the key: @ON key was set; @OFF key was not set Use this function to alter the state of one of the toggle keys - the CapsLock, NumLock, and ScrollLock keys. Example: KeyToggleSet(@NUMLOCK, @ON) KeyToggleSet(@CAPSLOCK, @ON) KeyToggleSet(@SCROLLLOCK, @ON) See Also: KeyToggleGet, SendKey LastError Returns the most-recent error encountered during the current WIL program. Syntax: LastError ( ) Parameters: (none) Returns: (i) most-recent WIL error code encountered. WIL errors are numbered according to their severity. "Minor" errors go from 1000 through 1999. Moderate errors are 2000 through 2999. Fatal errors are numbered 3000 to 3999. Depending on which error mode is active when an error occurs, you may not get a chance to check the error code. See ErrorMode for a discussion of default error handling. Every time the LastError function is called, the "last error" indicator is reset to zero. 406 LogDisk A full listing of possible errors you can encounter in processing a WIL program is in the WIL help file. Of course, if you use the LastError function to trap errors, then extensive script testing -- including all error conditions -- is highly recommended. Example: ErrorMode(@OFF) LastError( ) FileCopy("data.dat", "c:\backups\*.*", @FALSE) ErrorMode(@CANCEL) If LastError( ) == 1006 Message("Error", "Please call Tech Support at 555-9999.") endif Message("LastError"," Done.") See Also: Debug, ErrorMode, Handling Errors, IntControl 73 Log10 Calculates the base-10 logarithm. Syntax: Log10(x) Parameters: (f) x floating point number. Returns: (f) the logarithm of the argument . The Log10 function calculates the base-10 logarithm of the argument. If the argument is negative or zero, an error will occur. Example: a = Log10(123.45) Message("Base-10 log of 123.45 is", a) See Also: Loge, Exp, operator ** LogDisk Logs (activates) a disk drive. Syntax: LogDisk (drive-letter) Parameters: (s) drive-letter the disk drive to log into. 407 Max Returns: (i) @TRUE if the current drive was changed; @FALSE if the drive doesn't exist. Use this function to change to a different disk drive. Example: LogDisk("C:") Message("LogDisk","Disk Logged.") See Also: DirChange, DiskScan LogE Calculates the natural logarithm. Syntax: LogE(x) Parameters: (f) x floating point number. Returns: (f) the logarithm of the argument x. The LogE function calculates the natural logarithm of the argument. If the argument is negative or zero, an error will occur. Example: a = LogE(123.45) Message("Natural log of 123.45 is", a) See Also: Log10, Exp, operator ** Max Returns largest number in a list of numbers. Syntax: Max (number [, number...]) Parameters: (f) number floating point number(s). Returns: (f) largest number. Use this function to determine the largest of a set of comma-delimited numbers. 408 Min Example: a = Max(5, -3.57, 125, 34E3, 2345.12, -32767) Message("Largest number is", a) See Also: Abs, Average, Min, Random Message Displays a message to the user. Syntax: Message (title, text) Parameters: (s) title (s) text title of the message box. text to display in the message box. Returns: (i) always 1. Use this function to display a message to the user. The user must respond by selecting the OK button before processing will continue. Example: Message("Current directory is", DirGet( )) which produces: See Also: Display, Pause Min Returns lowest number in a list of numbers. Syntax: Min (number [, number...]) Parameters: (f) number floating point number(s). 409 MouseClick Returns: (f) lowest number. Use this function to determine the lowest of a set of comma-delimited numbers. Example: a = Min( 5, -37.5, 125, 34.26, 2345E4, -32767) Message("Smallest number is", a) See Also: Abs, Average, Max, Random Mod An operator used to divide two numbers and return only the remainder. Syntax: result = number1 Mod number2 The modulus, or remainder, operator divides number1 by number2 (rounding floating-point numbers to integers) and returns only the remainder as result. For example, in the following expression, ret (which is result) equals 1. ret = 10 Mod 3 Message("Result = ", ret) Example: ;This example grabs the Time/Day of the Week. a=TimeYmdHms( ) b=TimeJulianDay(a) c=(b+5) mod 7 day=ItemExtract(c+1, "Sun Mon Tue Wed Thu Fri Sat", " ") line=StrCat("Julian Date-> ", b,@CRLF,"Day of week-> ",day) Message(TimeDate( ), line) See Also: Operators MouseClick Clicks mouse button(s). Syntax: MouseClick(click-type, modifiers) Parameters: (i) click-type 410 a mouse button press. MouseClickBtn (i) modifiers Returns: (i) click variations for mouse button presses. @TRUE on success; @FALSE on error. This function performs a mouse click at the current cursor position. "Modifiers" can be set to 0 if none are needed. Click-types: @LCLICK @RCLICK @MCLICK @LDBLCLICK @RDBLCLICK @MDBLCLICK left click right click middle click left double-click right double-click middle double-click Modifiers (multiple modifiers can be linked together with a logical OR, "|"): @SHIFT @CTRL @LBUTTON @RBUTTON @MBUTTON hold down shift key hold down control key hold down left mouse button hold down right mouse button hold down middle mouse button NOTE: The modifers are in effect until the click type is executed. [ For example, a Shift key plus a right mouse click would be: MouseClick(@RCLICK, @SHIFT) ] Example: Run("notepad.exe","") Message("Notepad Running","We will now close it via a mouseclick on the close button") winpos = WinPlaceGet(@NORMAL, "~Notepad") ; get coordinates for upper right corner of window x = ItemExtract(3, winpos, " ") - 10 y = ItemExtract(2, winpos, " ") + 10 WinActivate("~Notepad") MouseMove(x - 10, y + 10, "", "") MouseClick(@LCLICK, 0) See Also: IntControl 35, MouseInfo, MouseClickBtn, MouseMove, SendKey MouseClickBtn Clicks on the specified button control. Syntax: MouseClickBtn(parent-windowname, child-windowname, button-text) 411 MouseCoords Parameters: (s) parent-windowname the initial part of, or an entire parent window name. (s) child-windowname the initial part or, or an entire child window name. (s) button-text text specifying a button control. Returns: (i) @TRUE on success; @FALSE on error. This function clicks on the pushbutton, radio button, or checkbox whose text is specified by "button-text". If the button is located within a top-level window, specify the window name in "parent-windowname" and specify a blank string ("") for "child-windowname". If the button is located within a child window, specify the top-level window name in "parent-windowname" and the child window name in "child-windowname". Example: SendMenusTo("Exploring", "Tools | Map Network Drive") TimeDelay(1) ;Click Reconnect at logon button MouseClickBtn("Map Network Drive", "", "Reconnect at logon") Message("MouseClickBtn","Reconnect at logon button clicked") See Also: MouseClick, MouseClickBtn, MouseMove, SendKey MouseCoords Returns coordinates of the mouse within a window. Syntax: MouseCoords( parent-windowname, child-windowname) Parameters: (s) parent-windowname the initial part of, or an entire parent window name. (s) child-windowname the initial part or, or an entire child window name. Returns: (s) coordinates the x and y coordinates of the mouse cursor, relative to the window specified by "win-name" and "child-win". If "parent-windowname" specifies a top-level window and "child-windowname" is a blank string, the specified X-Y coordinates are relative to "parent-windowname". If "parent-windowname" specifies a top-level window and "child-windowname" specifies a child window of "parent-windowname", the specified X-Y coordinates are relative to "child-windowname". 412 MouseInfo If "parent-windowname" and "child-windowname" are both blank strings, the specified X-Y coordinates are relative to the Windows desktop. All coordinates are based on a virtual 1000 x 1000 screen. Note: The size and shape of displayed windows are usually based on a combination of screen resolution and the system font size. Thus the x and y coordinates may be different on each individual machine. Example: coords=MouseCoords("", "") message("Coordinates are relative to the Windows desktop.",coords) See Also: MouseClick, MouseClickBtn,MouseInfo, SendKey MouseInfo Returns assorted mouse information. Syntax: MouseInfo (request#) Parameters: (i) request# see below. Returns: (s) see below. The information returned by MouseInfo depends on the value of request#. Req# 0 1 2 3 4 5 Return value Window name under mouse Top level parent window name under mouse Mouse coordinates, assuming a 1000x1000 virtual screen Mouse coordinates in absolute numbers Status of mouse buttons, as a bitmask: Decimal Meaning Binary 000 0 No buttons down 001 1 Right button down 010 2 Middle button down 011 3 Right and Middle buttons down 100 4 Left button down 101 5 Left and Right buttons down 110 6 Left and Middle buttons down 111 7 Left, Middle, and Right buttons down returns mouse coordinates relative to the client area of the window under the cursor, in virtual (1000x1000) screen units. 413 MouseInfo 6 7 8 9 10 returns mouse coordinates relative to the client area of the window under the cursor, in virtual (1000x1000) client units. returns mouse coordinates relative to the bounding rectangle of the window under the cursor, in virtual (1000x1000) screen units. returns asynchronous status of mouse buttons, as a bitmask. This is like request #4, except #8 returns the asynchronous (current) state of the buttons, whereas #4 returns the state at the time the function was called. Window ID of top level parent window under mouse. Similar to request 0 except that the request can also return the window name of static, hidden and disabled child windows that have a caption. Examples of static windows include WIL Dialog VARYTEXT, STATICTEXT and PICTURE controls. For example, if mouse is at the center of a 640x480 screen and above the "Clock" window, and the left button is down, the following values would be returned: Req# 0 1 2 3 4 Return value "Clock" "Clock" "500 500" "320 240" "4" Note: The size and shape of displayed windows are usually based on a combination of screen resolution and the system font size. Thus the x and y coordinates may be different on each individual machine. Example: Display(1, "", "Press a mouse button to continue") buttons = 0 while buttons == 0 buttons = MouseInfo(4) endwhile If buttons & 4 Display(1, "", "Left button was pressed") endif If buttons & 1 Display(1, "", "Right button was pressed") endif See Also: SysParamInfo, WinMetrics, WinParmGet, MouseClick, MouseClickBtn, MouseMove 414 MousePlay MouseMove Moves the mouse to the specified X-Y coordinates. Syntax: MouseMove(X, Y, parent-windowname, child-windowname) Parameters: (i) X integer specifying the coordinate X. (i) Y integer specifying the coordinate Y. (s) parent-windowname the initial part of, or an entire parent window name. (s) child-windowname the initial part or, or an entire child window name. Returns: (i) @TRUE on success; @FALSE on error. This function accepts partial window names. If "parent-windowname" specifies a top-level window and "child-windowname" is a blank string, the specified X-Y coordinates are relative to "parent-windowname". If "parent-windowname" specifies a top-level window and "child-windowname" specifies a child window of "parent-windowname", the specified X-Y coordinates are relative to "child-windowname". If "parent-windowname" and "child-windowname" are both blank strings, the specified X-Y coordinates are relative to the Windows desktop. All coordinates are based on a virtual 1000 x 1000 screen. Note: The size and shape of displayed windows are usually based on a combination of screen resolution and the system font size. Thus the x and y coordinates may be different on each individual machine. Example: MouseMove(335, 110, "", "") See Also: MouseClick, MouseClickBtn, MouseInfo, SendKey MousePlay Performs full range of mouse associated activities. Syntax: MousePlay(X-Y-coordinates, parent-window, child-window, buttons, delay) Parameters: (s) X-Y-coordinates space-delimited string with the final mouse x and y position, in virtual 1000x1000 units. 415 MousePlay (s) parent-window (s) child-window (i) buttons (f) delay Returns: (i) name of parent window to move mouse relative to, or "" to specify the desktop. name of child window (i.e., child of "parent-window") to move mouse relative to, or "" if the movement will be relative to "parent". combination of one or more mouse buttons and keys to click and/or hold down (see below for list). amount of time to take for performing the mouse activity, in seconds. Can be a decimal number to indicate a fraction of a second. always 1. MousePlay allows you to perform the full range of mouse associated activities with a single function. You can simulate drag-and-drop operations by specifying the drop location in the "X-Y-coordinates" parameter and adding the @MPLAYLBUTTON constant to the "buttons" parameter. This tells MousePlay to move the mouse to the position x,y with the left mouse button down. You can perform a mouse button click at a specific location by using one of the button click values in the "buttons" parameter. MousePlay can move the mouse cursor relative to the upper left-hand corner of a window. To do this simply place a window name in the "parent window" parameter and optionally in the "child window" parameter. If you give MousePlay a child window name you must give it a parent name as well. When window names are present, MousePlay considers the upper left-hand corner of the parent or child window to be 0,0. It is, therefore, possible to give it a negative x or y value to move the mouse cursor to the left or above the window. If the window you specify is minimized, MousePlay will use its last un-minimized size for calculating mouse position. MousePlay also accepts the WIL constants @SHIFT and @CTRL in the "buttons" parameter. You can combine these constants with a mouse button constant using the bitwise OR ('|') operator to duplicate holding down the Shift or Control key while performing a mouse drag-and-drop or button click. You can use the "delay" parameter to control the amount of time MousePlay takes to perform an action. Sometimes it is necessary to slow down the mouse so that Windows will properly recognize the action. You may also want to slow things down to better track events or to just give your mouse activity a natural appearance. This parameter expects values in seconds, and only recognizes the first three digits to the right of the decimal point. 416 MousePlay IntControl 35 can also be used to slow down mouse clicks. If the MousePlay delay is less than the IntControl specified time, MousePlay will take the amount of time indicated by the IntControl setting. Values for the "buttons" parameter:( combine using the bitwise | (OR) operator.) Constant @MPLAYLCLK @MPLAYRCLK @MPLAYMCLK @MPLAYLDBLCK @MPLAYRDBLCK @MPLAYMDBLCK @MPLAYLBUTTON @MPLAYRBUTTON @MPLAYMBUTTON @SHIFT @CTRL Meaning Click left mouse button. Click right mouse button. Click middle mouse button. Double click left mouse button. Double click right mouse button. Double click middle mouse button. Hold down the left mouse button. Hold down the right mouse button. Hold down the middle mouse button. Hold down the shift key. Hold down the control key. Note: The size and shape of displayed windows are usually based on a combination of screen resolution and the system font size. Thus the x and y coordinates may be different on each individual machine. Example: Note: These examples may not run on your system due to various configuration options. ; Example 1 ; Run Explorer as a maximized window RunZoom("explorer.exe", "") WinWaitExist("~Exploring",5) WinActivate("~Exploring") ; now click on the minimize button in the upper-right corner MousePlay("956 16", "~Exploring", "", @MPLAYLCLK, 5) exit ; Example 2 ; Moves mouse cursor from lower left hand corner of the screen ; to the upper right hand corner of the screen MousePlay("0 1000", "", "", 0, 0.2) MousePlay("70 973", "", "", 0, 0.2) MousePlay("589 533", "", "", 0, 0.2) MousePlay("880 238", "", "", 0, 0.2) MousePlay("997 107", "", "", 0, 0.2) MousePlay("1000 0", "", "", 0, 0.2) exit 417 Net101 See Also: IntControl 35, MouseClick, MouseClickBtn, MouseInfo, SendKey, SendKeysTo MsgTextGet Returns the contents of a Windows message box. Syntax: MsgTextGet(window-name) Parameters: (s) window-name full title of the message box window. Returns: (s) contents of the message box. This function returns the text contents of a standard Windows message box. "Window-name" must be the full title of the message box window, and is casesensitive. Note1: This function may not work with the types of message boxes created by the application you wish to control if it is not a standard Windows Message box. However, if this function does work, it is the easiest way to keep tabs on an application. Note2: This function will not work with the types of message boxes created by most WIL functions, since they are not standard Windows message boxes. Example: msg = MsgTextGet("Microsoft Word") If msg == "Search text not found" SendKey("~") endif Message("MsgTextGet"," Message Text Gotten.") See Also: WinGetActive Net101 All network functionality for WIL is performed via "WIL Extenders", add-on Dlls for WIL, which contain Network commands for assorted networks. NetInfo is the only WIL network function. It returns the types of the networks currently active on the local machine, and can be used to help determine which network extenders should be loaded in multi-network environments. Documentation for the various network extenders are found in associated help files. 418 Num2Char See Also: AddExtender, DllCall, NetInfo NetInfo Determines network(s) installed. Syntax: NetInfo(requestcode) Parameters: (i) requestcode Returns: (s) 0 for primary network name 1 for secondary subnet list Primary network name for request code 0, or Secondary network list for request code 1. Use this function to determine the network type(s) running on a workstation. When running in a mixed network environment, it may be important to be able to determine the types of networks running on a workstation so as to be able to load the appropriate network extender Dlls and issue the corresponding commands. NetInfo(0) will return the string "WINNT" for 32 bit Windows platforms. Under Windows NT and newer, NetInfo(1) will return a list of installed network provider ID's, delimited with the standard file delimiter (by default, a tab). Possible providers, with their corresponding descriptions, are: Provider ID LanmanWorkstation NetWareWorkstation NWCWorkstation Description Microsoft Windows Network NetWare Services NetWare or Compatible Network Example: a = NetInfo(0) b = NetInfo(1) ;NT or newer c = "Network Provider ID's: " d = StrReplace(b, @tab, ",") rslt = StrCat("Primary Network Name: ", a, @CRLF, c, d) Message("NetInfo Results", rslt) See Also: AddExtender, DllCall, Net101 Num2Char Converts a number to its character equivalent. 419 OLE / COM Syntax: Num2Char (number) Parameters: (i) number Returns: (s) any number from 0 to 255. one-byte string containing the character which the number represents. Use this function to convert a number to its ASCII equivalent. Example: ; Build a variable containing a CRLF combo crlf = StrCat(Num2Char(13), Num2Char(10)) Message("NUM2CHAR", StrCat("line1", crlf, "line2")) See Also: Char2Num, IsNumber OLE / COM The ability to control and assist the movement of data between applications is one of the key strengths of WIL. There many ways to share data between applications: using the Clipboard, dynamic data exchange (DDE), Control Manager functions, SendKey functions and COM. Now, with support for COM, you can do much more than share data. From within your WIL script, you can access and manipulate COM objects that are supplied by other applications. With COM Automation, you can use WIL to produce custom solutions that utilize data and features from applications that support COM Automation. What Is COM Automation? COM Automation is an industry standard that applications use to expose their COM objects to development tools, macro languages, and container applications that support COM Automation. For example, a spreadsheet application may expose a worksheet, chart, cell, or range of cells -- all as different types of objects. A word processor might expose objects such as applications, paragraphs, sentences. bookmarks, or selections. When an application supports COM Automation, the objects it exposes can be accessed by WIL. You use WIL scripts to manipulate these objects by invoking methods (subroutines) on the objects, or by getting and setting the objects' properties (values). 420 OLE / COM Accessing COM Objects You can manipulate other applications' COM objects directly by first opening the object with the ObjectGet and ObjectCreate functions. ObjectCreate vs. ObjectGet: What's the Difference? Besides minor differences in the syntax, the ObjectCreate and ObjectGet functions are used in different contexts. The differences can be summarized as follows: • ObjectCreate is used to create an interface to a new instance of an application. Use ObjectCreate when it's not certain whether the application to integrate is running. For example: objxl = ObjectCreate ("Excel.Application") starts Microsoft Excel. The object returned to the variable 'objxl' is a reference to the Excel.Application object just created. In other words, an object handle. • ObjectGet is used with an application that's already running, or to start an application with a file already loaded. For example: objxlbook = ObjectGet ("C:\TEST.XLS") would start Microsoft Excel with the file 'Test.xls' already loaded. The object returned to the variable 'objxlbook' would be a reference to the Workbook object representing the just opened 'Test.xls' file. The ObjectCreate function is used to open the object. This function accepts a string (ProgId) that indicates the application name and the type of object you want to create. Use the following syntax to specify an object to create: Application.ObjectType For example, let's say there is a orgchart application named ORGCHART.EXE that supports a single object: an orgchart. Furthermore, the OrgChart object supports two sub-objects: a box and a line. The object might be defined as: OrgChart.Chart Once you know the type of object you want to create, you use the ObjectCreate function to create the object. Capture the value returned by the ObjectCreate function to a variable. Here's an example: objchart = ObjectCreate("OrgChart.Chart") Once you have the primary object in hand - in the 'objchart' variable in this case, you can create the sub-objects and assign them to their own variables. objtopbox = objchart.NewBox objbottombox = objchart.NewBox objline = objchart.NewLine 421 OLE / COM When this code executes, the application providing the object is started (if it is not already running) and an object is created. The object belongs to the application that created it. This object can be referenced using the variable you placed the return value of the ObjectCreate function. For example, after creating the object, you could write code to open sub-objects, change the background color, set a default font, set a title, and save the object to a file: objchart.Color = "White" objchart.FontName = "Arial" objchart.FontSize = 12 objchart.Title = "Deana’s Org Chart" objtopbox.Position(2,2) objtopbox.Text = "The Boss" objbottombox.Position(2,8) objbottombox.Text = "Deana" objline.Begin(2,2) objline.End(2,8) objchart.SaveAs("C:\ORGCHART\DEANA.ORG") When creating an object, some applications require that the application providing the object is either active or on the system's path. When you are through with an object, set the object equal to a null string ("") or to 0 (zero) to tell the WIL processor that you are done with the object. objline = "" objtopbox = "" objbottombox = "" objchart = "" To get a list of objects that an application supports, you must consult that application's documentation. It may also help to poke around in the Windows registry. For example check out the HKEY_CLASSES_ROOT key. Be aware, though, that intentional, unintentional, or accidental changes to the registry may completely destroy a Windows installation and require a complete re-installation of ALL your software to recover. Accessing an Object's Properties To assign a value to a property of an object, put the object variable and property name on the left side of an equation and the desired property setting on the right side. For example: objchart.Title = "Deana’s Org Chart" You can also retrieve property values from an object: TheTitle = objchart.Title Performing Object Methods 422 OLE / COM In addition to getting and setting properties, you can manipulate an object using the methods it supports. Some methods may return a value. Methods that do not return a value, return 0. objchart.Position(2,2) objline.End(2,8) objchart.SaveAs("C:\ORGCHART\DEANA.ORG") rslt = objchart.Print( ) If rslt == @FALSE Message("Error", "Print failed") endif Dealing with Sub-Objects Some objects contain sub-objects. For example, a box is a sub-object of an orgchart object. Note: You can include multiple objects, properties and methods on the same line of code. For example: objtopbox = objchart.NewBox Or objsubbox = objchart.NewBox.SubBox Collections A collection represents a set of objects. There are several different ways you can loop through the elements of a collection. However, the recommended method is to use the ForEach...Next loop. In this structure, WinBatch repeats a block of statements for each object in a collection. The following example displays the name of each worksheet in the WorkSheets collection. ForEach objWorkSheet In ObjExcel.WorkSheets Message("WorkSheet Name", objWorkSheet.Name) Next Another way to loop through the elements of a collection is to use the Item property or method and pass the name or index number of the member as the index argument. For example, in Excel, the following expression returns a reference to an open workbook by passing its name "Sales.xls" to the Item property and then invokes the Close method to close it: objworkbooks.Item("Sales.xls").Close The Item property or method is the default for most collections. objworkbooks.Item("Sales.xls") To reference items in a collection by using an index number, simply pass the number of the item to the Item property or method of the collection. For example, if Sales.xls is the second workbook in the Workbooks collection, the following expression will return a reference to it: objWorkbooks.Item(2) 423 OLE / COM Closing an Object All COM Automation objects support some method that closes the object and the application that created it. Since COM objects can use a significant amount of memory, it is a good idea to explicitly close an object when you no longer need it. To close an object, use the appropriate method (most objects support the Close method or the Quit method). For example: ;Closes the object. objchart.Close ;Closes the application that created the object. objchart.Quit When WIL processing for an object is complete, set the object variable to a null string or 0 (zero) to free WIL processor memory. objchart = "" or objchart = 0 Omitted Optional Positional Parameters COM functions support 'omitted optional positional parameters', using commas as placeholders. 'Required parameters' are those that must always be specified. 'Optional parameters' are those that can be skipped using a comma as a placeholder (when using positional parameters), or simply omitted (when using named parameters). For example: objapp.Display("Hello", 100, 100, , 1) Named Parameters COM functions support 'named parameters'. The syntax structure is: Object.Method(p1, p2 :: n3 = v3, n4 = v4) Positional Parameters Positional parameters (shown above as p1 and p2), if any, come first, followed by a double colon ("::"), and then any named parameters (n3 and n4). Each named parameter is followed by an equals sign ("=") and then the value for the parameter (v3 and v4). Whitespace is ignored. Here are some examples: ; 2 positional parameters objapp.InputBox("My Prompt", "My Title") ; 2 positional parameters and 2 named parameters objapp.InputBox("My Prompt", "My Title" :: Left = 40, Top = 300) ; no positional parameters and 2 named parameters 424 OLE / COM ;(note the leading colon) objapp.InputBox(:: Prompt = "My Prompt", Title = "My Title") COM Types COM functions allow you to specify a data type for parameters. Normally, when you specify an value as a parameter to a COM function, WIL passes it as a type VT_I4 (4-byte integer value). If the COM application was expecting the parameter to be a different type of value, in most cases it will automatically convert it to the desired type. However, there are some COM applications which don't do this, and return an error instead. In such cases, you can first specify the type using the function ObjectType. Or you can specify the type, using the following syntax: Object.Method(p1, type:p2 :: name = value, type:name = value) The parameter type (shown as 'type') is followed by a single colon (":"), and then the parameter itself. This can be done for both positional parameters and named parameters. Whitespace is ignored, and the type names are not case-sensitive. Types which may be specified: Type UI1 UI2 UI4 I1 I2 I4 BOOL DATE DECIMAL Name VT_UI1 VT_UI2 VT_UI4 VT_I1 VT_I2 VT_I4 VT_BOOL VT_DATE VT_DECIMAL CURRENCY VT_CY NULL DISPATCH VT_NULL VT_DISPATCH Meaning An unsigned 1-byte character. An unsigned 2-byte character. An unsigned 4-byte character. A 1-byte integer value. A 2-byte integer value. A 4-byte integer value. A Boolean (True/False) value. A date/time string, in Ymd or YmdHms format. A decimal value, specified as a string in the form "#DECIMAL:value". A currency value, specified as a string in the form "#CURRENCY:value". A blank string (""). A pointer to an object was specified. This object is known only to implement IDispatch. Note: The default type for integer values is "I4" (VT_I4). Here are some examples: ; this function requires a parameter of type VT_I2 objapp.CreateImageViewerObject(I2:1) 425 ObjectAccess ; this function requires a (named) parameter of type VT_DATE objapp.CreateLog("access.log" :: DATE:startdate="97:11:01") Byte Arrays COM methods or properties that return byte arrays (variant type = VT_UI1 | VT_ARRAY), by default will return as WIL array. COM 2.0 Limitations in WIL Some COM objects support features that can't be accessed using WIL. This section discusses known limitations. COM method and property names are limited to 256 characters in length. ObjectAccess Opens or creates an COM/OLE Automation object. Syntax: ObjectAccess(app.objname, create-flag) Parameters: (s) app.objname (i) create-flag name of the desired object. @TRUE, it will create an instance of the object, and return a handle to it. @FALSE, it will fail and return an error. Returns: (i) a special object handle to be used when referring to the object. ObjectAccess has been superceded with the function ObjectGet If there is already a running instance of the object specified by "app.objname", this function will return a handle to that object. If there is not a running instance of the specified object, the behavior will depend on the value of 'create-flag': If 'create-flag' == @TRUE, it will create an instance of the object, and return a handle to it. If 'create-flag' == @FALSE, it will fail and return an error. This function is similar to ObjectOpen, except that ObjectOpen always creates a new object and cannot be used to access an existing one. Example: types = "Doc Files|*.doc" file = AskFileName("SelectFile", "C:\", types, "", 1) 426 ObjectClose wdGoToLine = 3 wdLine = 5 wdExtend = 1 wdCharacter = 1 if AppExist("winword.exe") oWORD = ObjectAccess("Word.Application", @false) newWord = @false else oWORD = ObjectOpen("Word.Application") newWord = @true endIf oDOCS = oWORD.Documents oDOC = oDOCS.Open(file) oWORD.visible=@true oActiveDoc = oWORD.activedocument oSel=oWORD.selection oSel.GoTo(wdGoToLine,1) while @true oSel.EndKey(:: Unit=wdLine, Extend=wdExtend) oSel.Copy line = clipGet() Message("Line",line) oSel.MoveRight(:: Unit=wdCharacter, Count=1) if oSel.MoveRight == 0 then break oSel.MoveLeft(:: Unit=wdCharacter, Count=1) ; compensate for MoveRight endWhile oActiveDoc.close() objectclose(oSel) objectclose(oActiveDoc) objectclose(oDOC) objectclose(oDOCS) if newWord oWord.Quit endIf objectclose(oWORD) exit See Also: See discussion in COM section, ObjectGet ObjectClose Closes an COM/OLE Automation object 427 ObjectConstantsGet Syntax: ObjectClose(objecthandle) Parameters: (r) objecthandle handle of object to close. Returns: (i) always 1. ObjectClose is now obsolete. When WIL processing for an object is complete, set the object variable to a null string to free WIL processor memory. objVar = "" The ObjectClose function closes an object and frees WIL processor memory. The parameter passed to ObjectClose must be the same variable that the return value from the corresponding ObjectOpen was placed into. Otherwise the function will fail. Example: objFSO = ObjectOpen("Scripting.FilesystemObject") objDrives = objFSO.Drives ForEach objDrive in objDrives Message("", objDrive.Path) Next ObjectClose(objFSO) See Also: COM, ObjectOpen ObjectConstantsGet Creates a Constants object. Syntax: ObjectConstantsGet( object ) Parameters (r) object reference COM object reference. Returns: (r) constants object reference. Use this function to create a constants object for a COM Automation object: adoApp = ObjectCreate("ADODB.Connection") adoConst = ObjectConstantsGet(adoApp) The function will produce an error, if the supplied parameter is not a COM object or is a COM object that does not have any associated constants. 428 ObjectConstantsGet A constants object is a special WIL language construct that allow you to access the constant values associated with a COM object by name. You access values by using the constants.name syntax where constants is the name of the variable holding this function’s return and name is the name of constant whose value you wish to use. For instance, if the constants object from the example above is used, then conVal = adoConst.adBSTR assigns the value of the constant adBSTR to the variable conVal. In this case, the constant adBSTR has the value eight(8), so after the assignment the variable conVal will hold the number 8. You can use the constants.name syntax anywhere you would use a literal. This includes using it as an object method parameter, as the right-hand-side of an object property assignment, and in relational and arithmetic expressions. You cannot, however, assign a new value to an individual constant name. They are in effect readonly. NOTE: This function may have an impact on the performance of your scripts. Some COM objects have thousands of constants and you may experience a small delay while the function collects the constants’ names and values. Example: This example uses the ObjectConstantsGet function to obtain the constants associated with the ADODB.RecordSet object. The constants are then used to set the CursorLocation property and to specify the data types for each record field. ; Get a recordset object reference. objRs = ObjectCreate("ADODB.RecordSet") ; Get the constants object for RecordSet conRs = ObjectConstantsGet(objRs) ; Set cursor source using constant. objRs.CursorLocation = conRs.adUseClient ; Create record fields using constants ; for Append’s data types parameter. objRs.Fields.Append("MyText",conRs.adVarwchar,30) objRs.Fields.Append("MyDecimal",conRs.adDecimal) objRs.Fields("MyDecimal").DefinedSize = 19 objRs.Fields("MyDecimal").Precision = 18 objRs.Fields("MyDecimal").NumericScale = 6 objRs.Fields.Append("MyBoolean",conRs.adBoolean) objRs.Fields.Append("MyDate",conRs.adDate) ; Commit the record metadata objRs.Open() objRs.Addnew() 429 ObjectConstToArray ; ... Add data to the record set here... ; ... save records to disk here... ; Clean up. objRs.Close() conRs = 0 objRs = 0 See Also: ObjectConstToArray, ObjectCreate, ObjectGet ObjectConstToArray Creates an array of Constants object names and values. Syntax: ObjectConstToArray( constants-reference) Parameters (r) constants-reference constants object reference. Returns: (a) two dimensional array of constants names and values. ObjectConstToArray creates an array that contains the textual names and numeric values of a constants object: adoApp = ObjectCreate("ADODB.Connection") adoConst = ObjectConstantsGet(adoApp) aConstants = ObjectConstToArray(adoConst) This function can be used during the script writing process to examine the contents of a constants object obtained using the ObjectConstantsGetfunction. Note: Refer to the ObjectConstantsGet documentation for details about constants object. The returned array has two dimensions. There is one row for each constant and two columns for each row. The first column contains the string name of a constant and the second column contains the value of the constant. The name is the same one used following the dot (.) in the constants.name syntax and the value is the same one returned by constants.name. In addition, row zero column zero of the array contains the number of constants stored in the array. Using the example above, the number of constants is obtained with: nNumberOfConstants = aConstants[0,0] 430 ObjectCreate The name of the first constant stored in the array is accessed with: sName = aConstants[1,0] And the first value is accessed with: nValue = aConstants[1,1] Example: This example uses the ObjectConstToArray function to create an array of the constants associated with the “Excel.Application” object. The contents of the array are then displayed in a message box, one row at a time. ; Get the Excel application object. objXL = ObjectCreate("Excel.Application") ; Get the constants object. constXL = ObjectConstantsGet(objXL) ; Create an array of constants. aXL = ObjectConstToArray(constXL ) ; Display each name and value. ; (There are over 1500 of them.) for i = 1 to aXL[0,0] sTittle = Strcat(" Constant No. ", i) sText = Strcat( aXL[i,0], " = ",aXL[i,1] ) message( sTittle, sText) next ; Clean up constXL = 0 objXL = 0 See Also: ObjectConstantsGet, ObjectCreate, ObjectGet ObjectCreate Creates and returns a reference to a COM object. Syntax: ObjectCreate(progid, location) Parameters (s) progid The programmatic identifier of the object to create, usually in the form servername.classname. 431 ObjectCreate (s) location [optional] The name of the network server where the object will be created. If Location is an empty string ("") or omitted, the local machine is used. Returns: (r) COM object reference. To create an instance of a COM object, assign the return value of ObjectCreate to a variable: adoApp = ObjectCreate("ADODB.Connection") As shown in the examples that follow, you can access properties and methods of the object using the object variable and dot (.) notation. You can create an object on a remote networked computer by passing the name of the computer to the Location argument of the ObjectCreate function. That name is the same as the Machine Name portion of a share name. i.e.: for a share named "\\MyServer\Public", the Location is "MyServer". The following code returns the version number of an instance of Excel running on a remote computer named MyServer: ; Replace string "\\MyServer" with name of the remote computer. xlObj = ObjectCreate("Excel.Application", "\\MyServer") message("Remote Excel version", xlObj.Version) xlObj = "" Note: Refer to Microsoft documentation for additional information on making an application accessible on a remote networked computer. Use ObjectCreate when there is no current instance of the object. If, however, an instance of the object is already running, ObjectCreate starts a new instance, and an object reference of the specified type is returned. To use the current instance or to start the application and have it load a file, or to access an object using a moniker, use the ObjectGet function. If an object has registered itself as a single-instance object, only one instance of the object is created, no matter how many times ObjectCreate is executed. Each COM object reference consumes system resources so it is best to hold a reference only as long as necessary. You can release a reference to an object by simply assigning a new value to the object variable. Some object servers require that a termination method be called before an object’s last reference is released. Check your COM server documentation for details. Note: The legacy function ObjectClose can still be used to release an object reference. However, continued use of the function is discouraged. 432 ObjectCreate ObjectCreate vs. ObjectGet: What's the Difference? Besides minor differences in the syntax, the ObjectCreate and ObjectGet functions are used in different contexts. The differences can be summarized as follows: • ObjectCreate is used to create an interface to a new instance of an application. Use ObjectCreate when it's not certain whether the application to integrate is running. For example: xl = ObjectCreate ("Excel.Application") starts Microsoft Excel. The object returned in xl is a reference to the Excel.Application object just created. • ObjectGet is used with an application that's already running, or to start an application with a file already loaded. For example: xlBook = ObjectGet ("C:\TEST.XLS") would start Microsoft Excel with the file Test.xls already loaded. The object returned would be a reference to the Workbook object representing the just opened Test.xls file. Example: This example uses the ObjectCreate function to create a Microsoft Internet Explorer window and display a Web page. To use this example, Internet Explorer must be installed on the computer where this program will run. objExplorer = ObjectCreate("InternetExplorer.Application") objExplorer.addressbar = @FALSE objExplorer.statusbar = @FALSE objExplorer.menubar = @FALSE objExplorer.toolbar = @FALSE objExplorer.visible = @TRUE objExplorer.Width = 800 objExplorer.Height = 550 objExplorer.Left = 0 objExplorer.Top = 0 objExplorer.navigate("http://www.winbatch.com/") ; Wait until page loads... While objExplorer.busy || objExplorer.readystate<> 4 TimeDelay(0.5) EndWhile ; Do something. objExplorer.quit objExplorer = "" 433 ObjectEventAdd See Also: ObjectGet, CreateObject, ObjectConstantsGet, ObjectConstToArray ObjectEventAdd Associates a user-defined function or subroutine with a COM object event. Syntax: ObjectEventAdd( object-reference, event-name, UDF-name ) Parameters: (r) object-reference (s) event-name (s) UDF-name variable containing an object reference name of event to be handled name of UDF/UDS event handler Returns: (i) @TRUE on success; @FALSE on failure ObjectEventAdd binds a user-defined function or subroutine to a COM object event. COM object events are notifications sent to a script in response to some action or object state change. Events can even be fired in response to an action taken by your script. Once your event handling user-defined function or subroutine is bound to an event, the COM object calls your UDF/UDS when ever the event occurs. For many events, your script must pause execution long enough to receive the event. You can pause your script by placing the TimeDelay function in a While or For loop. You can also use a WIL dialog, one of the built-in dialogs or one of the "wait" functions to pause script execution. If you do choose a TimeDelay or "wait" loop, remember to include logic for loop termination. Note: While you can pause your script in a user-defined function or even a nested call to a user-defined function, a user-defined subroutine event handler's variable scope is always the outer most scope of the script. This means that variables created from within the "pausing" user-defined function are not available to event handling user-defined subroutine. object-reference The first parameter is a reference to the object whose event you wish to handle. The parameter must be a variable containing an object reference. Object references can be obtained by calling the ObjectCreate, ObjectGet, or DialogObject function. event-name This is the name associated with the event you wish to handle. Consult a COM object's documentation to find the names of events supported by an object. UDF-name 434 ObjectEventAdd The third parameter is the name of the User-defined function or subroutine that will handle the event. The UDF/UDS must be defined before you call the ObjectEventAdd function. The UDF/UDS definition must also contain the number of parameters specified for the event handler by the object's documentation. If the event supports "out" parameters, you can assign values to these parameter variables inside your handler and the values will be passed back to the COM object. Consult the object's documentation to determine if any of the parameters can return values to the object. Example: ;This example uses the ObjectEventAdd function and a WMI event to ;monitor the Run registry key. The script uses the WaitForKeyEx ;function in a loop to pause while waiting for a registry change. ;Script processing completes when the key change event fires or the ;user presses the Esc key. bNoEvent = @True ; Initialize loop control variable ; WMI event OnObjectReady subroutine handler #DefineSubroutine OnObjectReady(objWbemObject, objWbemAsyncContext) Message("Registry Key Change", objWbemObject.GetObjectText_()) bNoEvent = @False ; Causes loop to exit return #EndSubroutine ; Need the WMI service and sink objects objWmiServices = ObjectGet("winmgmts:root/default") objWmiSink = ObjectCreate("WbemScripting.SWbemSink") ; Bind the event handler to the WMI event ObjectEventAdd(objWmiSink, "OnObjectReady", "OnObjectReady") ; Create the WMI query to check for modifications to the Run key sHive = "Hive='HKEY_LOCAL_MACHINE'" sKey = "KeyPath='SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run'" sQuery = "SELECT * FROM RegistryKeyChangeEvent" sQuery = StrCat(sQuery, " WHERE ", sHive, " AND ", sKey) ; Start the registry monitor objWmiServices.ExecNotificationQueryAsync( objWmiSink , sQuery) ; Loop until the registry changes BoxOpen("Waiting for a registry key to change.", "Press ESC key to quit") while bNoEvent if WaitForKeyEx("{ESC}", 1) == 1 break ; Esc key pressed endif endwhile BoxShut() 435 ObjectEventRemove ; Remove the event. ObjectEventRemove(objWmiSink, "OnObjectReady") ; To be safe shut down the WMI event sink objWmiSink.Cancel() objWbemObject = 0 objWbemAsyncContext = 0 objWmiSink = 0 objWmiServices = 0 exit See Also: ObjectEventRemove, ObjectCreate, ObjectGet, ObjectEventRemove Cancels the association between a user-defined function or subroutine and a COM object event. Syntax: ObjectEventRemove(object-reference, event-name) Parameters: (r) object-reference (s) event-name variable containing an object reference name of event being handled as a string Returns: (i) @TRUE on success; @FALSE on failure. ObjectEventRemove breaks the previously established link between a user-defined function or subroutine and a COM object event. Once the link is broken, your userdefined function or subroutine will no longer execute when the COM object fires the indicated event. You can also break the link between an event and your event handling function or subroutine by releasing all references to the COM object associated with the event. This is usually done by assigning a zero (0) to all variables holding a reference to the COM object. This function is provided for the occasion where you wish to stop handling an event but wish to continue using the COM object in your script. object-reference The first parameter is a reference to the object whose event you wish to stop handling. The parameter must be a variable containing an object reference and the reference must have been previously used in a successful call to ObjectEventAdd. event-name The second parameter is the name of the event you wish to stop handling. The event name must have been previously used in a successful call to ObjectEventAdd. 436 ObjectEventRemove Example: ;This example illustrates a script wrapper for Excel which uses the ;ObjectEventRemove function to remove events when the initial Excel ;workbook is closed. The script also demonstrates that is possible ;to remove events from within event handlers. #DefineSubRoutine WorkbookBeforeClose(objWorkbook, bCancel) ; This is called when you choose to close the workbook in Excel. ; The event handlers are removed, and then the workbook is closed ; without saving changes. ObjectEventRemove(objXlApp, "SheetChange") ObjectEventRemove(objXlApp, "WorkbookBeforeClose") objWorkbook.Saved = @True ; Set the dirty flag to true so there ; is no prompt to save. bDone = @True ; End event loop #EndSubRoutine #DefineSubRoutine SheetChange(objSheet, objTarget) ;This is called when a cell or cells on a worksheet are changed. sWhere = StrCat(objTarget.Address, " on ", objTarget.Worksheet.Name()) Message("You Changed Cells", sWhere) #EndSubroutine ;Start Excel and create a new workbook. bDone = @False ; Event loop control variable objXlApp = ObjectCreate("Excel.Application") objXlBook = objXlApp.Workbooks.Add() objXlBook.Windows(1).Caption = "Event Handler Example" objXlBook.Worksheets.Item(1).Activate() ;Add an event handler for the WorkbookBeforeClose Event of the ;Application object. ObjectEventAdd(objXlApp,"WorkbookBeforeClose","WorkbookBeforeClose") ; Add an event handler for the SheetChange event of all Worksheet ; objects. ObjectEventAdd(objXlApp,"SheetChange","SheetChange") ;Make Excel visible and give the user control. objXlApp.Visible = @True objXlApp.UserControl = @True ; Event processing loop while !bDone TimeDelay(1) endwhile ; Add a fresh workbook before exiting in case ; the user closed the workbook but not Excel objXlBook = objXlApp.Workbooks.Add() objXlBook.Windows(1).Caption = "Event Handler Example (No Events)" 437 ObjectGet objWorkbook objTarget objSheet objXlBook objXlApp = = = = = 0 0 0 0 0 See Also: ObjectEventAdd, ObjectCreate, ObjectGet ObjectGet Returns a reference to an object provided by a COM/OLE component. Syntax: ObjectGet( moniker, progId) Parameters: (s) moniker (s) progId [optional] A name for a namespace or class, or the full path and name of a file associated with an object. If moniker is omitted, progId is required. [optional] The programmatic identifier of the object to create, usually in the form servername.classname. Returns: (r) COM/OLE object reference. Use the ObjectGet function to load an instance of a COM/OLE object from a file. For example: xlObject = ObjectGet("c:\Projects\Test\exceltest.xls") When this code is executed, the application associated with the specified file path and name is started and the associated object is activated. If moniker is a zero-length string (""), ObjectGet returns a new object instance as specified by ProgId . If the moniker argument is omitted, ObjectGet returns the currently active progId object. If no object of type progId is running, an error occurs. For example: xlObject = ObjectGet(, "Excel.Application") If Excel is not running, the above line will cause an error. If you do not specify the object's progId with a file and path, the system determines the application to start and the object to activate, based on the file name you provide. 438 ObjectGet Some files, however, may support more than one class of object. To specify which object in a file you want to activate, use the optional progId argument. Once an object is activated, you reference it in your script using the object variable you defined. In the preceding example, you access properties and methods of the new object using the object variable xlObject. For example: ; Set the value of the first cell of worksheet 1. xlObject.Worksheets(1).Range("A1").Value = "2.5" The Moniker parameter accepts strings other than file paths and names. Many monikers consist of a namespace, and an object path with a class name. These monikers are often used to report on or manage operating system services. Some namespace examples include “winmgmts:” which is used to access WMI service and “LDAP:” which is used to access Directory Services. Sometimes monikers can contain multiple namespaces. For example, the following WMI namespace moniker identifies the Win32_LogicalDisk class in the root\cimv2 namespace on the 'myServer' server: WinMgmts:{impersonationLevel=impersonate}!//myServer/root/cimv2:Win32 _LogicalDisk Here is an example of an LDAP namespace moniker that identifies an Active Directory user object using the toons server: LDAP://toons/CN=Daf Duckus,CN=users,DC=acme,DC=com Note: Refer to Microsoft documentation for additional information on WMI and Active Directory Services Interfaces classes, properties and methods. Each COM/OLE object reference consumes system resources so it is best to hold a reference only as long as necessary. You can release a reference to an object by simply assigning a new value to the object variable. Some object servers require that a termination method be called before an object’s last reference is released. Check your COM/OLE server documentation for details. Note: The legacy function ObjectClose can still be used to release an object reference. However, continued use of the function is discouraged. ObjectCreate vs. ObjectGet: What's the Difference? Besides minor differences in the syntax, the ObjectCreate and ObjectGet functions are used in different contexts. The differences can be summarized as follows: • ObjectCreate is used to create an interface to a new instance of an application. Use ObjectCreate when it's not certain whether the application to integrate is running. For example: 439 ObjectOpen xl = ObjectCreate ("Excel.Application") starts Microsoft Excel. The object returned in xl is a reference to the Excel.Application object just created. • ObjectGet is used with an application that's already running, or to start an application with a file already loaded. For example: xlBook = ObjectGet ("C:\TEST.XLS") would start Microsoft Excel with the file Test.xls already loaded. The object returned would be a reference to the Workbook object representing the just opened Test.xls file. Example: This example uses the ObjectGet function to get a reference to a WMI service object. It then uses the object's ExecQuery method to obtain a collection of operating systems installed on the local computer. The collection is then enumerated for the version of the last service pack installed on the machine. objWMIService = ObjectGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") colOS = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem") ; Use a ForEach In loop to iterate the Operating System collection. ForEach objOS in colOS sVersion = StrCat(objOS.ServicePackMajorVersion,".",objOS.ServicePackMinorVersio n) Message ( "Service Pack Version" , sVersion) Next See Also: GetObject, ObjectCreate, ObjectConstantsGet, ObjectConstToArray ObjectOpen Opens or creates an COM/OLE Automation object Syntax: ObjectOpen(app.objname) Parameters: (r) app.objname 440 name of the desired object. ObjectType Returns: (r) a special object handle to be used when referring to the object. See discussion in COM section. ObjectOpen has been superceded with the function ObjectCreate. The ObjectOpen function returns a handle to be used when referring to an COM/OLE Automation object. If the Object does not exist, the function will fail. Example: Browser = objectopen("InternetExplorer.Application") browser.visible = @true url = "http://www.winbatch.com" browser.navigate (url) if browser.readystate <> 4 timedelay(0.5) endif timedelay(5) BrowserDoc = Browser.Document BrowserBody = BrowserDoc.Body BrowserPage = BrowserBody.CreateTextRange BrowserText = BrowserPage.Text message(url, BrowserText) ObjectClose(Browser) exit See Also: COM, ObjectClose, ObjectCreate ObjectType Creates a WIL variable with a specific COM/OLE variant type. Syntax: ObjectType(variant-type, value) Parameters: (s) variant-type (s/i) value see below. value of the variable. Returns: (i) a WIL variable with a specific COM/OLE variant type. "variant-type" can be one of the following: Variant-type BSTR I1 Value to specify A string A 1-byte character value 441 ObjectType I2 I4 UI1 UI2 UI4 BOOL CY DATE DECIMAL NULL ARRAY DISPATCH A 2-byte integer value A 4-byte integer value. An unsigned 1-byte character. An unsigned 2-byte character. An unsigned 2-byte character. A Boolean (True/False) value. A currency value, specified as a string in the form "#CURRENCY:value". A date/time value, specified as a string in Ymd or YmdHms format A decimal value, specified as a string in the form "#DECIMAL:value". A blank string (""). A safe array. A pointer to an object was specified. This object is known only to implement IDispatch. Note that "variant-type" may optionally be preceded by the prefix "VT_", so for example you could specify either "BOOL" or "VT_BOOL". When an COM/OLE method or property returns a value that is one of these supported variant types, WinBatch now retains the variant type for the returned variable, without having to use the ObjectType function. However, if you subsequently assign a new value to that variable using a regular WIL assignment operator, the variant type information will be lost. For example: visible = ExcelApp.Visible ExcelApp.Visible = visible The variable "visible" is returned as a VT_BOOL, and is still a VT_BOOL when it is passed back to the COM/OLE object. But here: visible = ExcelApp.Visible visible = 0 ExcelApp.Visible = visible The assignment "visible = 0" causes "visible" to become an ordinary WIL integer, without a variant type. In that case, if you wanted it to be a VT_BOOL you would need to use ObjectType: visible = ObjectType("BOOL", 0) ExcelApp.Visible = visible Or simply: ExcelApp.Visible = ObjectType("BOOL", 0) 442 ObjectType Example: #DefineFunction PrintGraphic(File) ; This can be used to Print: HTML files or ; Graphics files (i.e., BMP TIFF JPG JPEG GIF) ; Requires Windows 2000 or later. if WinVersion(1) != 5 Message("Error","This function is not supported on this Windows platform") return(0) endif objBrowser = ObjectOpen("InternetExplorer.Application") objBrowser.addressbar = @false objBrowser.statusbar = @false objBrowser.menubar = @false objBrowser.toolbar = @false objBrowser.visible = @false objBrowser.navigate(file) While @true If objBrowser.ReadyState == 4 then Break TimeDelay(1) EndWhile objBrowserDoc = objBrowser.Document objAll = objBrowserdoc.all OLECMDID_PRINT = 6 OLECMDEXECOPT_DONTPROMPTUSER = 2 PRINT_DONTBOTHERUSER = 1 PRINT_WAITFORCOMPLETION = 2 pvaIn = ObjectType("I2",PRINT_WAITFORCOMPLETION|PRINT_DONTBOTHERUSER) pvaOut = ObjectType("NULL","") objBrowser.ExecWB(OLECMDID_PRINT,OLECMDEXECOPT_DONTPROMPTUSER,pva In, pvaOut) ;Give the browser enough time to print before closing the object TimeDelay(1) objBrowserDoc = "" objAll = "" objBrowser = "" Return(1) #EndFunction file = "c:\temp\test.jpg" If FileExist(file)then PrintGraphic(File) else Message("Error","Unable to locate file. Check file path.") Exit See Also: COM, ObjectOpen, ObjectClose, ObjectTypeGet, BinaryAllocArray 443 ObjectTypeGet ObjectTypeGet Gets the COM/OLE variant type of a WIL variable. Syntax: ObjectTypeGet(object-reference) Parameters: (r) object-reference Returns: (s) variable containing an object reference. COM/OLE variant-type or a blank string (""). This function will return a blank string ("") if the variable passed is a non variant type. "variant-type" can be one of the following: Variant Type EMPTY NULL I1 UI1 I2 UI2 I4 INT UI4 UINT I8 UI8 R4 R8 DECIMAL CY DATE BSTR BOOL ERROR 444 Meaning No data, the size of the value is zero. This is like a pointer to NULL. 1-byte signed integer. 1-byte unsigned integer. Two bytes representing a 2-byte signed integer value. 2-byte unsigned integer. 4-byte signed integer value. 4-byte signed integer value (equivalent to VT_I4). 4-byte unsigned integer. 4-byte unsigned integer (equivalent to VT_UI4). 8-byte signed integer. 8-byte unsigned integer. 32-bit IEEE floating point value. 64-bit IEEE floating point value. A decimal value, specified as a string in the form "#DECIMAL:value". A currency value, specified as a string in the form "#CURRENCY:value". A date/time value, specified as a string in Ymd or YmdHms format. A string. A Boolean (True/False) value. A DWORD containing a status code. ObjectTypeGet FILETIME LPSTR LPWSTR CLSID CF BLOB BSTR_BLOB BLOBOBJECT STREAM STREAMED_OBJE CT STORAGE STORED_OBJECT 64-bit FILETIME structure as defined by Win32. It is recommended that all times be stored in Universal Coordinate Time (UTC). Pointer to a null-terminated ANSI string in the system default code page. Pointer to a null-terminated Unicode string in the user's default locale. Pointer to a class identifier (CLSID) (or other globally unique identifier (GUID)). Pointer to a CLIPDATA structure. DWORD count of bytes, followed by that many bytes of data. The byte count does not include the four bytes for the length of the count itself; an empty blob member would have a count of zero, followed by zero bytes. This is similar to the value VT_BSTR but does not guarantee a null byte at the end of the data. Reserved for system use. A blob member containing a serialized object in the same representation that would appear in VT_STREAMED_OBJECT. That is, a DWORD byte count (where the byte count does not include the size of itself) which is in the format of a class identifier followed by initialization data for that class. The only significant difference between VT_BLOB_OBJECT and VT_STREAMED_OBJECT is that the former does not have the system-level storage overhead that the latter would have, and is therefore more suitable for scenarios involving numbers of small objects. Pointer to an IStream interface, representing a stream which is a sibling to the "Contents" stream. As in VT_STREAM, but indicates that the stream contains a serialized object, which is a CLSID followed by initialization data for the class. The stream is a sibling to the "Contents" stream that contains the property set. Pointer to an IStorageinterface, representing a storage object that is a sibling to the "Contents" stream. As in VT_STORAGE, but indicates that the designated IStoragecontains a loadable object. 445 ObjectTypeGet VECTOR ARRAY BYREF VARIANT DISPATCH UNKNOWN VOID HRESULT SAFEARRAY CARRAY 446 If the type indicator is combined with VT_VECTOR by using an OR operator, the value is one of the counted array values. This creates a DWORD count of elements, followed by a pointer to the specified repetitions of the value. For example, a type indicator of VT_LPSTR|VT_VECTOR has a DWORD element count, followed by a pointer to an array of LPSTR elements. VT_VECTOR can be combined by an OR operator with the following types: VT_I1, VT_UI1, VT_I2, VT_UI2, VT_BOOL, VT_I4, VT_UI4, VT_R4, VT_R8, VT_ERROR, VT_I8, VT_UI8, VT_CY, VT_DATE, VT_FILETIME, VT_CLSID, VT_CF, VT_BSTR, VT_LPSTR, VT_LPWSTR, and VT_VARIANT. If the type indicator is combined with VT_ARRAY by an OR operator, the value is a pointer to a SAFEARRAY. VT_ARRAY can use the OR with the following data types: VT_I1, VT_UI1, VT_I2, VT_UI2, VT_I4, VT_UI4, VT_INT, VT_UINT, VT_R4, VT_R8, VT_BOOL, VT_DECIMAL, VT_ERROR, VT_CY, VT_DATE, and VT_BSTR. VT_ARRAY cannot use OR with VT_VECTOR. If the type indicator is combined with VT_BYREF by an OR operator, the value is a reference. Reference types are interpreted as a reference to data. VT_BYREF can use OR with the following types: VT_I1, VT_UI1, VT_I2, VT_UI2, VT_I4, VT_UI4, VT_INT, VT_UINT, VT_R4, VT_R8, VT_BOOL, VT_DECIMAL, VT_ERROR, VT_CY, VT_DATE, VT_BSTR, VT_ARRAY, and VT_VARIANT. A DWORD type indicator followed by the corresponding value. VT_VARIANT can be used only with VT_VECTOR or VT_BYREF. A pointer to an object was specified. This object is known only to implement IDispatch. A pointer to an object that implements the IUnknown interface. VOID. Standard return type. VT_ARRAY in VARIANT. C-style array. ParseData USERDEFINED RECORD RESERVED User-defined type. User-defined type. This function returns the "variant-type" string for the specified variable name, or "" if it does not have a variant type. Important: Note that some of these types do not work for Automation (IDispatch) method parameters and property values. They are included for completeness. Theoretically, WinBatch will support any variant data type as long as you don't try to pass it to WinBatch functions or use it in non-COM expressions. Of course we support all the variant types that can be converted to standard WIL types in any WinBatch expression or sub expression or function call. Example: objLocator = ObjectCreate("WbemScripting.SWbemLocator") objService = objLocator.ConnectServer(".","root/cimv2","","") objSecurity = objService.Security_ objSecurity.ImpersonationLevel = 3 class = "Win32_BIOS" ; query instances query = "SELECT * FROM Win32_BIOS WHERE Name = 'Default System BIOS' AND SoftwareElementID = 'Default System BIOS' AND SoftwareElementState = '3' AND TargetOperatingSystem = '0' AND Version = 'DELL - 6'" colInstances = objService.ExecQuery(query) ; loop once for each instance ForEach objInstance in colInstances ;Check if Object is EMPTY type = ObjectTypeGet(objInstance) if type=="EMPTY" then break ; obtain properti Message("Manufacturer",objInstance.Manufacturer) Next ; close object handles colInstances = "" objSecurity = "" objService = "" objLocator = "" See Also: COM, ObjectOpen, ObjectClose, ObjectType, BinaryAllocArray ParseData Parses the passed string. 447 Pause Syntax: ParseData (string) Parameters: (s) string string to be parsed. Returns: (i) number of parameters in string. This function breaks a string constant or string variable into new sub-string variables named param1, param2, etc.. Blank spaces in the original string are used as delimiters to create the new variables. Param0 is the count of how many sub-strings are found in "string". Example: data = "Alpha Bravo Charlie Delta" ParseData(data) reverse = StrCat(param4," ",param3," ",param2," ",param1) Message(data,reverse) See Also: ItemExtract, StrSub Pause Provides a message to user. User may cancel processing. Syntax: Pause (title, text) Parameters: (s) title (s) text title of pause box. text of the message to be displayed. Returns: (i) always 1. This function displays a message to the user with an exclamation point icon. The user may respond by selecting the OK button, or may cancel the processing by selecting Cancel. The Pause function is similar to the Message function, except for the addition of the Cancel button and icon. Example: Pause("Change Disks", "Insert new disk into Drive A:") exit 448 PipeClientClose which produces: See Also: Display, Exit, Message, Terminate PipeClientClose Closes a named pipe connection. Syntax: PipeClientClose(pipe-handle) Parameters: (i) pipe-handle pipe handle returned by PipeClientOpen. Returns: (i) always 1. Example: ;-----------; CLIENT.WBT ;-----------server = "myserver" ; Or "." for the local machine pipename = "fluggle" pipepath = StrCat("\\",server,"\pipe\",pipename) querydata = "GET_TIME" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Client","Initializing connection to server...") While @TRUE pipehandle = PipeClientOpen(pipepath,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue ; try again data=PipeClientSendRecvData(pipehandle, querydata,timeout) BoxText(StrCat("Data sent from server = ", data, notice)) PipeClientClose(pipehandle) Endwhile Message("Client","Exited") Exit ;------------ 449 PipeClientOpen ; SERVER.WBT ;-----------pipename="\\.\pipe\fluggle" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Server","Initializing - Awaiting connect from Client") While @TRUE ; General Server loop pipehandle = PipeServerCreate(pipename,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue readinfo = PipeServerRead(pipehandle, timeout) if readinfo=="*ERROR*" || readinfo=="*TIMER*" PipeServerClose(pipehandle,0) continue ; try again endif if readinfo == "GET_TIME" response= TimeYmdHms() else response = "ERROR: UNKNOWN REQUEST" endif rslt=PipeServerWrite(pipehandle,response) BoxText(StrCat("Data sent to client = ",response, notice)) PipeServerClose(pipehandle,timeout) Endwhile Message("Server","Exited") Exit See Also: PipeClientOpen, PipeClientSendRecvData, PipeInfo, PipeServerClose, PipeServerCreate, PipeServerRead, PipeServerWrite PipeClientOpen Connects to a named pipe. Syntax: PipeClientOpen(pipe-name, timeout) Parameters: (s) pipe-name (i) timeout Returns: (i/s) Example: ;-----------; CLIENT.WBT 450 specifies the name of a pipe, in one of these forms: \\ServerName\pipe\PipeName \\.\pipe\PipeName specifies the timeout period in seconds, or -1 for no timeout. returns a pipe handle on success, or "*TIMER*". PipeClientOpen ;-----------server = "myserver" ; Or "." for the local machine pipename = "fluggle" pipepath = StrCat("\\",server,"\pipe\",pipename) querydata = "GET_TIME" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Client","Initializing connection to server...") While @TRUE pipehandle = PipeClientOpen(pipepath,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue ; try again data=PipeClientSendRecvData(pipehandle, querydata,timeout) BoxText(StrCat("Data sent from server = ", data, notice)) PipeClientClose(pipehandle) Endwhile Message("Client","Exited") Exit ;-----------; SERVER.WBT ;-----------pipename="\\.\pipe\fluggle" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Server","Initializing - Awaiting connect from Client") While @TRUE ; General Server loop pipehandle = PipeServerCreate(pipename,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue readinfo = PipeServerRead(pipehandle, timeout) if readinfo=="*ERROR*" || readinfo=="*TIMER*" PipeServerClose(pipehandle,0) continue ; try again endif if readinfo == "GET_TIME" response= TimeYmdHms() else response = "ERROR: UNKNOWN REQUEST" endif rslt=PipeServerWrite(pipehandle,response) BoxText(StrCat("Data sent to client = ",response, notice)) PipeServerClose(pipehandle,timeout) Endwhile Message("Server","Exited") Exit See Also: PipeClientClose, PipeClientSendRecvData, PipeInfo, PipeServerClose, PipeServerCreate, PipeServerRead, PipeServerWrite 451 PipeClientSendRecvData PipeClientSendRecvData Writes a message to a named pipe and then reads a message back. Syntax: PipeClientSendRecvData(pipe-handle, data, read-timeout) Parameters: (i) pipe-handle (s) data (i) read-timeout Returns: (s) pipe handle returned by PipeClientOpen. message/data to send to named pipe. specifies the timeout period in seconds, or -1 for no timeout. Returns a message string on success; "*ERROR*" on error; "*TIMER*" on timeout. Example: ;-----------; CLIENT.WBT ;-----------server = "myserver" ; Or "." for the local machine pipename = "fluggle" pipepath = StrCat("\\",server,"\pipe\",pipename) querydata = "GET_TIME" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Client","Initializing connection to server...") While @TRUE pipehandle = PipeClientOpen(pipepath,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue ; try again data=PipeClientSendRecvData(pipehandle, querydata,timeout) BoxText(StrCat("Data sent from server = ", data, notice)) PipeClientClose(pipehandle) Endwhile Message("Client","Exited") Exit ;-----------; SERVER.WBT ;-----------pipename="\\.\pipe\fluggle" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Server","Initializing - Awaiting connect from Client") While @TRUE ; General Server loop pipehandle = PipeServerCreate(pipename,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue readinfo = PipeServerRead(pipehandle, timeout) 452 PipeInfo if readinfo=="*ERROR*" || readinfo=="*TIMER*" PipeServerClose(pipehandle,0) continue ; try again endif if readinfo == "GET_TIME" response= TimeYmdHms() else response = "ERROR: UNKNOWN REQUEST" endif rslt=PipeServerWrite(pipehandle,response) BoxText(StrCat("Data sent to client = ",response, notice)) PipeServerClose(pipehandle,timeout) Endwhile Message("Server","Exited") Exit See Also: PipeClientClose, PipeClientOpen, PipeInfo, PipeServerClose, PipeServerCreate, PipeServerRead, PipeServerWrite PipeInfo Returns information about a pipe or pipe operation. Syntax: PipeInfo(request, pipe-handle) Parameters: (i) request (i) pipe-handle see below. pipe handle returned by PipeClientOpen. Returns: (i) depends on request. Request Returns 0 Error code for last unsuccessful pipe function ("pipe-handle" is ignored) Example: ;-----------; CLIENT.WBT ;-----------server = "myserver" ; Or "." for the local machine pipename = "fluggle" pipepath = StrCat("\\",server,"\pipe\",pipename) querydata = "GET_TIME" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") 453 PipeInfo BoxOpen("Time Client","Initializing connection to server...") While @TRUE pipehandle = PipeClientOpen(pipepath,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" Message("PipeClientOpen Error", PipeInfo(0, 0)) continue ; try again endif data=PipeClientSendRecvData(pipehandle, querydata,timeout) BoxText(StrCat("Data sent from server = ", data, notice)) PipeClientClose(pipehandle) Endwhile Message("Client","Exited") Exit ;-----------; SERVER.WBT ;-----------pipename="\\.\pipe\fluggle" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Server","Initializing - Awaiting connect from Client") While @TRUE ; General Server loop pipehandle = PipeServerCreate(pipename,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" Message("PipeServerCreate Error", PipeInfo(0, 0)) continue ; try again endif readinfo = PipeServerRead(pipehandle, timeout) if readinfo=="*ERROR*" || readinfo=="*TIMER*" Message("PipeServerRead Error", PipeInfo(0, 0)) PipeServerClose(pipehandle,0) continue ; try again endif if readinfo == "GET_TIME" response= TimeYmdHms() else response = "ERROR: UNKNOWN REQUEST" endif rslt=PipeServerWrite(pipehandle,response) BoxText(StrCat("Data sent to client = ",response, notice)) PipeServerClose(pipehandle,timeout) Endwhile Message("Server","Exited") Exit See Also: PipeClientClose, PipeClientOpen, PipeClientSendRecvData, PipeServerClose, PipeServerCreate, PipeServerRead, PipeServerWrite 454 PipeServerClose PipeServerClose Closes a named pipe instance. Syntax: PipeServerClose(pipe-handle, timeout) Parameters: (i) pipe-handle (i) timeout pipe handle returned by PipeServerCreate. specifies the timeout period in seconds, or -1 for no timeout. Returns: (i/s) returns 1 on success, or "*TIMER*" on timeout. If there is a client connected to the pipe, the function will wait "timeout" seconds for the client to close its end of the pipe. Example: ;-----------; CLIENT.WBT ;-----------server = "myserver" ; Or "." for the local machine pipename = "fluggle" pipepath = StrCat("\\",server,"\pipe\",pipename) querydata = "GET_TIME" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Client","Initializing connection to server...") While @TRUE pipehandle = PipeClientOpen(pipepath,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue ; try again data=PipeClientSendRecvData(pipehandle, querydata,timeout) BoxText(StrCat("Data sent from server = ", data, notice)) PipeClientClose(pipehandle) Endwhile Message("Client","Exited") Exit ;-----------; SERVER.WBT ;-----------pipename="\\.\pipe\fluggle" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Server","Initializing - Awaiting connect from Client") While @TRUE ; General Server loop pipehandle = PipeServerCreate(pipename,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue 455 PipeServerCreate readinfo = PipeServerRead(pipehandle, timeout) if readinfo=="*ERROR*" || readinfo=="*TIMER*" PipeServerClose(pipehandle,0) continue ; try again endif if readinfo == "GET_TIME" response= TimeYmdHms() else response = "ERROR: UNKNOWN REQUEST" endif rslt=PipeServerWrite(pipehandle,response) BoxText(StrCat("Data sent to client = ",response, notice)) PipeServerClose(pipehandle,timeout) Endwhile Message("Server","Exited") Exit See Also: PipeClientClose, PipeClientOpen, PipeClientSendRecvData, PipeInfo, PipeServerCreate, PipeServerRead, PipeServerWrite PipeServerCreate Creates an instance of a named pipe and waits for a client to connect. (Windows NT family only) Syntax: PipeServerCreate(pipe-name, timeout) Parameters: (s) pipe-name (i) timeout Returns: (i/s) specifies the name of a pipe, in the form: \\.\pipe\PipeName specifies the timeout period in seconds that it will wait for a client to connect., or -1 for no timeout. a pipe handle on success; "*TIMER*" on timeout. A maximum of 100 instances of a pipe can be created. Example: ;-----------; CLIENT.WBT ;-----------server = "myserver" ; Or "." for the local machine pipename = "fluggle" pipepath = StrCat("\\",server,"\pipe\",pipename) querydata = "GET_TIME" timeout = -1 456 PipeServerRead IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Client","Initializing connection to server...") While @TRUE pipehandle = PipeClientOpen(pipepath,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue ; try again data=PipeClientSendRecvData(pipehandle, querydata,timeout) BoxText(StrCat("Data sent from server = ", data, notice)) PipeClientClose(pipehandle) Endwhile Message("Client","Exited") Exit ;-----------; SERVER.WBT ;-----------pipename="\\.\pipe\fluggle" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Server","Initializing - Awaiting connect from Client") While @TRUE ; General Server loop pipehandle = PipeServerCreate(pipename,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue readinfo = PipeServerRead(pipehandle, timeout) if readinfo=="*ERROR*" || readinfo=="*TIMER*" PipeServerClose(pipehandle,0) continue ; try again endif if readinfo == "GET_TIME" response= TimeYmdHms() else response = "ERROR: UNKNOWN REQUEST" endif rslt=PipeServerWrite(pipehandle,response) BoxText(StrCat("Data sent to client = ",response, notice)) PipeServerClose(pipehandle,timeout) Endwhile Message("Server","Exited") Exit See Also: PipeClientClose, PipeClientOpen, PipeClientSendRecvData, PipeInfo, PipeServerClose, PipeServerRead, PipeServerWrite PipeServerRead Reads a message from a named pipe. 457 PipeServerRead Syntax: PipeServerRead(pipe-handle, timeout) Parameters: (i) pipe-handle (i) timeout Returns: (s) pipe handle returned by PipeServerCreate. specifies the timeout period in seconds, or -1 for no timeout. a message string on success; "*ERROR*" upon error; "*TIMER*" on timeout. Example: ;-----------; CLIENT.WBT ;-----------server = "myserver" ; Or "." for the local machine pipename = "fluggle" pipepath = StrCat("\\",server,"\pipe\",pipename) querydata = "GET_TIME" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Client","Initializing connection to server...") While @TRUE pipehandle = PipeClientOpen(pipepath,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue ; try again data=PipeClientSendRecvData(pipehandle, querydata,timeout) BoxText(StrCat("Data sent from server = ", data, notice)) PipeClientClose(pipehandle) Endwhile Message("Client","Exited") Exit ;-----------; SERVER.WBT ;-----------pipename="\\.\pipe\fluggle" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Server","Initializing - Awaiting connect from Client") While @TRUE ; General Server loop pipehandle = PipeServerCreate(pipename,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue readinfo = PipeServerRead(pipehandle, timeout) if readinfo=="*ERROR*" || readinfo=="*TIMER*" PipeServerClose(pipehandle,0) continue ; try again endif if readinfo == "GET_TIME" 458 PipeServerWrite response= TimeYmdHms() else response = "ERROR: UNKNOWN REQUEST" endif rslt=PipeServerWrite(pipehandle,response) BoxText(StrCat("Data sent to client = ",response, notice)) PipeServerClose(pipehandle,timeout) Endwhile Message("Server","Exited") Exit See Also: PipeClientClose, PipeClientOpen, PipeClientSendRecvData, PipeInfo, PipeServerClose, PipeServerCreate, PipeServerWrite PipeServerWrite Writes a message to a named pipe. Syntax: PipeServerWrite(pipe-handle, data) Parameters: (i) pipe-handle (s) data pipe handle returned by PipeServerCreate. message/data to send to named pipe. Returns: (i/s) returns 1 on success; "*ERROR*" upon error. Example: ;-----------; CLIENT.WBT ;-----------server = "myserver" ; Or "." for the local machine pipename = "fluggle" pipepath = StrCat("\\",server,"\pipe\",pipename) querydata = "GET_TIME" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Client","Initializing connection to server...") While @TRUE pipehandle = PipeClientOpen(pipepath,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue ; try again data=PipeClientSendRecvData(pipehandle, querydata,timeout) BoxText(StrCat("Data sent from server = ", data, notice)) PipeClientClose(pipehandle) Endwhile Message("Client","Exited") 459 PlayMedia Exit ;-----------; SERVER.WBT ;-----------pipename="\\.\pipe\fluggle" timeout = -1 IntControl(12,5,0,0,0);terminate quietly notice = StrCat(@CRLF,@CRLF,"[ Press CTRL+BREAK to exit script ]") BoxOpen("Time Server","Initializing - Awaiting connect from Client") While @TRUE ; General Server loop pipehandle = PipeServerCreate(pipename,timeout) if pipehandle=="*ERROR*" || pipehandle=="*TIMER*" then continue readinfo = PipeServerRead(pipehandle, timeout) if readinfo=="*ERROR*" || readinfo=="*TIMER*" PipeServerClose(pipehandle,0) continue ; try again endif if readinfo == "GET_TIME" response= TimeYmdHms() else response = "ERROR: UNKNOWN REQUEST" endif rslt=PipeServerWrite(pipehandle,response) BoxText(StrCat("Data sent to client = ",response, notice)) PipeServerClose(pipehandle,timeout) Endwhile Message("Server","Exited") Exit See Also: PipeClientClose, PipeClientOpen, PipeClientSendRecvData, PipeInfo, PipeServerClose, PipeServerCreate, PipeServerRead PlayMedia Controls multimedia devices. Syntax: PlayMedia (mci-string) Parameters: (s) mci-string string to be sent to the multimedia device. Returns: (s) response from the device. If the appropriate Windows multimedia extensions are present, this function can control multimedia devices. Valid command strings depend on the multimedia devices and drivers installed. The basic Windows multimedia package has a 460 PlayMedia waveform device to play and record waveforms, and a sequencer device to play MIDI files. Refer to the appropriate documentation for information on command strings. Many multimedia devices accept the WAIT or NOTIFY parameters as part of the command string: WAIT Causes the system to stop processing input until the requested operation is complete. You cannot switch tasks when WAIT is specified. WAIT NOTIFY Same as WAIT NOTIFY Causes the WIL program to suspend execution until the requested operation completes. You can perform other tasks and switch between tasks when NOTIFY is specified. If neither WAIT nor NOTIFY is specified, the multimedia operation is started and control returns immediately to the WIL program. In general, if you simply want the WIL program to wait until the multimedia operation is complete, use the NOTIFY keyword. If you want the system to hang until the operation is complete, use WAIT. If you just want to start a multimedia operation and have the program continue processing, don't use either keyword. The return value from PlayMedia is whatever string the driver returns. This will depend on the particular driver, as well as on the type of operation performed. Example: ; Plays a music CD on a CDAudio drive, from start to finish stat = PlayMedia("status cdaudio mode") answer = 1 If stat == "playing" answer = AskYesNo("CD Audio", "CD is Playing. Stop?") If answer == 0 Then Exit endif PlayMedia("open cdaudio shareable alias donna notify") PlayMedia("set donna time format tmsf") PlayMedia("play donna from 1") PlayMedia("close donna") Exit :cancel PlayMedia("set cdaudio door open") See Also: Beep, PlayMidi, PlayWaveForm, Sounds 461 PlayWaveForm PlayMidi Plays a MID or RMI sound file. Syntax: PlayMidi (filename, mode) Parameters: (s) filename (i) mode name of the MID or RMI sound file. play mode (see below). Returns: (i) @TRUE if successful; @FALSE if unsuccessful. If Windows multimedia sound extensions are present, and MIDI-compatible hardware is installed, this function will play a MID or RMI sound file. If "filename" is not in the current directory and a directory is not specified, the path will be searched to find the file. If "mode" is set to 0, the WIL program will wait for the sound file to complete before continuing. If "mode" is set to 1, it will start playing the sound file and continue immediately. Example: PlayMidi("C:\windows\media\canyon.mid", 1) Message("PlayMidi","Midi Played") See Also: Beep, PlayMedia, PlayWaveForm, Sounds PlayWaveForm Plays a WAV sound file. Syntax: PlayWaveForm (filename, mode) Parameters: (s) filename (i) mode name of the WAV sound file. play mode (see below). Returns: (i) @TRUE if successful; @FALSE if unsuccessful. If Windows multimedia sound extensions are present, and waveform-compatible hardware is installed, this function will play a WAV sound file. If "filename" is not in the current directory and a directory is not specified, the path will be searched to find the file. If "filename" is not found, the WAV file associated with the "SystemDefault" keyword is played, (unless the "NoDefault" setting is on). 462 PtrGlobal Instead of specifying an actual filename, you may specify a keyword name from the [Sound] section of the WIN.INI file (e.g., "SystemStart"), or equivalent Registry key, in which case the WAV file associated with that keyword name will be played. "Mode" is a bitmask, composed of the following bits, combine using the binary OR operator. Mode 0 1 2 9 16 Meaning Wait for the sound to end before continuing. Don't wait for the sound to end. Start the sound and immediately process more statements. If sound file not found, do not play a default sound Continue playing the sound forever, or until a PlayWaveForm(" ", 0) statement is executed If another sound is already playing, do not interrupt it. Just ignore this PlayWaveForm request. The command PlayWaveForm(" ", 0) can be used at any time to stop sound. Examples: PlayWaveForm("tada.wav", 0) PlayWaveForm("SystemDefault", 1 | 16) Message("PlayWaveForm"," Done.") See Also: Beep, PlayMedia, PlayMidi, Sounds PtrGlobal Retrieves a "pointer" to a global variable. Syntax: PtrGlobal (variable-name) Parameters: (s) variable-name specifies a variable name. Returns: (s) pointer a pointer string. "variable-name" must have been previously been marked as global using PtrGlobalDefine. Example: #DefineFunction CheckGlobalValue() Ptr_Global_A=PtrGlobal(Global_A) Ptr_Global_B=PtrGlobal(Global_B) if *Ptr_Global_A != "Potatoes" 463 PtrGlobalDefine Message("Error","Global_A is not the expected value") endif *Ptr_Global_B = 1234 #EndFunction PtrGlobalDefine( Global_A) PtrGlobalDefine( Global_B) Global_A = "Potatoes" retvalue=CheckGlobalValue() If Global_B != 1234 Message("Error","Global_B is not the expected value") endif See Also: PtrGlobalDefine, PtrPersistent PtrGlobalDefine Creates a "pointer" to a global variable. Syntax: PtrGlobalDefine(variable-name) Parameters: (s) variable-name specifies a variable name. Returns: (s) a pointer string. This function can only be called from the main script, not from a UDF. If "variable-name" does not already exist, it will be created. Example: #DefineFunction CheckGlobalValue() Ptr_Global_A=PtrGlobal(Global_A) Ptr_Global_B=PtrGlobal(Global_B) if *Ptr_Global_A != "Potatoes" Message("Error","Global_A is not the expected value") endif *Ptr_Global_B = 1234 #EndFunction PtrGlobalDefine( Global_A) PtrGlobalDefine( Global_B) Global_A = "Potatoes" retvalue=CheckGlobalValue() If Global_B != 1234 Message("Error","Global_B is not the expected value") endif 464 PtrPersistent See Also: PtrGlobal, PtrPersistent PtrGlobalTest Tests whether a variable has been marked as being globally accessible. Syntax: PtrGlobalTest(variable-name) Parameters: (s) variable-name specifies a variable name. Returns: (i) @TRUE globally accessible; @FALSE if not. Example: #DefineFunction CheckGlobalValue() Ptr_Global_A=PtrGlobal(Global_A) *Ptr_Global_A = 1234 #EndFunction PtrGlobalDefine( Global_A) ret = PtrGlobalTest( Global_A) If ret == @TRUE Message("PtrGlobalTest","Global_A is globally accessible") EndIf See Also: PtrGlobal, PtrGlobalDefine, PtrPersistent PtrPersistent Creates a "pointer" to a persistent variable. Syntax: PtrPersistent(variable-name, value) Parameters: (s) variable-name (s/i) value Returns: (s) specifies a variable name which CANNOT be longer than 25 characters. specifies a value which will be assigned to "variable-name" if the variable does not already exist. a pointer string. 465 Print This function marks a variable as persistent. If called from a UDF, the variable will retain its value after the UDF returns. If variable does not already exist, it will be created. If it already exists, its value will not be changed. A "persistent" variable is defined and used in a single UDF. But unlike other UDF variables, it "stays around". Kind of like a private global variable that no other UDF's can see. For example, if a UDF wants to save away some information that it needs, it can use a persistent variable. The next time the UDF is called, its persistnt variable is still there, with what ever value was left over from the previous call to it.' Example: #DefineFunction IncMyCounter(flag) ; flag = 0 will report on current value of counter ; flag = 1 will increment counter first Ptr_MyCounter = PtrPersistent(MyCounter,0) if flag==1 ; report on number of calls *Ptr_MyCounter = *Ptr_MyCounter + 1 endif return *Ptr_Mycounter #EndFunction r=Random(100) for xx = 1 to r IncMyCounter(1) next cnt=IncMyCounter(0) Message("Counter Value is",cnt) See Also: PtrGlobal, PtrGlobalDefine Print Instructs the application responsible for a file to print the file on the default printer. Syntax: Print(data file, directory, display mode, reserved) Parameters: (s) data file (s) directory (i) display mode (i) reserved Returns: (i) 466 the name of the file to print. current working directory (if applicable). @NORMAL, @ICON, @ZOOMED, @HIDDEN. reserved. @TRUE if the function completed; @FALSE if an error occurred. Registration Database Operations Instructs the application responsible for a file to print the file on the default printer. The Windows ShellExecute API is used. It examines the extension of the data file, looks the extension up in the Windows registry to determine the owning application, starts the owning application, and instructs it, also according to data specified in the registry, to print the data file. Most applications will send the printout to the default printer, however the exact action taken by the application is under the application’s own control. Applications that support this command or their setup programs will generally make the necessary modifications to the Windows registry to allow this function to perform successfully. Example: FileCopy("C:\config.sys", "xxx.txt", 0) a=Print("xxx.txt", DirGet( ), @NORMAL, 0) exit See Also: RunShell Random Computes a pseudo-random number. Syntax: Random (max) Parameters: (i) max largest desired integer number. Returns: (i) difficult to predict, positive number. This function will return a random integer between 0 and max. Example: a = Random(79) Message("Random number between 0 and 79", a) See Also: IntControl 81, Average, Max, Min Registration Database Operations In the early days of Windows, there was a single INI file, WIN.INI. As Windows advanced, the WIN.INI file became cluttered, and it was then subdivided into SYSTEM.INI, WIN.INI and a large number of application specific INI files. 467 Registration Database Operations With the advent of COM/OLE, Windows NT, and other advancements in operating system technology, the simple INI files could not hold or organize the new and vast amounts of information required to run a modern operating system. For this reason, a new data storage structure was developed. Sometimes called the Registry or the Registration Database, this new file was designed to be able to hold and organize large amounts of seemingly random information. The Registration Database is organized in a tree structure, much like a file system. At every level "keys" to the data exist. The keys are analogous to the sub-directories in a file system. A set of keys to a data item look very much like a path to a filename. In Windows, the Registration Database may be viewed and altered with the "RegEdit" utility. It requires a "/v" parameter, as in "regedit.exe /v", to enable the edit mode of the utility. There exists the "RegEdt32" utility in Windows NT+ that allows access to the Registration Database. CAUTION: The reason that these utilities are not made easily accessible is that it is trivially easy to make a modification to the database that will completely ruin a Windows installation, and may require a complete re-install of Windows to get the system running again. It is best to study the database and understand what is going on, instead of perhaps using a somewhat common "trial and error" method of making changes. There are two ways to query and set information in the Registration Database. The easy way is to simply base all operations on an always open root key. Using just the RegQueryValue and RegSetValue functions you can alter all data associated with pre-defined keys. The other more complicated and more flexible method is to open or create a desired key, using the RegOpenKey or RegCreateKey functions, modify the database with other registration functions, passing it a handle to the key, and then finally close the database with the RegCloseKey function. Most of the registration functions accept both a handle to a key and a subkey string which further defines a lower key. Oftentimes the subkey string is simply set to null (empty quotes), and the handle points directly to the destination. At other times, one of the pre-defined roots of the database is passed as the handle and the subkey string points all the way down to the desired data item. Pre-defined keys are provided. Windows provides several keys, as shown in the table below: 32 Bit Windows handles to "always open" keys @REGMACHINE Root of the machine section of the Registration Database. HKEY_LOCAL_MACHINE @REGCLASSES Shortcut to the classes sub-section. HKEY_CLASSES_ROOT 468 RegApp @REGUSERS Root of the user section of the Registration Database. HKEY_USERS @REGCURRENT Shortcut to the current user’s sub-section. HKEY_CURRENT_USER Note: Named data entries as found in Windows are specified by enclosing the "data item name" in square brackets at the end of the key string. For Example: RegSetValue(@REGMACHINE,"SOFTWARE\Wilson WindowWare\Settings\WWWBATCH\MAIN[SOUNDS]",1) Use [] to refer a '(Default)' data item under a specified key. For Example: ;this example gets the DEFAULT value under a specific key ret=RegQueryValue(@REGCLASSES,"txtfile[]") message("Value of default key",ret) RegApp Creates registry entries for a program under "App Paths". Syntax: RegApp(program-name, path) Parameters: (s) program-name (s) path Returns: (i) the name of an executable program (EXE), optionally containing a path. optional desired "PATH" setting for the specified program. @TRUE entry was created; @FALSE operation failed. This function creates (or updates) a sub-key in the registration database for the specified program, of the form PROGNAME.EXE, under the key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ If "program-name" does not contain a path, the function will search for it on the path. The function creates a "(Default)" value for the key, containing the full path to the specified program. If the "path" parameter is not a blank string (""), the function also creates a "Path" value for the key. This should contain one or more directories (separated by semicolons) which you want to be prepended to the existing "PATH" environment variable when the program is run. 469 RegConnect Windows Vista: This function may require an Administrator level account, because it attempts to write to the HKEY_LOCAL_MACHINE registry key. Example: residence="c:\msoffice\excel.exe" path="c:\msoffice\excel;c:\msoffice\winword" RegApp(residence, path) Message("Excel.EXE","Registered at %residence% and use path %path%") See Also: InstallFile, RegOpenKey, RegCreateKey, RegQueryValue, RegQueryKey and the section on Registration Database Operations (pg. 467) RegCloseKey Closes a key to the Registration Database. Syntax: RegCloseKey(handle) Parameters: (i) handle handle to a registration database key. Returns: (i) @TRUE database was closed; @FALSE close failed. The RegCloseKey function closes a key to the Registration Database. The key is opened or created with the RegOpenKey or the RegCreateKey functions. Registration Database changes made using a key are saved when the key is closed. Example: key=RegOpenkey(@RegClasses, "txtfile") b=RegQueryValue(key, "shell\open\command") RegCloseKey(key) Message("Default textfile editor is", b) See Also: RegOpenKey, RegCreateKey, RegSetValue, RegQueryValue and the section on Registration Database Operations (pg. 467) RegConnect Connects to a predefined registry handle on another computer. Syntax: RegConnect(computer-name, handle,[remoteOSflag]) Parameters: (s) computer-name (i) handle 470 the name of the computer in the form of "\\computername". either @REGMACHINE OR @REGUSERS RegCreateKey (s) remoteOSflag Returns: (s) [optional] indicate the processor architecture used by the remote operating system. a key handle to the specified handle on the remote computer. remoteOSflag Optional parameter that indicates the processor architecture or 'bitness' used by the remote operating system. Set the optional parameter to the string "RemoteOS32", if the remote computer is running a 32-bit version of Windows and the computer running the script is using a 64-bit version of Windows. Set the optional parameter to "RemoteOS64", if the remote computer is running a 64-bit version of Windows and the computer running the script is using 32-bit version of Windows. If the remote computer and the computer running the script are using the same bitness, do not supply a value for this parameter. Note: When a handle returned by RegConnect is no longer needed, it should be closed by calling RegCloseKey. May need to call wntCancelCon, if explicitly connected to the IPC$ share (i.e., via wntAddDrive). Windows Vista: This function may require an Administrator level account. Example: Fred=RegConnect("\\FRED", @REGMACHINE, "") Iver=RegQueryValue(Fred, "SOFTWARE\Microsoft\Internet Explorer[Iver]") RegCloseKey(Fred) Message("Internet Explorer Version Installed on \\Fred.", Iver) See Also: RegCreateKey, RegCloseKey, RegDeleteKey, RegSetValue, RegQueryValue, RegQueryKey and the section on Registration Database Operations (pg. 467) RegCreateKey Returns a handle to a new registration database key. Syntax: RegCreateKey(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string handle to a registration database key. a path from the key provided to the desired key. 471 RegDeleteKey (i) view-flag Returns: (i) [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. a handle to the new key. The RegCreateKey function will create and open a desired key into the Registration Database. If the key already exists, RegCreateKey will open it. When using RegCreateKey you must pass a pre-existing, open key to create a new key. A predefined key may be used. Example: ; Associate DIZ files with the default textfile editor key=RegCreatekey(@REGCLASSES, ".diz") RegSetValue(key, "", "txtfile") RegClosekey(key) Message("RegCreatekey","*.DIZ files now associated with your text editor") See Also: RegOpenKey, RegCloseKey, RegDeleteKey, RegSetValue, RegQueryValue, RegQueryKey and the section on Registration Database Operations (pg. 467) RegDeleteKey Deletes a key and data items associated with the key. Syntax: RegDeleteKey(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (i) an open registration database key (see below). a path from the key provided to the desired key. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. @TRUE key was deleted; @FALSE key was not found. The RegDeleteKey function will delete a pre-existing key from the Registration Database. If the key does not exist, RegDeleteKey will fail. When using RegDeleteKey you must pass a pre-existing, open key to access the desired key. A pre-defined key may be used. 472 RegDelValue Example: ; Delete default operation for *.DIZ files ; from the registration database ErrorMode(@off) RegDeleteKey(@REGCLASSES, ".diz") ErrorMode(@cancel) Message("Regdeletekey","*.DIZ files no longer associated with text editor") See Also: RegOpenKey, RegCreateKey, RegCloseKey, RegDelValue and the section on Registration Database Operations (pg. 467) RegDelValue Deletes a named value data item for the specified subkey from the registry. Syntax: RegDelValue(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (i) handle to a registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. @TRUE data item was deleted; @FALSE data was not found. The "data item name" in the Subkey-string must be enclosed in square brackets (see RegSetValue). Use "[]" for the data item name to delete the "default" value. Example: ;To turn Sounds ON in the case Sounds was disabled. ErrorMode(@off) RegDelValue(@REGMACHINE, "SOFTWARE\Wilson WindowWare\Settings\WWWBATCH\MAIN[SOUNDS]") ErrorMode(@cancel) Message("Sounds", "Sound Settings - Sounds is on.") See Also: RegOpenKey, RegCreateKey, RegCloseKey, RegDeleteKey, RegQueryValue, RegSetValue and the section on Registration Database Operations (pg. 467) 473 RegEntryType RegEntryType Returns the type of data for the specified subkey. Syntax: RegEntryType(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (s) an open registration database key. (see below). a path from the key provided to the desired key. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. data type of specified subkey. (see below). The return value will be one of the following: Value 0 1 2 DataType (REG_NONE) (REG_SZ) (REG_EXPAND_SZ) 3 4 5 (REG_BINARY) (REG_DWORD) (REG_DWORD_BIG_ENDIAN) 6 (REG_LINK) 7 (REG_MULTI_SZ) 8 (REG_RESOURCE_LIST) 9 (REG_FULL_RESOURCE_DESCRIPTOR) 10 11 (REG_RESOURCE_REQUIREMENTS_LIST) (REG_QWORD) 474 Description No value type An ANSI string ANSI string that contains unexpanded references to environment variables (for example, %PATH%). Free form binary 32-bit number 32-bit number, high byte first Symbolic Link (Unicode) A delimited list of ANSI strings. Resource list in the resource map Resource list in the hardware description Resource requirements 64-bit number RegEntryType Example: ;This set of UDFs can clone or rename a registry key ;It is not blindingly fast, but should be ok for smaller trees. ;CopyRegValue - Copies one single value from one place to another ;CloneRegTree - copies one tree from one place to another ;RenameRegTree - Renames a tree. ;However, due to the fact that the registry API does not have ;a rename facility, the RenameRegTreeis implemented by first ;cloning the tree, then deleting the original tree. ;Keys are used by first obtaining a handle to one. One of the ;predefined handles (@REGMACHINE @REGCURRENT, etc) or a handle ;returned by one of the registry functions RegConnect, RegCreateKey ;or RegOpenKey may be used ;Each function needs a handle to a section in the registry ;database in addition to a string that consists of the subkey to ;an entry in the Registry database. ;For current versions of Windows, there are 4 handles: @REGMACHINE, ;@REGCLASSES, @REGUSRS, and @REGCURRENT. These are WIL constants ;for HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS, and ;HKEY_CURRENT_USER. When you obtain a registry subkey from Microsoft's ;registry viewer, regedit.exe (by using Copy Key Name from the right ;mouse menu in RegEdit.exe) it will look like this example: ;HKEY_LOCAL_MACHINE\SOFTWARE\myTest\Sub2\sub21\Sub211 ;For use in the WIL registry functions, the above key must be ;divided into handle and subkey. The handle, @REGMACHINE, takes the ;place of the first item, 'HKEY_LOCAL_MACHINE\'. The subkey needed ;for the second parameter in the functions is, ;'SOFTWARE\myTest\Sub2\sub21\Sub211'. ;Note: it does not start with the '\' backslash character. ; ;Define the CopyRegValue UDF. #DefineFunction CopyRegValue(fromHandle,fromSubkey,toHandle,toSubkey) ;Stop if value does not exist. Terminate(RegExistValue(fromHandle,fromSubkey)==0,"Reg value does not exist",fromSubkey) ;Get the entry type type=RegEntryType(fromHandle,fromSubkey) ;Stop if type is not supported. Terminate( ((type<1) || (type>4)) && type!=7, "Cannot handle reg value",fromSubkey) ;Define a hopefully sufficiently obscure delimiter for the BIN function delim=Num2Char(255) ;Get the value. 475 RegEntryType value=RegQueryEx(fromHandle,fromSubkey,delim,type) ;Copy value to a new subkey. RegSetEx(toHandle,toSubkey,value,delim,type) Return ;Return nothing. #endfunction ;Define the CloneRegTree UDF. #DefineFunction CloneRegTree(fromHandle, fromSubkey, toHandle, toSubkey) ;Stop if key does not exist. Terminate(RegExistKey(fromHandle,fromSubkey)==0,"Reg key does not exist",fromSubkey) ;copy top default key ;Check value. if RegExistValue(fromhandle,fromsubkey) ;Get value. defval=RegQueryValue(fromHandle,fromSubkey) ;Set value of destination subkey. if defval!="" then RegSetValue(toHandle,toSubkey,defval) endif ;copy all values under key, if any items=RegQueryItem(fromHandle,fromSubkey) icount=ItemCount(items,@tab) for ii=1 to icount ;Assemble source subkey with value in brackets. thisitem=strcat(fromSubkey,'[',ItemExtract(ii,items,@tab),']') ;Assemble destination subkey with value in brackets. thatitem=strcat(toSubkey,'[',ItemExtract(ii,items,@tab),']') ;Copy the entry. CopyRegValue(fromHandle, thisitem, toHandle, thatitem) next ;Get list of subkeys ;Open source key with read access rights. tempkey=RegOpenKeyEX(fromHandle,fromSubkey,"READ",0,0) ;Get keys. keys=RegQueryKeys(tempkey) ;Close source key. RegCloseKey(tempkey) ;Process each subkey kcount=ItemCount(keys,@tab) for kk=1 to kcount thiskey=strcat(fromSubkey,"\",ItemExtract(kk,keys,@tab)) thatkey=strcat(toSubkey,"\",ItemExtract(kk,keys,@tab)) ;Use the CloneRegTree UDF to do the work. CloneRegTree(fromHandle,thiskey,toHandle,thatkey) next #EndFunction #DefineFunction RenameRegTree(fromHandle, fromSubkey, toHandle, toSubkey) ;Set up UDF 476 RegExistKey ;Use previous UDF to copy the source key to the destination key. CloneRegTree(fromHandle, fromSubkey, toHandle, toSubkey) ;Delete the source key. RegDeleteKey(fromHandle,fromSubkey) #EndFunction ;Test code follows. ;Registry handle. In this case, both source and destination are the same. fromHandle = @REGCURRENT toHandle = @REGCURRENT ;source subkey fromSubkey = "Software\Wilson WindowWare" ;destination subkey toSubkey = "Software\MyWilson WindowWare" ;copy the subkey CloneRegTree( fromHandle , fromSubkey , toHandle , toSubkey) Message("Progress" , "New key created.%@CRLF%%@CRLF%See this with regedit.exe, %@CRLF%Be sure to refresh it with f5!") fromSubkey = "Software\MyWilson WindowWare" toSubkey = "Software\MyOtherWilson WindowWare" ;copy the subkey to a new named key, and delete the old key. RenameRegTree( fromHandle , fromSubkey , toHandle , toSubkey) Message("Progress" , "New key copied and renamed.%@CRLF%Check this with f5 in regedit.exe.") See Also: RegQueryEx, RegSetEx and the section on Registration Database Operations (pg. 467) RegExistKey Checks whether a registry key exists. Syntax: RegExistKey(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag handle to an open registration database key. a path from the key provided to the desired key. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. 477 RegExistValue Returns: (i) @TRUE key exists and is accessible (i.e., can be opened with RegOpenKey); @FALSE doesn't exist or cannot be opened. Example: key=RegExistkey(@RegClasses, "txtfile") if key == 1 who=RegQueryStr(@REGClasses,"txtfile\shell\open\command") else message("Sorry","The specified key does not exist!") exit endif Display(3,"Default text file editor is", who) See Also: RegOpenKey and the section on Registration Database Operations (pg. 467) RegExistValue Checks whether a value for a registry key exists. Syntax: RegExistValue(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (i) an open registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. @TRUE value (data item) exists and is accessible (i.e., can be read with RegQuery[..]); @FALSE doesn't exist or cannot be read. Example: reg = RegExistValue(@REGMACHINE, "SOFTWARE\Wilson WindowWare\WinBatch\CurrentVersion") if reg == 0 Message("RegExistValue","The value doesn't exist?") exit endif 478 RegOpenFlags regkey = RegQueryValue(@REGMACHINE, "SOFTWARE\Wilson WindowWare\WinBatch\CurrentVersion[]") Message("WinBatch directory", regkey) See Also: RegQueryValue and the section on Registration Database Operations (pg. 467) RegLoadHive Loads a hive into a registry subkey. Syntax: RegLoadHive(handle, subkey, filename) Parameters: (i) handle (s) subkey (s) filename either @REGUSERS or @REGMACHINE. the name of the key to be created specifies the name of a hive file. Returns: (s) always 1. 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. Windows Vista: This function may require an Administrator level account, because it attempts to access to the HKEY_LOCAL_MACHINE registry key. Example: RegLoadHive(@REGMACHINE, "WinWare", "winware") See Also: RegUnloadHive and the section on Registration Database Operations (pg. 467) RegOpenFlags Specifies the registry view of the various Reg[..] functions. Syntax: RegOpenFlags(flag) Parameters: (i) flag a flag which specifies which view of the registry the various Reg[..] functions will see. 479 RegOpenFlags Returns: (i) previous value. This function lets you specify an alternate view of the registry for Reg[..] functions which create, open, and delete registry keys, when running on (or accessing) a 64-bit Windows platform. Flags 0 32 64 Meaning 32-bit view under Win32, 64-bit view under WOW64 (default) 32-bit view 64-bit view *IMPORTANT* Registry Redirection To prevent 32-bit registry settings from overwriting the 64-bit registry settings, computers that are running an x64-based version of Windows store the settings for 32-bit programs in a new branch in the registry. The registry redirection process enables program installations and program configuration settings to access the 'correct' registry sub key without user intervention. 32-bit programs and 64-bit programs that are running on an x64-based version of Windows operate in different modes and use the following sections in the registry: • Native mode 64-bit programs run in Native mode and access keys and values that are stored in the following registry sub key: HKEY_LOCAL_MACHINE\Software • 32-bit programs (like WinBatch) run in WOW64 mode and access keys and values that are stored in the following registry sub key: HKEY_LOCAL_MACHINE\Software\WOW6432node 2 simple rules to accessing the registry on 64-bit systems: • NEVER directly access keys stored under WOW6432node. • If you do want access something under WOW6432node, just set the registry view to 32-bit using RegOpenFlags(32) and specify the key/value without using 'WOW6432node' in the registry path. (In other words use it 's regular 32-bit key/value.) You can launch the 32-bit version of Registry Editor on a 64-bit Windows platform using the following commandline: C:\Windows\syswow64\regedit.exe Example: ;64-bit view 480 RegOpenKeyEx RegOpenFlags(64) See Also: RegOpenKeyEx, RegCreateKey, RegCloseKey, RegDeleteKey, RegSetValue, RegQueryValue, RegQueryKey and the section on Registration Database Operations (pg. 467) RegOpenKey Returns a handle to an existing registration database key. Syntax: RegOpenKey(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (i) handle to a registration database key. a path from the key provided to the desired key. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. a handle to the new key. The RegOpenKey function will open a desired key into the Registration Database. If the key does not exist, RegOpenKey will fail. When using RegOpenKey you must pass a pre-existing, open key to create a new key. A pre-defined key may be used. Note: The opened key should be closed with RegCloseKey. Example: key=RegOpenkey(@RegClasses, "txtfile");Find default text editor who=RegQueryStr(key, "shell\open\command") RegClosekey(key) Message("Default text file editor is", who) ; The preceding is actually a hard way to do ... who=RegQueryStr(@REGClasses, "txtfile\shell\open\command") Message("Default text file editor is", who) See Also: RegCreateKey, RegCloseKey, RegDeleteKey, RegSetValue, RegQueryValue, RegQueryKey and the section on Registration Database Operations (pg. 467) RegOpenKeyEx Opens a registry key with specified access rights. 481 RegOpenKeyEx Syntax: RegOpenKeyEx( handle, subkey-string, mode, view-flag, reserved) Parameters: (i) handle (s) subkey-string (s/i) mode (i) view-flag (s) reserved Returns: (i) handle to a registration database key a path from the key provided to the desired key access mode (see below) [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. reserved for future use; should be set to "". a handle to the newly-opened key. This function is like RegOpenKey, but lets the user specify the desired access rights (RegOpenKey opens a key with default access, so may fail if the user only has read permission for the key). "Mode" may be one of the following pre-defined string values: Value READ Name KEY_READ WRITE KEY_WRITE FULL KEY_ALL_ACCESS Meaning KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY | STANDARD_RIGHTS_READ KEY_SET_VALUE | KEY_CREATE_SUB_KEY | STANDARD_RIGHTS_WRITE (KEY_QUERY_VALUE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY | KEY_CREATE_LINK | STANDARD_RIGHTS_ALL) & ~SYNCHRONIZE Or, "mode" may be a bitmask comprised of one or more of the following integer values, combined using the bitwise OR ('|') operator: Val 482 Name Meaning RegQueryBin 1 KEY_QUERY_VALUE 2 4 8 KEY_SET_VALUE KEY_CREATE_SUB_KEY KEY_ENUMERATE_SUB_KEYS 16 KEY_NOTIFY 32 KEY_CREATE_LINK Permission to query subkey data. Permission to set subkey data. Permission to create subkeys. Permission to enumerate subkeys. Permission for change notification. Permission to create a symbolic link. See Also: RegCloseKey, RegOpenFlags, RegOpenKey and the section on Registration Database Operations (pg. 467) RegQueryBin Returns binary value at subkey position. Syntax: RegQueryBin(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (s) handle to a registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. contents of data item at key position desired. The value is returned as a space-delimited string of hex bytes; e.g.: "AB 45 3E 01". Example: subkey = "Control Panel\Appearance[CustomColors]" value = RegQueryBin(@REGCURRENT, subkey) Message("CustomColors", value) 483 RegQueryEx See Also: RegApp, RegEntryType, RegQueryDword, RegQueryEx, RegQueryExpSz, RegQueryItem, RegQueryMulSz, RegQueryValue and the section on Registration Database Operations (pg. 467) RegQueryDword Returns DWORD value at subkey position. Syntax: RegQueryDword(handle, subkey-string [, flags]) Parameters: (i) handle (s) subkey-string (i) flags Returns: (i) handle to a registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. [optional] 0 - (default) value will be returned in decimal format. 1 - value will be returned in hexadecimal format. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. contents of data item at key position desired. Example: subkey = "Control Panel\Desktop[ScreenSaveUsePassword]" value = RegQueryDword(@REGCURRENT,subkey,0) Message("ScreenSaveUsePassword", value) See Also: RegApp, RegEntryType, RegQueryBin, RegQueryEx, RegQueryExpSz, RegQueryItem, RegQueryMulSz, RegQueryValue and the section on Registration Database Operations (pg. 467) RegQueryEx Retrieves a value from the registry. Syntax: RegQueryEx(handle, subkey-string, delimiter, type [,view-flag]) Parameters: (i) handle 484 an open registration database key (see below). RegQueryExpSz (s) subkey-string (s) delimiter (i) type (i) view-flag Returns: (s) a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. a character to act as a delimiter between items. "Delimiter" is ignored unless "type" is 7. see below. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. a value from the registry. "type" can be one of the following: Value 1 2 3 4 7 11 Meaning REG_SZ - Unicode null terminated string REG_EXPAND_SZ - Unicode null terminated string (with environment variable references) REG_BINARY - Free form binary REG_DWORD - 32-bit number REG_MULTI_SZ - Multiple Unicode strings REG_QWORD - 64-bit number Example: See the Registry Cloning Script under RegEntryType. See Also: RegApp, RegEntryType, RegQueryBin, RegQueryDword, RegQueryExpSz, RegQueryItem, RegQueryMulSz, RegQueryValue and the section on Registration Database Operations (pg. 467) RegQueryExpSz Retrieves a REG_EXPAND_SZ value from the registry. Syntax: RegQueryExpSz(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string an open registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. 485 RegQueryItem (i) view-flag Returns: (i) [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. contents of the data item at the key position desired. Example: ; Note: For 32-bit Path Modifications See RegApp ; Following is location of users path in Windows NT. userenv="Environment[path]" sysenv="SYSTEM\CurrentControlSet\Control\Session Manager\Environment[path]" if WinMetrics(-4)==4 ; Win NT lasterror( ) Errormode(@off) oldpath=RegQueryExpSz(@RegCurrent, userenv) ErrorMode(@cancel) If lasterror( ) == 1233 Errormode(@off) oldpath=RegQueryExpSz(@RegMachine, sysenv) ErrorMode(@cancel) if oldpath==0 Message("Environment Variable - Users Path", "No path found") else Message("System Environment Variable - Users Path", oldpath) endif else Message("User Environment Variable - Users Path", oldpath) exit endif if WinMetrics(-4) !=4 Message("RegQueryExpSz","Not supported in Non-NT versions of Windows") exit endif See Also: RegApp, RegEntryType, RegQueryBin, RegQueryDword, RegQueryEx, RegQueryItem, RegQueryMulSz, RegQueryStr, RegQueryValue and the section on Registration Database Operations (pg. 467) RegQueryItem Returns a list of named data items for a subkey. 486 RegQueryKey Syntax: RegQueryItem(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (s) handle to a registration database key. a path from the key provided to the desired key. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. tab-delimited list of named data items for the specified subkey-string. Example: items = RegQueryItem(@REGCURRENT, "Software\Microsoft\Windows\CurrentVersion\Extensions") item = AskItemList("Select an item", items, @TAB,@SORTED,@SINGLE, @ FALSE) if RegExistValue(@REGCURRENT, "Software\Microsoft\Windows\CurrentVersion\Extensions[%item%]") == @FALSE Message("Error","Item not defined.") Exit endif value = RegQueryValue(@REGCURRENT, "Software\Microsoft\Windows\CurrentVersion\Extensions[%item%]") Message(item, value) See Also: RegApp, RegEntryType, RegQueryBin, RegQueryDword, RegQueryEx, RegQueryExpSz, RegQueryMulSz, RegQueryValue and the section on Registration Database Operations (pg. 467) RegQueryKey Returns subkeys of the specified key. Syntax: RegQueryKey(handle, index) Parameters: (i) handle (i) index handle to a registration database key. zero-based index into list of subkeys. Returns: (s) name of desired subkey. 487 RegQueryKeyLastWriteTime Use this function to enumerate the subkeys of a desired key. The first subkey is referenced by index number 0, the second key by 1, and so on. If the key does not exist, a null string will be returned. Example: for i=0 to 999 a=RegQueryKey(@REGMACHINE, I) if a=="" then break Display(2, "HKEY_LOCAL_MACHINE subkey number %i%", a) next See Also: RegOpenKey, RegCreateKey, RegCloseKey, RegDeleteKey, RegEntryType, RegSetValue, RegQueryKeys, RegQueryValue and the section on Registration Database Operations (pg. 467) RegQueryKeyLastWriteTime Returns the last write time for a registry key. (Windows NT or newer) Syntax: RegQueryKeyLastWriteTime (handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (s) handle to a registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. last write time for a registry key, in YmdHms format. Example: lastwritetime = RegQueryKeyLastWriteTime(@REGMACHINE, "Software\Wilson WindowWare") Message("Last write time:", lastwritetime) exit See Also: RegOpenKey, RegCreateKey, RegCloseKey, RegDeleteKey, RegSetValue, RegQueryKey, RegQueryKeys, RegQueryValue and the section on Registration Database Operations (pg. 467) 488 RegQueryMulSz RegQueryKeys Returns a tab-delimited list of subkey names under a specified key. Syntax: RegQueryKeys(handle) Parameters: (i) handle handle to a registration database key. Returns: (s) tab-delimited list of subkey names. Example: key=RegOpenkey(@RegMachine, "SOFTWARE\Microsoft") who=RegQueryKeys(key) RegClosekey(key) AskItemList("Registry Keys under SOFTWARE\Microsoft", who, @TAB,@SORTED, @SINGLE) See Also: RegOpenKey, RegCreateKey, RegCloseKey, RegDeleteKey, RegSetValue, RegQueryKey, RegQueryValue and the section on Registration Database Operations (pg. 467) RegQueryMulSz Retrieves a REG_MULTI_SZ value from the registry. Syntax: RegQueryMulSz(handle, subkey-string, delimiter [,view-flag]) Parameters: (i) handle (s) subkey-string (s) delimiter (i) view-flag Returns: (s) an open registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. a character to act as a delimiter between items. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. a list of strings, delimited with the specified delimiter character. 489 RegQueryQword Example: key=RegCreatekey(@REGCURRENT, "sample") RegSetMulSz(key, "testmulz[foods]", "apple|pear|grapes|toast", "|") RegClosekey(key) a1=RegOpenkey(@REGCURRENT, "sample") c=RegQueryMulSz(a1, "testmulz[foods]",@tab) RegClosekey(a1) Message("Foods",c) See Also: RegApp, RegEntryType, RegQueryBin, RegQueryDword, RegQueryEx, RegQueryExpSz, RegQueryItem, RegQueryValue and the section on Registration Database Operations (pg. 467) RegQueryQword Retrieves a QWORD value from the registry. Syntax: RegQueryQword(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (s) an open registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. space-delimited string of hex bytes, beginning with the low byte of the QWORD. Example: key=RegCreatekey(@REGMACHINE, "Software\Wilson WindowWare\Sample") RegSetQword(key, "TestQword[]", "00 00 62 69 6e 61 72 79") rslt=RegQueryQword(key, "TestQword[]") RegClosekey(key) RegDeleteKey(@REGMACHINE, "Software\Wilson WindowWare\Sample") Message("Result",rslt) exit 490 RegQueryStr See Also: RegSetQword, RegApp, RegEntryType, RegQueryBin, RegQueryEx, RegQueryExpSz, RegQueryDword, RegQueryItem, RegQueryValue and the section on Registration Database Operations (pg. 467) RegQueryStr Retrieves and expands a string value from the registry. Syntax: RegQueryStr(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (i) an open registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. the expanded registry value. This function can be used to read a REG_SZ or REG_EXPAND_SZ value from the registry. If the value is a REG_EXPAND_SZ, any environment strings will be expanded to their defined values in the string returned by this function (the registry entry itself is untouched). Example: userenv="Environment[path]" sysenv="SYSTEM\CurrentControlSet\Control\Session Manager\Environment[path]" if WinVersion(4)!=4 Message("RegQueryStr","Not supported in Non-NT versions of Windows") exit endif if WinVersion(1)!=4 ; Win NT 4.0 Message("RegQueryStr","Script not designed for NT 2000 versions of Windows") exit endif lasterror( ) 491 RegQueryValue Errormode(@off) oldpath=RegQueryStr(@RegCurrent, userenv) ErrorMode(@cancel) If lasterror( ) == 1233 Errormode(@off) oldpath=RegQueryStr(@RegMachine, sysenv) ErrorMode(@cancel) if oldpath==0 Message("Environment Variable - Users Path", "No path found") else Message("System Environment Variable - Users Path", oldpath) endif else Message("User Environment Variable - Users Path", oldpath) exit endif exit See Also: RegApp, RegEntryType, RegQueryBin, RegQueryDword, RegQueryEx, RegQueryExpSz, RegQueryItem, RegQueryValue, RegQueryMulSz and the section on Registration Database Operations (pg. 467) RegQueryValue Returns data item string at subkey position. Syntax: RegQueryValue(handle, subkey-string [,view-flag]) Parameters: (i) handle (s) subkey-string (i) view-flag Returns: (s) handle to a registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. contents of data item at key position desired. Use this function to retrieve data items from the Registration Database. The function will fail if the data item does not exist. Note: Named data entries are specified by enclosing the data item name in square brackets at the end of the key string. For example: 492 RegSetBin RegQueryValue(@REGMACHINE,"SOFTWARE\Wilson WindowWare\Settings \WWWBATCH\MAIN[SOUNDS]") Example: b=RegQueryValue(@REGMACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion[Version]") Message("Windows Version", b) See Also: RegApp, RegEntryType, RegQueryBin, RegQueryDword, RegQueryEx, RegQueryExpSz, RegQueryItem, RegQueryMulSz, RegQueryStr and the section on Registration Database Operations (pg. 467) RegSetBin Sets a binary value in the Registration Database. Syntax: RegSetBin(handle, subkey-string, value [,view-flag]) Parameters: (i) handle (s) subkey-string (s) value (i) view-flag Returns: (i) handle to a registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. data to be stored into the database at desired key. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. always 1. The value is specified as a space-delimited string of hex bytes; e.g.: "AB 45 3E 01". Example: RegSetBin(@REGCURRENT, "A Test Key[My Binary Value]", "00 01 22 AB FF 00") Message("RegSetBin"," Done.") See Also: RegApp, RegEntryType, RegSetDword, RegSetEx, RegSetExpSz, RegSetMulSz, RegSetValue and the section on Registration Database Operations (pg. 467) 493 RegSetEx RegSetDword Sets a DWORD value in the Registration Database. Syntax: RegSetDword(handle, subkey-string, value [, flags]) Parameters: (i) handle (s) subkey-string (i) value (i) flags Returns: (i) handle to a registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. dword value to be stored into the database at desired key. [optional] 0 - (default) value will be returned in decimal format. 1 - value will be returned in hexadecimal format. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. @TRUE data item value was stored. Example: RegSetDword(@REGCURRENT, "A Test Key[My DWORD Value]", 32,0) Message("RegSetDWord","Done.") See Also: RegApp, RegEntryType, RegSetBin, RegSetEx, RegSetExpSz, RegSetMulSz, RegSetValue and the section on Registration Database Operations (pg. 467) RegSetEx Sets a value in the registry. Syntax: RegSetEx(handle, subkey-string, value, delimiter, type [,view-flag]) Parameters: (i) handle (s) subkey-string (s) value (s) delimiter (i) type 494 an open registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. data to be stored in the database at desired key. a character to act as a delimiter between items. "Delimiter" is ignored unless "type" is 7. see below. RegSetExpSz (i) view-flag Returns: (s) Type 1 2 3 4 7 11 [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. @TRUE data item value was stored. Meaning (REG_SZ) Unicode null terminated string (REG_EXPAND_SZ) Unicode null terminated string with environment variable references (REG_BINARY) Free form binary (REG_DWORD) 32-bit number (REG_MULTI_SZ) Multiple Unicode strings (REG_QWORD) 64-bit number Example: See the Registry Cloning Script under RegEntryType. See Also: RegApp, RegEntryType, RegSetBin, RegSetDword, RegSetExpSz, RegSetMulSz, RegSetValue and the section on Registration Database Operations (pg. 467) RegSetExpSz Sets a REG_EXPAND_SZ value in the registry. Syntax: RegSetExpSz(handle, subkey-string, value [,view-flag]) Parameters: (i) handle (s) subkey-string (s) value (i) view-flag an open registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. data to be stored in the database at desired key. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. 495 RegSetMulSz Returns: (i) @TRUE data item value was stored. Example: ; ; ; ; Note: To modify path in NT 4.0+ See the RegApp function The Following is the location of users path in Windows NT For the User Environment Path variable use: userenv="Environment[path]" ; For the System Environment Path variable use: sysenv="SYSTEM\CurrentControlSet\Control\Session Manager\Environment[path]" ; Directory to add to the path addpath="Q:\" if WinMetrics(-4)==4 ;Check to make sure system is Windows NT. LastError( ) ;clear the errors Errormode(@off) ;tell WB we'll handle the errors oldpath=RegQueryExpSz(@RegCurrent, userenv) ErrorMode(@cancel) If LastError( ) == 1233 Message("Users Path", "No path found, replacement not made.") else newpath=strcat(oldpath,";",addpath) c=RegSetExpSz(@RegCurrent, userenv, newpath) Message("Users new path is", newpath) WININICHG=26 DaDll=Strcat(DirWindows(1),"USER32.DLL") DllCall(DaDll,long:"SendMessageA",long:-1, long:WININICHG,long:0, lpstr:"Environment") endif exit else Message("RegQueryExpSz","Not supported by Non-NT registry") endif See Also: RegApp, RegEntryType, RegSetBin, RegSetDword, RegSetExpSz, RegSetMulSz, RegSetValue and the section on Registration Database Operations (pg. 467) RegSetMulSz Sets a REG_MULTI_SZ value in the registry. Syntax: RegSetMulSz(handle, subkey-string, value, delimiter [,view-flag]) 496 RegSetQword Parameters: (i) handle (s) subkey-string (s) value (s) delimiter (i) view-flag Returns: (i) an open registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. a list of strings, delimited with the specified delimiter character. a character to act as a delimiter between items. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. @TRUE data item value was stored. Example: key=RegCreatekey(@REGCURRENT, "sample") RegSetMulSz(key, "testmulz[foods]", "apple|pear|grapes|toast", "|") RegClosekey(key) a1=RegOpenkey(@REGCURRENT, "sample") c=RegQueryMulSz(a1, "testmulz[foods]",@tab) RegClosekey(a1) Message("Foods",c) exit See Also: RegApp, RegEntryType, RegSetBin, RegSetDword, RegSetEx, RegSetExpSz, RegSetValue and the section on Registration Database Operations (pg. 467) RegSetQword Sets a QWORD value in the registry. Syntax: RegSetQword(handle, subkey-string, value [,view-flag]) Parameters: (i) handle (s) subkey-string (i) value an open registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. a space-delimited string of hex bytes, beginning with the low byte of the QWORD. 497 RegSetValue (i) view-flag Returns: (i) [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. @TRUE data item value was stored. Example: key=RegCreatekey(@REGMACHINE, "Software\Wilson WindowWare\Sample") RegSetQword(key, "TestQword[]", "00 00 62 69 6e 61 72 79") rslt=RegQueryQword(key, "TestQword[]") RegClosekey(key) RegDeleteKey(@REGMACHINE, "Software\Wilson WindowWare\Sample") Message("Result",rslt) exit See Also: RegQueryQword, RegApp, RegEntryType, RegSetBin, RegSetDword, RegSetEx, RegSetExpSz, RegSetValue and the section on Registration Database Operations (pg. 467) RegSetValue Sets the value of a data item in the Registration Database. Syntax: RegSetValue(handle, subkey-string, value [,view-flag]) Parameters: (i) handle (s) subkey-string (s) value (i) view-flag Returns: (i) handle to a registration database key. a path from the key provided to the desired key, including the "data item name" in square brackets at the end of the key string. data to be stored into the database at desired key. [optional] controls which registry view the function uses when accessing the Windows registry. 0 - view indicated by the last call to the RegOpenFlags. 32 - use the 32-bit registry view. 64 - use the 64-bit registry view. @TRUE data item was stored; @FALSE operation failed. Use this function to store data items into the Registration Database. If the desired key does not exist, the function will create it. 498 Reload {*M} Note: Named data entries are specified by enclosing the data item name in square brackets at the end of the key string. For example: RegSetValue(@REGMACHINE,"SOFTWARE\Wilson WindowWare\Settings \WWWBATCH\MAIN[SOUNDS]",1) Example: ; Associate DIZ files with default textfile editor key=RegCreatekey(@REGCLASSES, ".diz") RegSetValue(key, "", "txtfile") RegClosekey(key) ; The preceding is actually a hard way to do ... RegSetValue(@REGCLASSES, ".diz", "txtfile") See Also: RegApp, RegEntryType, RegSetBin, RegSetDword, RegSetEx, RegSetExpSz, RegSetMulSz and the section on Registration Database Operations (pg. 467) RegUnloadHive Unloads a hive from the registry. Syntax: RegUnloadHive(handle, subkey) Parameters: (i) handle (s) subkey either @REGUSERS or @REGMACHINE. the name of a key which is mapped to a hive file. Returns: (i) @TRUE on success. Windows Vista: This function may require an Administrator level account, because it attempts to access to the HKEY_LOCAL_MACHINE registry key. Example: RegUnloadHive(@REGMACHINE, "WinWare") See Also: RegLoadHive and the section on Registration Database Operations (pg. 467) Reload {*M} Reloads menu file(s). Syntax: Reload ( ) 499 Return Parameters: (none) Returns: (i) always 1. This function is used to reload the WIL Interpreter's menu file(s). It is useful after editing a menu file, to cause the changes to immediately take effect. Note1: This command does not take effect until the WIL program has completed, regardless of where the command may appear in the program. Note2: This command is not part of the WIL Interpreter package, but is documented here because it has been implemented in many of the shell or file manager-type applications which use the WIL Interpreter. Example: RunZoomWait("notepad.exe", "c:\win\cmdpost.cpm") Reload( ) Return Used to return from a Call to the calling program or to return from a GoSub :label. Syntax: Return Parameters: (dependent) Returns: (dependent) depends on use, see below. the Return command can return a value, by specifying a value (or an expression that evaluates to a value) after the "Return" keyword, except when using GoSub. The Return statement returns to the statement following the most recently executed Call, GoSub or UDF. If there is no matching Call, GoSub or UDF, an Return is assumed. The Return command can return a value, by specifying a value (or an expression that evaluates to a value) after the "Return" keyword. The value or expression may optionally be enclosed in parentheses. This feature can be used with the Call command, and with the user-defined functions. It does not affect the Gosub command. Examples: Return Return (10) 500 RtStatus Return "Okay" Return myvariable * 10 Return (ItemCount(list, @TAB)) A script run with the Call command can now return a value by using a Return command with a value (see above). If a Return command without a value is used, or the called script does not contain a Return command, the called script will return 0. example: result = Call("other.wbt", "") Example: Display(2, "End of subroutine", "Returning to MAIN.WBT") Return See Also: Call, Exit, GoSub, User Defined Functions RtStatus Returns a number indicating the current execution mode of WinBatch. Syntax: RtStatus( ) Parameters: (none) Returns: (i) execution mode: 0 - WinBatch Interpreter 1 - Compiled WinBatch EXE file 5 - Compiled WinBatch Service (EXS file) 10 - WinBatch Studio debug 12 = FileMenu 13 = PopMenu 14 = WebBatch Example: flag=rtStatus() switch flag case 0 type="WinBatch Interpreted Script" break case 1 type="Compiled WinBatch EXE file" break case 5 type="Compiled WinBatch Service (EXS file)" 501 Run break case 10 type="WinBatch Studio Debug" break case 12 type="FileMenu" break case 13 type="PopMenu" break case 14 type="WebBatch" break case flag type="Unknown" break end switch Message("Code running as",type) Run Runs a program as a normal window. Syntax: Run (program-name, parameters) Parameters: (s) program-name (s) parameters Returns: (i) the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. optional parameters as required by the application. @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application. If the drive and path are not part of the program name, the current directory will be examined first, followed by the Windows and Windows System directories, and then the DOS path will be searched to find the desired executable file. If the "program-name" has an extension other than .EXE, .COM, .PIF, or .BAT, it will be run with the associated application. When this happens, any "parameters" you specified are ignored. Examples: Run("notepad.exe", "abc.txt") Run("paint.exe", "pict.msp") 502 RunEnviron See Also: RunShell, AppExist, RunHide, RunIcon, RunWait, RunZoom, ShellExecute, WinClose, WinExeName, WinWaitClose RunEnviron Launches a program and has it inherit the current environment as set with the EnvironSet command. Syntax: RunEnviron(program-name, params, display mode, waitflag) Parameters: (s) program-name (s) params (i) display mode (i) waitflag the name of the desired Windows EXE file. optional parameters as required by the application. @NORMAL, @ICON, @ZOOMED, @HIDDEN. @WAIT, @NOWAIT. Returns: (i) @TRUE executed normally; @FALSE failed. Use this function to launch a program with the current environment. Only Windows EXE’s may be executed with this command. It is possible to change the environment for DOS programs by launching a DOS BAT file that includes DOS SET statements to alter the environment settings before executing the DOS program. Use the Run commands to launch DOS programs and BAT files. This function is identical to the RunShell function. To alter the path for DOS programs, all that is required is a simple batch file, and the usual WIL Run command. Assuming the case where one wished to run "command.com" with the path "c:\special", a generic batch file as shown below will suffice, along with passing all the information required as parameters in the WIL Run command. DoPath.bat file listing SET PATH=%1 ECHO %PATH% PAUSE %2 %3 %4 %5 %6 %7 %8 %9 WIL Run Command Run("dopath.bat", "c:\special command.com") If the "program-name" has an extension other than .EXE, .COM, .PIF, or .BAT, it will be run with the associated application. 503 RunHide Example: ;Note: Permanent changes may be made by ;using the registry functions to update the registry. ; ;Note that this function will not affect the environment for ; DOS or Console applications ; ;Note: Modifying the path does not allow assist WIL in ;locating the EXE file. The path WIL uses has already ;been pre-determined. However the child process (excel) ;will inherit the PATH environment variable in this case. EnvironSet("PATH","c:\Program Files\Excel\") RunEnviron("c:\Program Files\Excel\Excel.exe","",@NORMAL,@WAIT) See Also: RunShell, Run, RunWait, Environment, EnvironSet, ShellExecute RunHide Runs a program as a hidden window. Syntax: RunHide (program-name, parameters) Parameters: (s) program-name (s) parameters Returns: (i) the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. optional parameters as required by the application. @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application as a hidden window. If the drive and path are not part of the program name, the current directory will be examined first, followed by the Windows and Windows System directories, and then the DOS path will be searched to find the desired executable file. If the "program-name" has an extension other than .EXE, .COM, .PIF, or .BAT, it will be run with the associated application. Note: When this command launches an application, it merely informs it that you want it to run as a hidden window. Whether or not the application honors your wish is beyond RunHide's control. Examples: RunHide("notepad.exe", "abc.txt") RunHide("paint.exe", "pict.msp") 504 RunIcon See Also: RunShell, Run, RunHideWait, RunIcon, RunZoom, ShellExecute, WinClose, WinExeName, WinHide, WinWaitClose RunHideWait Runs a program as a hidden window, and waits for it to close. Syntax: RunHideWait (program-name, parameters) Parameters: (s) program-name (s) parameters Returns: (i) the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. optional parameters as required by the application. @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application as a hidden window. The WIL program will suspend processing until the application is closed. If the drive and path are not part of the program name, the current directory will be examined first, followed by the Windows and Windows System directories, and then the DOS path will be searched to find the desired executable file. If the "program-name" has an extension other than .EXE, .COM, .PIF, or .BAT, it will be run with the associated application. Note: When this command launches an application, it merely informs it that you want it to run as a hidden window. Whether or not the application honors your wish is beyond RunHideWait's control. Example: RunHideWait(Environment("COMSPEC"), "/c dir *.exe> temp.txt") Print("temp.txt","",@NORMAL,0) See Also: RunShell, RunHide, RunIconWait, RunWait, RunZoomWait, ShellExecute, WinWaitClose RunIcon Runs a program as an iconic (minimized) window. Syntax: RunIcon (program-name, parameters) 505 RunIconWait Parameters: (s) program-name (s) parameters Returns: (i) the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. optional parameters as required by the application. @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application as an icon. If the drive and path are not part of the program name, the current directory will be examined first, followed by the Windows and Windows System directories, and then the DOS path will be searched to find the desired executable file. If the "program-name" has an extension other than .EXE, .COM, .PIF, or .BAT, it will be run with the associated application. Note: When this command launches an application, it merely informs it that you want it to begin as an icon. Whether or not the application honors your wish is beyond RunIcon's control. Examples: RunIcon("notepad.exe", "") See Also: RunShell, Run, RunHide, RunIconWait, RunZoom, ShellExecute, WinClose, WinExeName, WinIconize, WinWaitClose RunIconWait Runs a program as an iconic (minimized) window, and waits for it to close. Syntax: RunIconWait (program-name, parameters) Parameters: (s) program-name (s) parameters Returns: (i) the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. optional parameters as required by the application. @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application as an icon. The WIL program will suspend processing until the application is closed. If the drive and path are not part of the program name, the current directory will be examined first, followed by the Windows and Windows System directories, and then the DOS path will be searched to find the desired executable file. 506 RunShell If the "program-name" has an extension other than .EXE, .COM, .PIF, or .BAT, it will be run with the associated application. Note: When this command launches an application, it merely informs it that you want it to begin as an icon. Whether or not the application honors your wish is beyond RunIconWait's control. Example: comspec = Environment("COMSPEC") params = "/c dir *.exe>temp.txt" RunIconWait(comspec, params) Message("RunIconWait","It Ran, It Iconned, It Waited.") exit See Also: RunShell, RunHideWait, RunIcon, RunWait, RunZoomWait, ShellExecute, WinWaitClose RunShell An advanced form of the Run function that even allows the specification of a working directory, along with the window view mode and whether or not to wait for completion of the run program in a single function. Syntax: RunShell(program-name, params, directory, display mode, waitflag) Parameters: (s) program-name (s) params (s) directory (i) display mode (i) waitflag Returns: (i) the name of the desired .EXE, .COM, .PIF, .BAT file or a data file. optional parameters as required by the application. target directory (if applicable). @NORMAL, @ICON, @ZOOMED, @HIDDEN. @WAIT, @NOWAIT, @GETPROCID, @GETEXITCODE. @TRUE if the program was found; @FALSE if it wasn't. If a data file is specified instead of an executable file (i.e. EXE, COM, PIF, or BAT file), the function examines the extension of the data file, looks the extension up in the Windows registry to determine the owning application and starts the owning application, passing the data file name as a parameter. Applications that support this command or their setup programs will generally make the necessary modifications to the Windows registry to allow this function to perform successfully. If the drive and path are not part of the program name, the current directory will be examined first, followed by the Windows and Windows System directories, and then the DOS path will be searched to find the desired executable file. 507 RunWait If the @WAIT parameter is used, the WIL program will suspend processing until the application is closed. If the @GETPROCID parameter is used, a process-id will be returned that can be used with the function WinItemProcID. If the @GETEXITCODE parameter is used, the exit code of an application that is launched with the RunShell function will be returned. This is the same as specifying @WAIT, except that on success the function will return the exit code of the application that was launched. Note: When this command launches an application, it merely informs it how you wish it to appear on the screen. Whether or not the application honors your wish is beyond this function's control. Example: RunShell("NOTEPAD.EXE", "CONFIG.SYS", "C:\", @NORMAL, @NOWAIT) See Also: IntControl 64, Print, Run, RunWait, ShellExecute, WinItemProcID RunWait Runs a program as a normal window, and waits for it to close. Syntax: RunWait (program-name, parameters) Parameters: (s) program-name (s) parameters Returns: (i) the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. optional parameters as required by the application. @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application. The WIL program will suspend processing until the application is closed. If the drive and path are not part of the program name, the current directory will be examined first, followed by the Windows and Windows System directories, and then the DOS path will be searched to find the desired executable file. If the "program-name" has an extension other than .EXE, .COM, .PIF, or .BAT, it will be run with the associated application. Example: RunWait(Environment("COMSPEC"), "/c dir *.exe>temp.txt") Print("temp.txt","",@NORMAL,0) WinWaitClose("~Notepad") FileDelete("temp.txt") 508 RunWithLogon See Also: AppWaitClose, Run, RunShell, RunHideWait, RunIconWait, RunZoomWait, ShellExecute, WinWaitClose, WinWaitExist RunWithLogon Runs a program as a specified user. (Windows 2000+) Syntax: RunWithLogon( program-name, params, directory, display mode, waitflag, username, domain, password, logon-flags) Parameters: (s) program-name (s) params (s) directory (i) display mode (i) waitflag (s) username (s) domain (i) logon-flags the name of the desired .EXE, .COM, .PIF, .BAT file or a data file. optional parameters as required by the application. target directory (if applicable). @NORMAL, @ICON, @ZOOMED, @HIDDEN. @WAIT, @NOWAIT, @GETPROCID. specifies the name of the user account to log on to. Note: If you use the UPN format (user@DNS_domain_name), "domain" must be a blank string (""). specifies the name of the domain or server whose account database contains the "username" account. Note: If this parameter is a blank string, "username" must be specified in UPN format. (s) password specifies the password for the "username" account. see below. "logon-flags" can be one of the following values: Value 0 1 2 Name Default LOGON_WITH_PROFILE LOGON_NETCREDENTIALS_ONLY Meaning No logon-flag. Log on, then load the user's profile. Loading the profile can be time-consuming, so it is best to use this value only if you must access the user's profile information. Log on, but use the specified credentials on the network only. This value can be used to create 509 RunWithLogon a process that uses a different set of credentials locally than it does remotely. This is useful in inter-domain scenarios where there is no trust relationship. If a data file is specified instead of an executable file (i.e. EXE, COM, PIF, or BAT file), the function examines the extension of the data file, looks the extension up in the Windows registry to determine the owning application and starts the owning application, passing the data file name as a parameter. Applications that support this command or their setup programs will generally make the necessary modifications to the Windows registry to allow this function to perform successfully. If the drive and path are not part of the program name, the current directory will be examined first, followed by the Windows and Windows System directories, and then the DOS path will be searched to find the desired executable file. If the @WAIT parameter is used, the WIL program will suspend processing until the application is closed. If the @GETPROCID parameter is used, a process-id will be returned that can be used with the function WinItemProcID. Notes: When this command launches an application, it merely informs it how you wish it to appear on the screen. Whether or not the application honors your wish is beyond this function's control. Windows Server 2003 and Windows XP: There is a known issue on Windows XP SP1and 2003 where the RunWithLogon function ignoring the 'display mode' parameter. There is a windows service pack update/hotfix that addresses this problem. See Microsoft's knowledgebase article 818858, for details. RunWithLogon accesses the 'program-name' in the security context of the target user. If the executable you want to launch is on a network and a network drive letter is specified in the path, the network drive letter is not available to the target user, as network drive letters are assigned on a per logon basis, thus this function will fail. If the executable you want to launch is on a network, use the UNC path. Issues involved with RunWithLogon when you change the credentials under which a program runs: RunWithLogon changes the security context of the script. Security context is nothing more than a 'sandbox' in which programs can all play. When you are logged on to a NT platform system, your session consists of multiple processes, with each process running one program. When you connect a drive letter to a network resource, that drive letter only exists within your security context. Other sessions [e.g. other terminal sessions on a terminal server system, services running under separate user 510 RunWithLogon accounts different from your own] have separate security contexts and thus they don't see your drive letter mappings as they exist in their own private 'sandboxes'. When you use RunWithLogon() to make use of impersonation, you are causing that process to run in a separate security context. Examples: Example 1 DirChange(DirWindows(0)) ;check the platform if WinVersion(5) >= "2-5-0" ;Win2000 or newer ;NOTE: For security reasons *always* assign the password ; to a variable and then use the variable in the RunWithLogon ; statement. NEVER hardcode the password into the ; RunWithLogon statement or else the password my be ; exposed if the RunWithLogon fails on some kind of error ; This is also a good idea with the userid and domain ; information runas_user = "Administrator" runas_pswd = "password" runas_domain = ComputernameGet(0) ; local account database ; The following should be on one line RunWithLogon("NOTEPAD.EXE", "", "C:\", @NORMAL, @NOWAIT, runas_user, runas_domain, runas_pswd,1) else Message("RunWithLogon","Is not designed for this platform.") endif exit Example 2 ;This script ; :SETINFO ; :BEFORE ; :ADMIN ; :AFTER - supports four subroutines code to specify Admin userid and password and domain code that executes in user mode BEFORE running as admin code that runs as ADMIN code that executes in user mode AFTER running as admin ; Basically this script executes the BEFORE subroutine, then does a ; RUNWITHLOGON to run a copy of itself in admin mode. When the admin ; mode portion exits, then this script executes the AFTER subroutine. ; ; ; ; When the original script performs the RUNWITHLOGON it adds an additional parameter to the script's command line (if any), which is the string URADMIN, to let the admin script know that it is already in admin mode so that it can do that portion of the code. ; The top section of this example can generally be used as-is. The ; intent is that all the changes required can be done in the four ; Gosub's at the bottom. ; This picks up the entire passed parameter line to see if the ; URADMIN parameter exits moiparams=IntControl(1006,0,0,0,0) 511 RunWithLogon ; Check passed parameters for URADMIN string if StrIndexNC(moiparams,"URADMIN",0,@fwdscan) == 0 ; URDAMIN NOT FOUND. Not running as Admin. ; check to see if doing this is supported if WinVersion(5) >= "2-5-0" ;Win2k or newer. ; RunWithLogon supported. ; GOSUB BEFORE code Gosub BEFORE ; Set up to RUN a copy of this script with ADMIN privileges Gosub SETINFO moi=WinExename("") ;Get current script name moiparams=strcat(moiparams, " URADMIN") ;Add URADMIN to param ; The following should be on one line RunWithLogon(moi, moiparams, "", @NORMAL, @WAIT,runas_user, runas_domain, runas_pswd,0) ; GOSUB the AFTER code here GOSUB AFTER ;Quit. Script is complete ; Drop out of if/endif to exit statement else ; RUNWITHLOGON not supported on this platform ; Provide error message and exit Message("RunWithLogon","Is not designed for this platform.") ; Drop out of if/endif to exit statement endif else ; Already launched as admin param0 = param0-1 ; Remove the URADMIN param ;Do the ADMIN code GOSUB ADMIN ; Drop out of if/endif to exit statement endif exit :SETINFO ; This subroutine is used to setup the account ; information required to Run as the Administrator. ; Userid, password, and domain are defined here ;NOTE: For security reasons *always* assign the password ; to a variable and then use the variable in the RunWithLogon ; statement. NEVER hardcode the password into the ; RunWithLogon statement or else the password my be ; exposed if the RunWithLogon fails on some kind of error ; This is also a good idea with the userid and domain ; information runas_user = "Administrator" 512 RunZoom runas_pswd = "secretpassword" runas_domain = ComputernameGet(0); local account database return :BEFORE ; Running in user mode, BEFORE running the admin mode ; portion of the script Message("Debug","Executing BEFORE section of script") return :ADMIN ;------------------------------; Running in ADMIN mode. ;------------------------------Message("Debug","Running ADMIN section of script") return :AFTER ; Running in user mode, AFTER running the admin mode ; portion of the script Message("Debug","Executing AFTER section of script") return See Also: RunShell, Run, RunHide, RunIcon, RunZoomWait, ShellExecute, WinClose, WinExeName, WinWaitClose, WinZoom RunZoom Runs a program as a full-screen (maximized) window. Syntax: RunZoom (program-name, parameters) Parameters: (s) program-name (s) parameters Returns: (i) the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. optional parameters as required by the application. @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application as a full-screen window. If the drive and path are not part of the program name, the current directory will be examined first, followed by the Windows and Windows System directories, and then the DOS path will be searched to find the desired executable file. If the "program-name" has an extension other than .EXE, .COM, .PIF, or .BAT, it will be run with the associated application. 513 RunZoomWait Note: When this command launches an application, it merely informs it that you want it to be maximized to full-screen. Whether or not the application honors your wish is beyond RunZoom's control. Examples: RunZoom("notepad.exe", "abc.txt") RunZoom("notepad.exe", "") RunZoom("paint.exe", "pict.msp") See Also: RunShell, Run, RunHide, RunIcon, RunZoomWait, ShellExecute, WinClose, WinExeName, WinWaitClose, WinZoom RunZoomWait Runs a program as a full-screen (maximized) window, and waits for it to close. Syntax: RunZoomWait (program-name, parameters) Parameters: (s) program-name (s) parameters Returns: (i) the name of the desired .EXE, .COM, .PIF, .BAT file, or a data file. optional parameters as required by the application. @TRUE if the program was found; @FALSE if it wasn't. Use this command to run an application as a full-screen window. The WIL program will suspend processing until the application is closed. If the drive and path are not part of the program name, the current directory will be examined first, followed by the Windows and Windows System directories, and then the DOS path will be searched to find the desired executable file. If the "program-name" has an extension other than .EXE, .COM, .PIF, or .BAT, it will be run with the associated application. Note: When this command launches an application, it merely informs it that you want it to be maximized to full-screen. Whether or not the application honors your wish is beyond RunZoomWait's control. Example: RunZoomWait(Environment("COMSPEC"), "/c dir *.exe>temp.txt") Print("temp.txt","",@NORMAL,0) See Also: RunShell, RunHideWait, RunIconWait, RunWait, RunZoom, ShellExecute, WinWaitClose 514 Select Select The Select statement allows selection among multiple blocks of statements. Syntax: Select expression case expression statements break case expression statements break EndSelect Parameters: (s) expression an expression that must evaluate to an integer. The Select statement allows selection among multiple blocks of statements, depending on the value of an expression. The expression must evaluate to an integer. The Select statement causes the statements in the select body to be scanned by the parser as it attempts to find a case statement. When a case statement is found, the expression following the case statement is evaluated, and if the expression evaluates to the same value as the expression following the Select statement, execution of the following statements is initiated. The EndSelect statement terminates the Select structure. If a matching case expression was found, and execution was initiated, the following statements will affect continued execution: Break Terminates the Select structure and transfers control to the statement following the next matching EndSelect. Continue Stops execution and resumes scanning for a case statement. Case Ignored. Treated as a comment. EndSelect Terminates the Select structure and transfers control to the next statement. Note: Switch and Select may be used interchangeably. They are synonyms for the same statement. EndSwitch, EndSelect, "End Switch", and "End Select" may be used interchangeably. Example: response=AskLine("Select", "Enter a number between 1 and 3", 1, 0) Select response 515 SendKey case 1 Message("Select", "Case 1 entered") break case 2 Message("Select", "Case 2 entered") break case 3 Message("Select", "Case 3 entered") break case response ; default case Message("Select", "Default case entered") break EndSelect See Also: If, For, GoSub, While SendKey Sends keystrokes to the currently active window. Syntax: SendKey (char-string) Parameters: (s) char-string string of regular and/or special characters. Returns: (i) always 0. Note: SendKey will send keystrokes to the currently active window. For many applications, the related functions, SendKeysChild, SendKeysTo or SendMenusTo may be better alternatives. This function is used to send keystrokes to the active window, just as if they had been entered from the keyboard. Any alphanumeric character, and most punctuation marks and other symbols which appear on the keyboard, may be sent simply by placing it in the "char-string". In addition, the following special characters, enclosed in "curly" braces, may be placed in "char-string" to send the corresponding special characters: Key SendKey equivalent ~ ! ^ + { } {~} {!} {^} {+} {{} {}} 516 ; This is how to send a ~ ; This is how to send a ! ; This is how to send a ^ ; This is how to send a + ; This is how to send a { ; This is how to send a } SendKey Alt Backspace Clear Ctrl-Break Delete Down Arrow End Enter Escape F1 through F16 Help Home Insert Left Arrow Page Down Page Up Pause Right Arrow Space Tab Up Arrow {ALT} {BACKSPACE} or {BS} {CLEAR} {CANCEL} {DELETE} or {DEL} {DOWN} {END} {ENTER} or ~ {ESCAPE} or {ESC} {F1} through {F16} {HELP} {HOME} {INSERT} or {INS} {LEFT} {PGDN} {PGUP} {PAUSE} {RIGHT} {SPACE} or {SP} {TAB} {UP} Additional special characters to the SendKey (and SendKeysTo and SendKeysChild) functions: Key 0 on numeric keypad 1 on numeric keypad 2 on numeric keypad 3 on numeric keypad 4 on numeric keypad 5 on numeric keypad 6 on numeric keypad 7 on numeric keypad 8 on numeric keypad 9 on numeric keypad * on numeric keypad + on numeric keypad - on numeric keypad . on numeric keypad / on numeric keypad Enter on numeric keypad Print Screen % (single percent sign) SendKey equivalent {NUMPAD0} {NUMPAD1} {NUMPAD2} {NUMPAD3} {NUMPAD4} {NUMPAD5} {NUMPAD6} {NUMPAD7} {NUMPAD8} {NUMPAD9} {NUMPAD*} {NUMPAD+} {NUMPAD-} {NUMPAD.} {NUMPAD/} {NUMPAD~} {PRTSC} %% 517 SendKey In the following, "Standalone" means the key is pressed and then released. "Combination" means the key is held down while the following key is pressed. These may or may not work for any particular application or situation: Left Alt key, standalone Right Alt key, standalone Left Control key, standalone Right Control key, standalone Left Shift key, standalone Right Shift key, standalone Left Windows key, standalone Right Windows key, standalone Applications key, standalone Left Alt key, combination Right Alt key, combination Left Control key, combination Right Control key, combination Left Shift key, combination Right Shift key, combination Left Windows key, combination Right Windows key, combination Applications key, combination {LALT} {RALT} {LCONTROL} {RCONTROL} {LSHIFT} {RSHIFT} {LWIN} {RWIN} {APPS} {*LALT} {*RALT} {*LCONTROL} {*RCONTROL} {*LSHIFT} {*RSHIFT} {*LWIN} ;see notes below {*RWIN} ;see notes below {*APPS} Notes: The left and right Alt, Control, and Shift keys can only be distinguished on Windows NT or newer. On other platforms they are treated as plain Alt, Control, and Shift keys, respectively. The "Windows" and Applications" keys are on the Microsoft Natural keyboard. In the specific case of "{*LWIN}L" or "{*RWIN}L" which would be the keystrokes to swap a currently logged-in user (in Windows XP and newer), a problem occurs where the user session that executed the SendKey misses the key-up of the Windows key. When returning to that user session, the system thinks the Windows key is still depressed, and thus keyboard input does not work properly. The problem can be manually cleared by pressing the Windows key again and hitting Escape to clear the Start Menu that pops up. Thus it is recommended that you do not attempt to use these key combinations in a script to swap users. As an alternative you may wish to look into the RunWithLogon function which allows a program to be run as another user. To enter an Alt, Control, or Shift key combination, precede the desired character with one or more of the following symbols: Alt Control Shift 518 ! ^ + SendKey To enter Alt-S: SendKey("!s") To enter Ctrl-Shift-F7: SendKey("^+{F7}") You may also repeat a key by enclosing it in braces, followed by a space and the total number of repetitions desired. To type 20 asterisks: SendKey("{* 20}") To move the cursor down 8 lines: SendKey("{DOWN 8}") To toggle a checkbox: SendKey("{+}") SendKey("{-}") ;always checks a checkbox ;always unchecks a checkbox To type a single percent sign: SendKey("%%") ;types a single percent sign Example: ; start Notepad, and use *.* for filenames Run("notepad.exe", "") SendKey("!fo*.*~") In those cases where you have an application which can accept text pasted in from the clipboard, it will often be more efficient to use the ClipGet function: Run("notepad.exe", "") crlf = StrCat(Num2Char(13), Num2Char(10)) ; copy some text to the clipboard ClipPut("Dear Sirs:%crlf%%crlf%") ; paste the text into Notepad (using Ctrl-v) SendKey("^v") A WIL program cannot send keystrokes to its own WIL Interpreter window. Notes: You should, in general, use lower-case letters to represent Alt-key combinations and other menu shortcut keys as that is the normal keys used when typing to application. For example, "!fo" is interpreted as Alt-f-o, as one might expect. However, "!FO" is interpreted as Alt-Shift-f-o, which is not a normal keystroke sequence. 519 SendKeysChild If your SendKey statement doesn't seem to be working (e.g., all you get are beeping noises), you may need to place a WinActivate statement before the SendKey statement to insure that you are sending the keystrokes to the correct window, or you may try using the SendKeysTo or SendKeysChild function. When sending keystrokes to a DOS box, the DOS box must be in a window (Not Full Screen). Most keystrokes can be sent to a full screen DOS box, however, SendKey can only send the ENTER key to a Windowed DOS Box. The function IgnoreInput may be used to block user input during a sendkey operation. See Also: IntControl 35, IgnoreInput, SendKeysTo, SendKeysChild, SendMenusTo, SnapShot, WinActivate SendKeysChild Sends keystrokes to a child window. Syntax: SendKeysChild(main-windowname, child windowname, sendkey string) Parameters: (s) main- windowname the initial part of, or an entire parent window name. (s) child-windowname the initial part of, or an entire child window name. (s) sendkey string string of regular and/or special characters. Returns: (i) always 0. Use this function to send keystrokes to a particular child window. This function is similar to SendKey, but the desired parent and child windows will be activated before sending any keys in lieu of using WinActiveChild. Consequently, a previous WinActiveChild command will be overridden by this function. See the SendKey function for a description of the "sendkey string". Note: "main-windowname" and "child-windowname" are the initial parts of their respective window names, and may be complete window names. They are casesensitive. You should specify enough characters so that the window names will match only one existing window of its type. If a windowname matches more than one window, the most recently accessed window which it matches will be used. The function IgnoreInput may be used to block user input during a sendkey operation. 520 SendKeysTo Example: ; Start Windows File Manager - the hard way ; This code activates Program Manager, then ; activates the "Main" child window. Sending an ; "f" should (hopefully) activate the File Manager ; icon. The Enter key (abbreviated as ~ ) runs it. SendKeysChild("Program Manager", "Main", "f~") See Also: IntControl 35, IgnoreInput, SendKeysTo, SendKey, SendMenusTo, KeyToggleSet, SnapShot, WinActivate SendKeysTo Sends keystrokes to a "parent-windowname". Syntax: SendKeysTo(parent-windowname, sendkey string) Parameters: (s) parent-windowname the initial part of, or an entire parent window name. (s) sendkey string string of regular and /or special characters. Returns: (i) always 0. Use this function to send keystrokes to a particular window. This function is similar to SendKey, but the correct "parent-windowname" will be activated before sending any keys in lieu of using WinActivate. Consequently, a previous WinActivate command will be overridden by this function. See the SendKey function for a description of the "sendkey string". See SendKey for a list of keystroke equivalents. Note: "parent-windowname" is the initial part of a window name, and may be a complete window name. It is case-sensitive. You should specify enough characters so that "windowname" matches only one existing window. If it matches more than one window, the most recently accessed window which it matches will be used. The function IgnoreInput may be used to block user input during a sendkey operation. Example: run("notepad.exe","") SendKeysTo("~Notepad", "aBcDeF") See Also: IntControl 35, IgnoreInput, SendKey, SendKeysChild, SendMenusTo, KeyToggleSet, SnapShot, WinActivate 521 SendMessageA SendMenusTo Activates a window and sends a specified menu option. Syntax: SendMenusTo(windowname, menuname) Parameters: (s) windowname (s) menuname the initial part of, or an entire parent window name. menu item to be selected. Returns: (i) always 0. Use this function to access drop down menus on a window. The function activates the "windowname" application window, searches its menus and sends the specified windows message for the menu operation. To construct the "menuname" parameter simply string together all the menu options selected to access the desired function. All punctuation and special characters are ignored, as well as any possible "hotkeys" used to access the function via the keyboard. For example, most Windows applications have a "File" menu and an "Open" menu. To construct the "menu name" parameter, simply string together the words, making "FileOpen", or for better readability use "File Open" - the spaces are ignored. Note 1: "windowname" is the initial part of a window name, and may be a complete window name. It is case-sensitive. You should specify enough characters so that "windowname" matches only one existing window. If it matches more than one window, the most recently accessed window which it matches will be used. Note 2: SendMenusTo does not work with all applications. If you get a 'windows menu not accessible' error, SendMenusTo will not work with that application. Use SendKeysTo instead. Example: Run("notepad.exe", "c:\config.sys") SendMenusTo("~Notepad", "Edit Select All") SendMenusTo("~Notepad", "Edit Copy") See Also: SendKeysTo, SendKeysChild, SendKey, SnapShot SendMessageA Issues a Windows "SendMessage", with lParam as an ANSI string. Syntax: SendMessageA(window-id/handle, message-id, wParam, lParam) 522 SendMessageW Parameters: (i) window-id/handle (i) message-id (i) wParam (s) lParam Returns: (s) window id or handle to send to. message ID number (in decimal). wParam value (message-specific information). lParam value (message-specific information assumed to be a character string). result of the message processing; it depends on the message sent. The lParam string is copied to a GMEM_LOWER buffer, and a LPSTR to the copied string is passed as lParam. The GMEM_LOWER buffer is freed immediately upon return from the SendMessageA. Example: ; Send WM_SETTINGCHANGE to all top-level windows ; when they make changes to system parameters HWND_BROADCAST = -1 WM_SETTINGCHANGE = 26 SendMessageA( HWND_BROADCAST, WM_SETTINGCHANGE, 0, "") See Also: RegSetValue, SendMessageW SendMessageW Issues a Windows "SendMessage", with lParam as a Unicode string. (Windows NT and newer) Syntax: SendMessageW(window-id/handle, message-id, wParam, lParam ) Parameters: (i) window-id/handle (i) message-id (i) wParam (s) lParam Returns: (s) window id or handle to send to. message ID number (in decimal). wParam value (message-specific information). lParam value (message-specific information assumed to be a Unicode string). result of the message processing; it depends on the message sent. The lParam string is copied to a GMEM_LOWER buffer, and a LPSTR to the copied string is passed as lParam. The GMEM_LOWER buffer is freed immediately upon return from the SendMessageW. 523 ShellExecute Example: ; Send WM_SETTINGCHANGE to all top-level windows ; when they make changes to system parameters HWND_BROADCAST = -1 WM_SETTINGCHANGE = 26 SendMessageW( HWND_BROADCAST, WM_SETTINGCHANGE, 0, "") See Also: RegSetValue, SendMessageA ShellExecute Runs a program via the Windows ShellExecute command Syntax: ShellExecute(program-name, params, directory, display mode, operation) Parameters: (s) program-name (s) params (s) directory (i) display mode (i) operation Returns: (i) the name of the desired .EXE, .COM, .PIF, .BAT file or a data file. optional parameters as required by the application. current working directory (if applicable). @NORMAL, @ICON, @ZOOMED, @HIDDEN; or 0 for the default mode. operation to perform on the specified file. @TRUE on success; @FALSE on failure. This function uses the Windows ShellExecute API to launch the specified file. The similar RunShell function also uses the ShellExecute API in the 16-bit version, but uses the CreateProcess API in the 32-bit version. Note that RunShell has a "wait" parameter, while this function does not. "operation" is the operation to perform on the file ("Open", "Print", etc.), which may or may not correspond to an available "verb" on the context menu for the file. This parameter may be case-sensitive. Specify a blank string "" for the file's default operation. Note: If you use this function to launch a shortcut, and the shortcut points to an invalid path, Windows will display a "Missing Shortcut" dialog box asking if you wish to update the shortcut. This would not be suitable to use in unattended operation. Instead, you could use one of the Run functions to launch the shortcut, which would return an error #1932 if the shortcut could not be launched. This error can be trapped using the ErrorMode function. 524 ShortcutDir Example: ; launches a shortcut to a "Dial-Up Networking" item on the desktop startdir=ShortcutDir("Desktop",0,0) ShellExecute(StrCat( startdir, "netcom.lnk"), "", "", @NORMAL, "") WinWaitClose("Connect To") Message("ShellExecute"," Executed.") See Also: RunShell ShortcutDir Returns the name of the shell folder. Syntax: ShortcutDir(name/CSIDL [, source [, add-slash]]) Parameters: (s) name or CSIDL (i) source (i) add-slash Returns: (s) Name Desktop see list below. [optional] flag which can under 'certain' circumstances specify the location from which the information will be retrieved. see below. [optional] if @TRUE, a backslash will be appended to the returned string if it doesn't already have a trailing backslash. The default is @FALSE. a directory name on success; a blank string ("") if no corresponding value was found. CSIDL Meaning 0 CSIDL_DESKTOP Desktop (namespace root) 1 CSIDL_INTERNET Internet Virtual Folder 2 CSIDL_PROGRAMS Programs folder (under Start menu in [user] profile) 3 CSIDL_CONTROLS Control Panel virtual folder 4 CSIDL_PRINTERS Printers virtual folder Personal 5 CSIDL_PERSONAL Personal folder ([user] profile) Favorites 6 CSIDL_FAVORITES Favorites folder ([user] profile) Startup 7 CSIDL_STARTUP Startup folder ([user] profile) Recent 8 CSIDL_RECENT Recent folder ([user] profile) SendTo 9 CSIDL_SENDTO SendTo folder ([user] profile) Programs 525 ShortcutDir 10 CSIDL_BITBUCKET Recycle Bin folder Start Menu 11 CSIDL_STARTMENU Start menu ([user] profile) My Music 13 CSIDL_MYMUSIC My Music ([user] profile) My Video 14 CSIDL_MYVIDEO My Videos ([user] profile) 16 CSIDL_DESKTOPDIRECTORY Desktop folder ([user] profile) 17 CSIDL_DRIVES My Computer virtual folder 18 CSIDL_NETWORK Network Neighborhood root NetHood 19 CSIDL_NETHOOD Network Neighborhood directory Fonts 20 CSIDL_FONTS Fonts virtual folder Templates 21 CSIDL_TEMPLATES Templates folder ([user] profile) Common Start Menu 22 CSIDL_COMMON_STARTMENU Start menu (All Users profile) Common Programs 23 CSIDL_COMMON_PROGRAMS Programs folder (under Start menu in All Users profile) Common Startup 24 CSIDL_COMMON_STARTUP Startup folder (All Users profile) Common Desktop 25 CSIDL_COMMON_DESKTOPDIRECTORY Desktop folder (All Users profile) AppData 26 CSIDL_APPDATA Application Data ([user] profile) PrintHood 27 CSIDL_PRINTHOOD PrintHood folder ([user] profile) Local AppData 28 CSIDL_LOCAL_APPDATA Local (non-roaming) data repository for apps 29 CSIDL_ALTSTARTUP Alternate Startup ([user], DBCS) 30 CSIDL_COMMON_ALTSTARTUP Alternate Startup folder (All Users profile, DBCS) Common Favorites 31 CSIDL_COMMON_FAVORITES Favorites folder (All Users profile) Cache 32 CSIDL_INTERNET_CACHE Internet Cache folder Cookies 33 CSIDL_COOKIES Cookies folder History 34 CSIDL_HISTORY History folder Common AppData 35 CSIDL_COMMON_APPDATA Application Data (All Users Profile) 36 CSIDL_WINDOWS Windows directory or SYSROOT 37 CSIDL_SYSTEM System folder 38 CSIDL_PROGRAM_FILES Program Files folder My Pictures 526 39 CSIDL_MYPICTURES My Pictures folder 40 CSIDL_PROFILE Users profile folder ShortcutDir 41 CSIDL_SYSTEM System folder 43 CSIDL_PROGRAMS_FILES_COMMON Common files folder, e.g., C:\Program Files\Common Files Common Templates 45 CSIDL_COMMON_TEMPLATES Templates folder (All Users profile) Common Documents 46 CSIDL_COMMON_DOCUMENTS Documents folder (All Users profile) Common Administrative Tools 47 CSIDL_COMMON_ADMINTOOLS Admin Tools folder (All Users profile) Administrative Tools 48 CSIDL_ADMINTOOLS Admin Tools folder CommonMusic 53 CSIDL_COMMON_MUSIC My Music (All Users profile) CommonPictures 54 CSIDL_COMMON_PICTURES My Pictures (All Users profile) CommonVideo 55 CSIDL_COMMON_VIDEO My Videos (All Users profile) 56 CSIDL_RESOURCES Windows resources folder 59 CSIDL_CDBURN_AREA to CD. A typical path is C:\Documents and Settings\username\Local Settings\Application Data\Microsoft\CD Burning. 69 CSIDL_PHOTOALBUMS Windows Vista and later. The virtual folder used to store photo albums, typically username\My Pictures\Photo Albums. CD Burning For more examples of possible 'names', see the appropriate registry key. Source [optional] The source parameter is only used if a name string is specified. If a CSIDL code is specified this parameter is ignored. If the Name specified cannot be found, this flag specifies the registry location from which the information will be retrieved: Flag Location 0 Current user: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ Shell Folders 1 All users: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\ Shell Folders Example: startdir=ShortcutDir("Desktop",0,0) DirChange(startdir) 527 ShortcutEdit dest = StrCat(DirWindows(0),"notepad.exe") ShortcutMake("mynotepad.lnk", dest, "", "", @NORMAL,0) ShortcutEdit("mynotepad.lnk", "", "", startdir, @NORMAL,0) exit ; Get Programs folder (under Start menu in [user] profile) csidlcode = 2 ;CSIDL_PROGRAMS progdir = ShortCutDir( csidlcode, 0, 0 ) Message("Programs directory path", progdir ) exit See Also: ShortCutExtra, ShortcutInfo, ShortcutMake ShortcutEdit Modifies the specified shortcut file. Syntax: ShortcutEdit(link-name, target, params, start-dir, show-mode [, shortcut-type]) Parameters: (s) link-name (s) target (s) params (s) start-dir (i) show-mode (i) shortcut-type Returns: (i) the name of shortcut .LNK file to be created. file or directory name which "link-name" will point to. optional command-line parameters for "target" "Start in" directory for "target". "Run" mode for "target": @NORMAL, @ZOOMED, or @ICON. [optional] specifies the type of shortcut. see below @TRUE if the shortcut was successfully modified; @FALSE if it wasn't. "shortcut-type" specifies the type of shortcut, and can be one of the following: Type 0 1 Meaning Normal shortcut (default) Folder shortcut (Windows 2000 and newer) You can specify "-1" for "target", "params", or "start-dir" to set NULL values. See ShortcutMake for further information on these parameters. Note: In the ShortcutMake and ShortcutEdit functions, if the "target" parameter specifies a UNC, and it does not exist at the time this function is called, then the 528 ShortcutExtra "target" field in the shortcut may not be properly set. Specifically, it may get truncated after the share name. For example, if you use: ShortcutMake("test.lnk", "\\server\public\testdir\myprog.exe", "", "", @normal,0) and \\server\public\testdir\myprog.exe doesn't exist, then the target of the share may get set to: \\server\public. This is due to the behavior of the API function we are calling, and is consistent with the behavior when trying to create or edit a shortcut interactively from Explorer (i.e., you are prevented from specifying an invalid target). Example: startdir=ShortcutDir("Desktop",0,0) DirChange(startdir) dest = StrCat(DirWindows(0),"notepad.exe") ShortcutMake("mynotepad.lnk", dest, "", "", @NORMAL,0) ShortcutEdit("mynotepad.lnk", "", "", startdir, @NORMAL,0) See Also: ShortCutExtra, ShortcutInfo, ShortcutMake ShortcutExtra Sets additional information for the specified shortcut file. Syntax: ShortcutExtra(link-name, description, hotkey, icon-file, icon-index[, shortcuttype]) Parameters: (s) link-name (s) description (s) hotkey (s) icon-file (i) icon-index (i) shortcut-type Returns: (i) the name of shortcut .LNK file to be modified. the internal description for the shortcut. the "shortcut key" to be assigned to the shortcut. a file containing an icon to be used for the shortcut, with optional path. the 0-based index position of the desired icon within "iconfile". [optional] specifies the type of shortcut. see below @TRUE if the shortcut was successfully modified; @FALSE if it wasn't. "shortcut-type" specifies the type of shortcut, and can be one of the following: Type 0 Meaning Normal shortcut (default) 529 ShortcutExtra 1 Folder shortcut (Windows 2000 and newer) You can specify "-1" for "description", "hotkey", or "icon-file" to set NULL values. The "description" parameter only sets an internal description, which is not actually displayed anywhere. If "hotkey" is not a blank string (""), it specifies the hotkey ("shortcut key") for the shortcut. This can be an alphanumeric or special character (see below), optionally preceded by one or more of the following modifiers: ! ^ + (Alt) (Control) (Shift) This function can be used to set hotkeys which would be impossible to set from within the shortcut properties dialog in Explorer. Note: some key combinations may not be supported on all Windows platforms. List of special keys for ShortcutExtra: {BACKSPACE} {CLEAR} {DEL} {END} {ESCAPE} {HOME} {INS} {NUMPAD*} {NUMPAD-} {NUMPAD/} {NUMPAD1} {NUMPAD3} {NUMPAD5} {NUMPAD7} {NUMPAD9} {PGUP} {RIGHT} {SP} {UP} {F1} {F2} {F3} {F4} {F5} {F6} 530 {BS} {DELETE} {DOWN} {ENTER} {ESC} {HELP} {INSERT} {LEFT} {NUMPAD+} {NUMPAD.} {NUMPAD0} {NUMPAD2} {NUMPAD4} {NUMPAD6} {NUMPAD8} {PGDN} {PRTSC} {SPACE} {TAB} {F7} {F8} {F9} {F10} {F11} {F12} {F13} {F14} {F15} {F16} ShortcutInfo "Icon-file" can be used to specify an .EXE (or .DLL) file or an .ICO file containing an icon which you want to be used for the shortcut. If "icon-file" specifies an .EXE (or .DLL) file (which can contain multiple icons), then "icon-index" can be used to specify the offset of a particular icon within "icon-file", where 0 indicates the first icon in the file, 1 indicates the second icon, etc. If "icon-file" specifies an .ICO file, then "icon-index" should be 0. You can specify a blank string ("") for "icon-file", and 0 for "icon-index", to use the default icon. Example: startdir=ShortcutDir("Desktop",0,0) DirChange(startdir) dest = StrCat(DirWindows(0),"notepad.exe") ShortcutMake("mynotepad.lnk", dest, "", "", @NORMAL,0) ShortcutEdit("mynotepad.lnk", "", "", startdir, @NORMAL,0) ShortcutExtra("mynotepad.lnk", "Notepad shortcut", "^!n", "", 0,0) See Also: ShortcutEdit, ShortcutInfo, ShortcutMake ShortcutInfo Returns information on the specified shortcut file. Syntax: ShortcutInfo(link-name[, shortcut-type]) Parameters: (s) link-name (i) shortcut type the name of shortcut .LNK file. [optional] specifies the type of shortcut. see below. Returns: (s) a TAB delimited list of information on the shortcut file. ShortcutInfo returns a TAB-delimited list containing the following items (some of which may be blank): target params start-dir show-mode file or directory name which the shortcut points to. command-line parameters for "target". "Start in" directory for "target". "Run" mode for "target": 1 (@ICON), 2 (@NORMAL), or 3 (@ZOOMED). description the internal description for the shortcut. hotkey the "shortcut key" for the shortcut. icon-file the name of the icon file being used by the shortcut. icon-index the 0-based index position within "icon-file" of the icon being used. "shortcut-type" specifies the type of shortcut, and can be one of the following: 531 ShortcutMake Type 0 1 Meaning Normal shortcut (default) Folder shortcut (Windows 2000 and newer) Example: startdir=ShortcutDir("Desktop",0,0) DirChange(startdir) dest = StrCat(DirWindows(0),"notepad.exe") ShortcutMake("mynotepad.lnk", dest, "", "", @NORMAL,0) ShortcutEdit("mynotepad.lnk", "", "", startdir, @NORMAL,0) ShortcutExtra("mynotepad.lnk", "Notepad shortcut", "^!n", "", 0,0) info=ShortcutInfo("mynotepad.lnk") target= ItemExtract(1, info, @tab) params= ItemExtract(2, info, @tab) workdir= ItemExtract(3, info, @tab) showmode= ItemExtract(4, info, @tab) desc= ItemExtract(5, info, @tab) hotkey= ItemExtract(6, info, @tab) iconfile= ItemExtract(7, info, @tab) iconindex= ItemExtract(8, info, @tab) editinfo=StrCat("filename=",target,@crlf,"params=",params,@crlf, "workdir=",workdir,@crlf,"showmode=",showmode) extrainfo=StrCat("desc=",desc,@crlf,"hotkey=",hotkey,@crlf, "iconfile=", iconfile,@crlf,"iconindex=",iconindex) Message("ShortcutInfo Syntax", StrCat(editinfo,@crlf, extrainfo)) See Also: ShortcutEdit, ShortCutExtra, ShortcutMake ShortcutMake Creates a shortcut for the specified filename or directory. Syntax: ShortcutMake(link-name, target, params, start-dir, show-mode [, shortcut-type]) Parameters: (s) link-name (s) target (s) params (s) start-dir (i) show-mode (i) shortcut type Returns: (i) 532 the name of shortcut .LNK file to be created. file or directory name which "link-name" will point to. command-line parameters for "target" or NULL string. "Start in" directory for "target". "Run" mode for "target": 1 (@ICON), 2 (@NORMAL), or 3 (@ZOOMED). [optional] specifies the type of shortcut. see below. @TRUE if the shortcut was successfully created; @FALSE if it wasn't. Sin This function can be used to create a shortcut file which points to a filename or to a directory. "Link-name" the name of shortcut to be created. For a file shortcut you should specify the {filename}.LNK. For a directory shortcut specify just the name of the shortcut. For Example, to create a directory shortcut: ShortcutMake("Test", "\\server\public\testdir\", "", "", @normal,1) "Params" and "start-dir" are optional, and can be set to blank strings (""). "Showmode" is optional, and can be set to 0. If "target" specifies a directory, the other parameters are meaningless. Note: In the ShortcutMake and ShortcutEdit functions, if the "target" parameter specifies a UNC, and it does not exist at the time this function is called, then the "target" field in the shortcut may not be properly set. Specifically, it may get truncated after the share name. For example, if you use: ShortcutMake("test.lnk", "\\server\public\testdir\myprog.exe", "", "", @normal,0) and \\server\public\testdir\myprog.exe doesn't exist, then the target of the share may get set to: \\server\public. This is due to the behavior of the API function we are calling, and is consistent with the behavior when trying to create or edit a shortcut interactively from Explorer (i.e., you are prevented from specifying an invalid target). "shortcut-type" specifies the type of shortcut, and can be one of the following: Type 0 1 Meaning Normal shortcut (default) Folder shortcut (Windows 2000 and newer) Example: dest = StrCat(DirWindows(0),"notepad.exe") ShortcutMake("mynotepad.lnk", dest, "", "", @NORMAL,0) See Also: ShortcutEdit, ShortCutExtra, ShortcutInfo Sin Calculates the sine. Syntax: Sin(x) 533 SnapShot Parameters: (f) x angle in radians. Returns: (f) The Sin function returns the sine of x. Calculates the sine. If the passed parameter is large, a loss in significance in the result or significance error may occur. Note: To convert an angle measured in degrees to radians, simply multiply by the constant @Deg2Rad. Example: real=AskLine("Sine", "Enter an angle between 0 and 360", "45", 0) answer=sin(real * @Deg2Rad) Message("Sine of %real% degrees is", answer) See Also: Acos, Asin, Atan, Cos, Tan, Sinh Sinh Calculates the hyperbolic sine. Syntax: Sinh(x) Parameters: (f) x angle in radians. Returns: (f) the hyperbolic sine of x. Calculates the hyperbolic sine. If the passed parameter is large, a loss in significance in the result or significance error may occur. Note: To convert an angle measured in degrees to radians, simply multiply by the constant @Deg2Rad. Example: real=AskLine("SinH", "Enter an angle between 0 and 360", "45", 0) answer=sinh(real * @Deg2Rad) Message("Hyperbolic Sine of %real% degrees is", answer) See Also: Acos, Asin, Atan, Cos, Cosh, Sin, Tan, Tanh SnapShot Takes a bitmap snapshot of the screen and pastes it to the clipboard. 534 SnapShot Syntax: SnapShot (request#) Parameters: (i) request# see below. Returns: (i) always 0. Req# 0 1 2 3 4 5 Meaning Take snapshot of entire screen Take snapshot of client area of parent window of active window Take snapshot of entire area of parent window of active window Take snapshot of client area of active window Take snapshot of entire area of active window Take snapshot of entire virtual screen (Windows 98+) On versions of Windows, that do not support virtual screens, this will be treated the same as request 0. This function supports multi-monitor systems Example: ;Takes a bitmap snapshot of the screen and pastes it to the clipboard. Snapshot(0) ;returns the size of buffer needed for a subsequent BinaryAlloc, ;but doesn't attempt to place the contents of clipboard into a buffer size=BinaryClipGet(0,8) ;allocates a data buffer bb=BinaryAlloc(size) ;read file format type CF_DIB BinaryClipGet(bb,8) ; need to add first 14 bytes to make it ; a BMP file format bmpdatasize=14 bb2=BinaryAlloc(size + bmpdatasize) ;The characters identifying the bitmap.'BM' BinaryPokeStr(bb2, 0, "BM") ;Complete file size in bytes. BinaryPoke4(bb2,2,size + bmpdatasize) ;Reserved BinaryPoke4(bb2,6,0) ;Data offset headersize=BinaryPeek4(bb,0) dataoffset = headersize + bmpdatasize BinaryPoke4(bb2,10,dataoffset) BinaryCopy(bb2,bmpdatasize,bb,0,size) BinaryWrite(bb2,"c:\temp\screenshot.bmp") BinaryFree(bb) BinaryFree(bb2) 535 SoundVolume Message("All","Done") See Also: ClipPut Sounds Controls sound effects generated by WIL. This feature is off by default as windows generally supplies its own sound effects. Syntax: Sounds (request#) Parameters: (i) request# 0 to turn sounds off; 1 to turn sounds on. Returns: (i) previous Sound setting. If Windows multimedia sound extensions are present, this function turns sounds made by the WIL Interpreter on or off. Specify a request# of 0 to turn sounds off, and a request# of 1 to turn them on. Example: Sounds(1) Message("Sounds"," Sounded.") See Also: Beep, PlayMedia, PlayMidi, PlayWaveForm SoundVolume Sets the speaker volume. Syntax: SoundVolume (level) Parameters: (i) level Returns: (i) specifies the volume level, from 0 (min) to 100 (max). specify -1 to get the current volume setting. if level 0 to 100 it returns previous volume level. if level is -1 it returns the current volume level. Example: Sounds(1) currentlevel = SoundVolume (-1) Message("SoundVolume - Current level", currentlevel) ;lower volume 10% 536 StrByteCount level = SoundVolume (currentlevel -10) Message("SoundVolume - Sound lowered 10%%", currentlevel -10) ;Set back to original volume SoundVolume (currentlevel) See Also: Sounds, Beep, PlayMedia PlayMidi, PlayWaveForm Sqrt Calculates the square root. Syntax: Sqrt(x) Parameters: (f) x floating point number. Returns: (f) the square root result. The Sqrt function calculates the square root of the passed parameter. If the passed parameter is negative, a domain error occurs. Example: real=AskLine("Square Root", "Enter a positive number", "269", 0) answer=sqrt(real) Message("Square root of %real% is", answer) See Also: Operator ** (the power operator) StrByteCount Returns the length of a string, in bytes. Syntax: StrByteCount (string, request) Parameters: (s) string (i) request Returns: (i) Request -1 specifies an ANSI or Unicode string. specifies how "string" should be treated in order to calculate its length: the length of a string, in bytes. Meaning current format (ANSI or Unicode) 537 StrCharCount 0 1 ANSI string (including double-byte ANSI character sets) Unicode string Example: myname = AskLine("Firstname", "Enter your first name:", "", 0) numbytes = StrByteCount(myname, -1) Message("Number of bytes in first name", numbytes) See Also: StrLen StrCat Concatenates two or more strings. Syntax: StrCat (string1, string2[, ..., stringN]) Parameters: (s) string1, etc. at least two strings you want to concatenate. Returns: (s) concatenation of the entire list of input strings. Use this command to stick character strings together, or to format display messages. Although the substitution feature of the WIL (putting percent signs on both side of a variable name) is a little quicker and easier than the strcat function, substitution should only be used for simple, short cases. Use StrCat when concatenating large strings. Example: user = AskLine("Login", "Your Name:", "", 0) msg = StrCat("Hi, ", user) Message("Login", msg) ; note that this is the same as the second line above: msg = "Hi, %user%" See Also: StrFill, StrFix, StrTrim StrCharCount Counts the number of characters in a string. Syntax: StrCharCount(string) Parameters: (s) string 538 any text string. StrClean Returns: (i) the number of characters in a string, Use this function to count the number of characters in a string. This function is useful when dealing with double-byte character sets such as those containing Kanji characters. When using single byte character sets, such as those found in English versions of Windows, this function is identical to the StrLen function. Example: name = AskLine("Data Entry", "Please enter your name", "", 0) len = StrLen(name) chars = StrCharCount(name) Message(name, "Is %len% bytes long and %@CRLF% has %chars% characters") See Also: StrLen, StrByteCount, StrScan, StrReplace, StrFill StrClean Removes or replaces characters in a string. Syntax: StrClean( source-string, characters, replacement, match-case, mode) Parameters: (s) source-string (s) characters (s) replacement (i) match-case (i) mode Returns: (s) the string to be operated upon. a string that specifies the characters in "source-string" to be replaced or retained. the replacement string to be inserted in place of matching (or non-matching) characters. @TRUE or @FALSE, indicating whether string comparisons are case-sensitive or case-insensitive, respectively. see below. the new string, with all changes made. The original string ("source-string") is untouched. "characters" is a string that specifies the characters in "source-string" to be replaced or retained. This parameter can be a single character (e.g., "x"), a list of characters (e.g., "~!@#"), or a blank string (""). "replacement" specifies the replacement string to be inserted in place of matching (or non-matching) characters. It can be a string, one or more characters long. It can also be a blank string (""), in which case matching characters are removed. 539 StrCmp "mode" can be one of the following: Value 1 2 Meaning Replace all occurrences of "characters" with "replacement" Replace all non-occurrences of "characters" with "replacement" This function can be used to remove or replace specific characters in a string, or to retain only specific characters in a string. If "mode" is 1, then any characters which appear in "characters" will be replaced with "replacement". If "replacement" is a blank string, then any characters which appear in "characters" will be removed. If "characters" is a blank string, then no chnges will be made. If "mode" is 2, then any characters which DON'T appear in "characters" will be replaced with "replacement". If "replacement" is a blank string, then any characters which DON'T appear in "characters" will be removed. If "characters" is a blank string, then ALL characters will be replaced. Example: ; Remove all spaces from a string StrClean("Have a nice day", " ", "", @FALSE, 1) ; Replace all ampersands with the HTML code "&" StrClean("Here & there & everywhere", "&", "&", @FALSE, 1) ; Remove all characters other then letters and spaces StrClean("Healthy, wealthy, & wise.", "abcdefghijklmnopqrstuvwxyz ", "", @FALSE, 2) See Also: StrReplace, ItemReplace StrCmp Compares two strings. Syntax: StrCmp (string1, string2) Parameters: (s) string1, string2 Returns: (i) strings to compare. -1, 0, or 1; depending on whether string1 is less than, equal to, or greater than string2, respectively. Use this command to determine whether two strings are equal, or which precedes the other in an ANSI sorting sequence. 540 StrCnt Example: a = AskLine("STRCMP", "Enter a test line", "", 0) b = AskLine("STRCMP", "Enter another test line", "", 0) c = StrCmp(a, b) c = c + 1 d = StrSub("less than equal to greater than", (c * 12)+ 1, 12) ; Note that above string is grouped into 12-character chunks. ; Desired chunk is removed with the StrSub statement. Message("STRCMP", "%a% is %d% %b%") See Also: StriCmp, StrIndex, StrLen, StrScan, StrSub StrCnt Counts the occurrences of a substring within a string. Syntax: StrCnt(string, sub-string, start-pos, end-pos, flags) Parameters: (s) string specifies the main string. (s) sub-string specifies the substring to search for within "string". (i) start-pos specifies the position in "string" at which to begin searching, or -1 to indicate the end of the string. The first character of the string is at position 1. (i) end-pos specifies the position in "string" at which to end searching, or -1 to indicate the end of the string. The first character of the string is at position 1. Note that if the string begins at or before "end-pos" and continues past "end-pos", it will be counted. (i) flags can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value Meaning 1 match case Returns: (i) number of occurrences. Example: str = "How many I's are in this string?" 541 StrFix rslt = StrCnt(str, "i", 1, -1, 0) Message("STRCNT - number of occurrences of the letter i", rslt) See Also: StriCmp, StrIndex, StrLen, StrScan, StrSub StrFill Creates a string filled with a series of characters. Syntax: StrFill (filler, length) Parameters: (s) filler (i) length Returns: (s) a string to be repeated to create the return string. If the filler string is null, spaces will be used instead. the length of the desired string. character string. Use this function to create a string consisting of multiple copies of the filler string concatenated together. Example: Message("My Stars", StrFill("*", 30)) which produces… See Also: StrCat, StrFix, StrLen, StrTrim StrFix Pads or truncates a string to a fixed length using characters. Syntax: StrFix (base-string, pad-string, length) 542 StrFixBytes Parameters: (s) base-string (s) pad-string (i) length Returns: (s) string to be adjusted to a fixed length. appended to base-string if needed to fill out the desired length. If pad-string is null, spaces are used instead. character count of the string. fixed size string. This function is identical to StrFixChars function. This function "fixes" the length of a string, either by truncating it on the right, or by appending enough copies of padstring to achieve the desired length. Example: a = StrFix("Henry", " ", 15) b = StrFix("Betty", " ", 15) c = StrFix("George", " ", 15) Message("Spaced Names", StrCat(a, b, c)) which produces… See Also: StrFixBytes, StrFixBytesL, StrFixChars, StrFixCharsL, StrFixLeft, StrFill, StrLen, StrTrim StrFixBytes Pads or truncates a string to a fixed length using bytes. Syntax: StrFixBytes (base-string, pad-string, length) Parameters: (s) base-string (s) pad-string (i) length string to be adjusted to a fixed length. appended to base-string if needed to fill out the desired length. If pad-string is null, spaces are used instead. specifies length in bytes. 543 StrFixBytesL Returns: (s) fixed size string. This function "fixes" the length of a string, either by truncating it on the right, or by appending enough copies of pad-string to achieve the desired length. If either 'base-string' or 'pad-string' is a Unicode string, then 'length' must be an even number (each character has two bytes). Example: a = StrFixBytes b = StrFixBytes c = StrFixBytes Message("Spaced ("Henry", " ", 15) ("Betty", " ", 15) ("George", " ", 15) Names", StrCat(a, b, c)) See Also: StrFix, StrFixBytesL, StrFixChars, StrFixCharsL, StrFixLeft, StrFill, StrLen, StrTrim StrFixBytesL Pads or truncates the left side of a string to a fixed length using bytes. Syntax: StrFixBytesL(base-string, pad-string, length) Parameters: (s) base-string (s) pad-string (i) length Returns: (s) string to be adjusted to a fixed length. appended to base-string if needed to fill out the desired length. If pad-string is null, spaces are used instead. specifies the length in bytes. fixed size string. If either 'base-string' or 'pad-string' is a Unicode string, then 'length' must be an even number (each character has two bytes). Example: a = StrFixBytesL("Henry", " ", 15) b = StrFixBytesL ("Betty", " ", 15) c = StrFixBytesL ("George", " ", 15) Message("Spaced Names", StrCat(a, b, c)) See Also: StrFix, StrFixBytes, StrFixChars, StrFixCharsL, StrFixLeft, StrFill, StrLen, StrTrim 544 StrFixCharsL StrFixChars Pads or truncates a string to a fixed length using characters. Syntax: StrFixChars(base-string, pad-string, length) Parameters: (s) base-string (s) pad-string (i) length Returns: (s) string to be adjusted to a fixed length. appended to base-string if needed to fill out the desired length. If pad-string is null, spaces are used instead. character count of the string. fixed size string. This function is identical to StrFixin that it "fixes" the length of a string, either by truncating it on the right, or by appending enough copies of pad-string to achieve the desired length Example: a = StrFixChars("Henry", " ", 15) b = StrFixChars("Betty", " ", 15) c = StrFixChars("George", " ", 15) Message("Spaced Names", StrCat(a, b, c)) See Also: StrFix, StrFixBytes, StrFixBytesL, StrFixCharsL, StrFixLeft, StrFill StrFixCharsL Pads or truncates the left side of a string to a fixed length using characters. Syntax: StrFixCharsL(base-string, pad-string, length) Parameters: (s) base-string (s) pad-string (i) length Returns: (s) string to be adjusted to a fixed length. appended to base-string if needed to fill out the desired length. If pad-string is null, spaces are used instead. character count of the string. fixed size string. 545 StrFixLeft This function is indentical to StrFixLeft. It "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. Example: a = StrFixCharsL("Henry", " ", 15) b = StrFixCharsL("Betty", " ", 15) c = StrFixCharsL("George", " ", 15) Message("Spaced Names", StrCat(a, b, c)) See Also: StrFix, StrFixBytes, StrFixBytesL, StrFixChars, StrFixLeft, StrFill, StrLen, StrTrim StrFixLeft Pads or truncates the left side of a string to a fixed length using characters. Syntax: StrFixLeft(base-string, pad-string, length) Parameters: (s) base-string (s) pad-string (i) length Returns: (s) string to be adjusted to a fixed length. appended to base-string if needed to fill out the desired length. If pad-string is null, spaces are used instead. character count of the string. fixed size string. This function is identical to StrFixCharsL. This function "fixes" the length of a string, either by truncating it on the left, or by prepending enough copies of padstring to achieve the desired length. Example: a = StrFixLeft("Henry", " ", 15) b = StrFixLeft("Betty", " ", 15) c = StrFixLeft("George", " ", 15) Message("Spaced Names", StrCat(a, b, c)) See Also: StrFix, StrFixBytes, StrFixBytesL, StrFixChars, StrFixCharsL, StrFill, StrLen, StrTrim 546 StrIndex StriCmp Compares two strings without regard to case. Syntax: StriCmp (string1, string2) Parameters: (s) string1, string2 Returns: (i) strings to compare. -1, 0, or 1; depending on whether string1 is less than, equal to, or greater than string2, respectively. Use this command to determine whether two strings are equal, or which precedes the other in an ANSI sorting sequence, when case is ignored. Example: a = AskLine("STRICMP", "Enter a test line", "", 0) b = AskLine("STRICMP", "Enter another test line", "", 0) c = StriCmp(a, b) c = c + 1 d = StrSub("less than equal to greater than", (c * 12)+ 1, 12) ; Note that above string is grouped into 12-character chunks. ; Desired chunk is removed with the StrSub statement. Message("STRICMP", "%a% is %d% %b%") See Also: StrCmp, StrIndex, StrLen, StrScan, StrSub StrIndex Searches a string for a sub-string. Syntax: StrIndex (string, sub-string, start, direction) Parameters: (s) string (s) sub-string (i) start (i) direction Returns: (i) the string to be searched for a sub-string. the string to look for within the main string. the position in the main string to begin search. The first character of a string is position 1. the search direction. @FWDSCAN searches forward, while @BACKSCAN searches backwards. position of sub-string within string, or 0 if not found. 547 StrIndexNc This function searches for a sub-string within a "target" string. Starting at the "start" position, it goes forward or backward depending on the value of the "direction" parameter. It stops when it finds the "sub-string" within the "target" string, and returns its position. A start position of 0 has special meaning depending on which direction you are scanning. For forward searches, zero indicates the search should start at the beginning of the string. For reverse searches, zero causes it to start at the end of the string. Example: instr = AskLine("STRINDEX", "Type a sentence:", "", 0) start = 1 daend = StrIndex(instr, " ", start, @FWDSCAN) If daend == 0 Message("Sorry...", "No spaces found") else a = StrCat("First word is: ", StrSub(instr, start, daend - 1)) Message("STRINDEX", a) endif See Also: StrLen, StrScan, StrSub StrIndexNc Searches a string for a sub-string, ignoring case. Syntax: StrIndexNc (string, sub-string, start, direction) Parameters: (s) string (s) sub-string (i) start (i) direction Returns: (i) the string to be searched for a sub-string. the string to look for within the main string. the position in the main string to begin search. The first character of a string is position 1. the search direction. @FWDSCAN searches forward, while @BACKSCAN searches backwards. position of sub-string within string, or 0 if not found. This function searches for a sub-string within a "target" string. Starting at the "start" position, it goes forward or backward depending on the value of the "direction" parameter. It stops when it finds the "sub-string" within the "target" string, and returns its position. It is not case-sensitive. A start position of 0 has special meaning depending on which direction you are scanning. For forward searches, zero indicates the search should start at the 548 StrIndexWild beginning of the string. For reverse searches, zero causes it to start at the end of the string. Example: instr = AskLine("STRINDEX", "Type a sentence:", "", 0) start = 1 daend = StrIndexNc(instr, " ", start, @FWDSCAN) If daend == 0 Message("Sorry...", "No spaces found") else a = StrCat("First word is: ", StrSub(instr, start, daend - 1)) Message("STRINDEX", a) endif See Also: StrIndex, StrIndexWild, StrLen, StrScan, StrSub StrIndexWild Finds wildcarded text within a larger string. Syntax: StrIndexWild(string, pattern, start) Parameters: (s) string (s) pattern (i) start Returns: (i) the string to be searched for a sub-string. the wildcarded text to search for. the position in the main string to begin search. The first character of a string is position 1. position of sub-string within string, or 0 if not found. In the wildcard pattern, "*" matches zero or more characters, and "?" matches any one character. Note: StrIndexWild returns "start" instead of 0 if "pattern" is a blank string (unless "start" == 0, in which case it returns 1). Example: StrIndexWild("abcd1234wxyz", StrIndexWild("abcd1234wxyz", StrIndexWild("abcd1234wxyz", StrIndexWild("abcd1234wxyz", "ab*wx", 1) "1*9", 1) "1*4", 1) "1?34*z", 1) ; ; ; ; would would would would return return return return 1 0(no match) 5 5 See Also: StrIndex, StrIndexNC, StrLen, StrScan, StrSub 549 StrLen StrInsert Inserts a new string into an existing string. (Windows NT and newer) Syntax: StrInsert (base-string, new-string, [pad-string [, start [, length]]]) Parameters: (s) base-string (s) new-string (s) pad-string (i) start (i) length Returns: (s) specifies the existing string. specifies the string to be inserted into "base-string". [optional] specifies a character or string to be used for padding, if necessary. The default is a space (' '). [optional] specifies the position in "base-string" before which "new-string" is to be inserted, where the position of the first character of the string is 1. To insert at the very beginning of "base-string", specify a value of 1. You can specify -1 to insert after the end of "base-string". If "start" is past the end of "base-string", padding will be inserted between the end of "base-string" and the beginning of "newstring". The default is 1. [optional] specifies the number of characters to insert. If "length" is shorter than the length of "new-string", "newstring" will be truncated. If "length" is longer than the length of "new-string", padding will be inserted after the end of "new-string". The default is the length of "newstring". the modified string. Example: Name = "Joe" ret = StrInsert("Hello my name is ",name," ",-1,StrLen(name)) Message( "StrInsert() Example", ret ) See Also: StrCharCount, StrByteCount, StrFill, StrFix, StrIndex, StrIndexNc, StrOverlay, StrScan, StrTrim StrLen Provides the number of characters in a string. Syntax: StrLen (string) Parameters: (s) string 550 any text string. StrLower Returns: (i) number of characters in a string. Example: myfile = AskLine("Filename", "File to process:", "", 0) namlen = StrLen(myfile) If namlen > 13 Message("Error", "Filename too long!") endif See Also: StrCharCount, StrByteCount, StrFill, StrFix, StrIndex, StrIndexNC, StrScan, StrTrim StrLenWild Finds wildcarded text within a larger string. Syntax: StrLenWild (string, pattern, start) Parameters: (s) string (s) pattern (i) start Returns: (i) any text string. The wildcarded text to match. The position (in characters) within the string to begin matching. the length (in characters) of the portion of the string that matches the wildcard pattern, or 0 if no match at the specified position. In the wildcard pattern, "*" matches zero or more characters, and "?" matches any one character. Example: StrLenWild("abcd1234wxyz", StrLenWild("abcd1234wxyz", StrLenWild("abcd1234wxyz", StrLenWild("abcd1234wxyz", "ab*wx", 1) "1*9", 1) "1*4", 5) "1?34*z", 5) ; ; ; ; would would would would return return return return 10 0 4 8 See Also: StrFill, StrLen, StrFix, StrIndex, StrIndexNc, StrScan, StrTrim StrLower Converts a string to lowercase. 551 StrOverlay Syntax: StrLower (string) Parameters: (s) string any text string. Returns: (s) lowercase string. Use this command to convert a text string to lower case. Example: a = AskLine("STRLOWER", "Enter text", "", 0) b = StrLower(a) Message(a, b) See Also: StriCmp, StrUpper StrOverlay Overlays a new string onto an existing string. (Windows NT and newer) Syntax: StrOverlay (base-string, new-string, [pad-string [, start [, length]]]) Parameters: (s) base-string (s) new-string (s) pad-string (i) start (i) length Returns: (s) 552 specifies the existing string. specifies the string to be overlaid onto "base-string". [optional] specifies a character or string to be used for padding, if necessary. The default is a space (' '). [optional] specifies the position in "base-string" after which "new-string" is to be overlaid, where the position of the first character of the string is 1. You can specify -1 to overlay after the end of "base-string". If "start" is past the end of "base-string", padding will be inserted between the end of "base-string" and the beginning of "new-string". The default is 1. [optional] specifies the number of characters to overlay. If "length" is shorter than the length of "new-string", "newstring" will be truncated. If "length" is longer than the length of "new-string", padding will be overlaid after the end of "new-string". The default is the length of "newstring". the modified string. StrScan Example: Name = "Joe" ret = StrOverlay( "Hello my name is ", name, " ", -1, StrLen(name) ) Message( "StrOverlay() Example", ret ) See Also: StrCharCount, StrByteCount, StrFill, StrFix, StrIndex, StrInsert, StrIndexNc, StrScan, StrTrim StrReplace Replaces all occurrences of a sub-string with another. Syntax: StrReplace (string, old, new) Parameters: (s) string (s) old (s) new string in which to search. target sub-string. replacement sub-string. Returns: (s) updated string, with old replaced by new. StrReplace scans the "string", searching for occurrences of "old" and replacing each occurrence with "new". Example: ; Copy all INI files to clipboard a = FileItemize("*.ini") ;in file list replace tabs with crlf's. b = StrReplace(a, @tab, @CRLF) ClipPut(b) newlist=StrCat("Before", @CRLF, a,@CRLF,@CRLF,"After", @CRLF, b) Message("StrReplace",newlist) See Also: StrIndex, StrIndexNC, StrIndexWild, StrScan, StrSub StrScan Searches string for occurrence of delimiters. Syntax: StrScan (string, delimiters, start, direction) Parameters: (s) string (s) delimiters the string that is to be searched. a string of delimiters to search for within string. 553 StrScan (i) start (i) direction Returns: (i) the position in the main string to begin search. The first character of a string is position 1. the search direction. @FWDSCAN searches forward, while @BACKSCAN searches backwards. position of delimiter in string, or 0 if not found. This function searches for delimiters within a target "string". Starting at the "start" position, it goes forward or backward depending on the value of the "direction" parameter. It stops when it finds any one of the characters in the "delimiters" string within the target "string". A start position of 0 has special meaning depending on which direction you are scanning. For forward searches, zero indicates the search should start at the beginning of the string. For reverse searches, zero causes it to start at the end of the string. Example: ; Parse a string with multiple delimiters into standard param format thestr = "123,456.789:abc" length=StrLen(thestr) start = 1 count=0 while @TRUE finish = StrScan(thestr, ",.:", start, @FWDSCAN) If finish == 0 break else count = count+1 param%count% = StrSub(thestr, start, finish - start) start=finish+1 Message("Parameter number %count% is", param%count%) If finish == length then Break endif endwhile If start <= length finish = length+1 count = count+1 param%count% = StrSub(thestr, start, finish - start) Message("Parameter number %count% is", param%count%) endif param0 = count Message("Parameter count is",param0) See Also: StrLen, StrSub 554 StrSubWild StrSub Extracts a sub-string out of an existing string. Syntax: StrSub (string, start, length) Parameters: (s) string (i) start (i) length Returns: (s) the string from which the sub-string is to be extracted. character position within string where the sub-string starts. (The first character of the string is at position 1). length of desired sub-string. If you specify a length of zero it will return a null string. If you specify a length of -1 it will extract the rest of the string. sub-string of parameter string or "". This function extracts a sub-string from within a "target" string. Starting at the "start" position, it copies up to "length" characters into the sub-string. This function will return "", if illegal bounds are given. Example: a = "My dog has fleas" animal = StrSub(a, 4, 3) Message("STRSUB", "My animal is a %animal%") See Also: StrLen, StrScan StrSubWild Extracts a substring matching wildcarded text from within a larger string. Syntax: StrSubWild(string, pattern, start) Parameters: (s) string (s) pattern (i) start Returns: (s) the string from which the sub-string is to be extracted. the wildcarded text to match. the position (in characters) within the string to begin matching. the portion of the string matched by the wildcard pattern. In the wildcard pattern, "*" matches zero or more characters, and "?" matches any one character. 555 StrTypeInfo Example: StrSubWild("abcd1234wxyz", StrSubWild("abcd1234wxyz", StrSubWild("abcd1234wxyz", StrSubWild("abcd1234wxyz", "ab*wx", 1) "1*9", 1) "1*4", 5) "1?34*z", 5) ; ; ; ; would would would would return return return return "abcd1234wx" "" "1234" "1234wxyz" See Also: StrSub, StrLen, StrScan StrTrim Removes leading and trailing blanks from a character string. Syntax: StrTrim (string) Parameters: (s) string a string with unwanted blanks at the beginning and/or end. Returns: (s) string devoid of leading and trailing blanks. This function removes spaces and tab characters from the beginning and end of a text string. Example: mydata = "" while mydata != "exit" mydata = AskLine("STRTRIM", "Type stuff ('exit' quits)", "", 0) mydata = StrTrim(mydata) Display(4,"STRTRIM",">%mydata%<") endwhile exit See Also: StrFill, StrFix, StrLen StrTypeInfo Gets character-type information for a string, or information for a character-type. Syntax: StrTypeInfo( string, flag) Parameters: (s) string (i) flag a character or a string. a flag specifying the information to retrieve (see below). Returns: (i/s) depends on the flag specified. See below. 556 StrTypeInfo If "flag" = 0 or 1, "value" specifies a string of 1 or more characters. For each character in the string, a character-type is determined. The character-type is comprised of one or more of the following values, combined using the bitwise OR ('|') operator: Value 1 2 4 8 16 32 64 128 256 512 Name C1_UPPER C1_LOWER C1_DIGIT C1_SPACE C1_PUNCT C1_CNTRL C1_BLANK C1_XDIGIT C1_ALPHA C1_DEFINED Meaning Uppercase Lowercase Decimal digits Space characters Punctuation Control characters Blank characters Hexadecimal digits Any linguistic character: alphabetical, syllabary, or ideographic A defined character (not used in Windows 95/98/ME If "flag" = 0, the function returns a value comprised of the character-types of all the characters in the string, combined using the bitwise AND ('&') operator. If "flag" = 1, the function returns a value comprised of the character-types of all the characters in the string, combined using the bitwise OR ('|') operator. If "flag" = -1, "value" specifies a character-type, and the function returns a string describing the bits that make up the character-type. The string is comprised of a space-delimited list of words, with one word describing each bit contained within the character-type: Value 1 2 4 8 16 32 64 128 256 512 Name C1_UPPER C1_LOWER C1_DIGIT C1_SPACE C1_PUNCT C1_CNTRL C1_BLANK C1_XDIGIT C1_ALPHA C1_DEFINED Word in string "Upper" "Lower" "Digit" "Space" "Punct" "Cntrl" "Blank" "HexDg" "Alpha" "Undef" if the C1_DEFINED bit is NOT set. (not used in Windows 95/98/ME ) 557 StrUpper String parameters and return values are ANSI in Windows 95/98/ME, and Unicode in Windows NT and newer. Example: str= "!@#abcxyz123%@CRLF%111%@TAB%" While @true str = AskLine( "Test", "Enter Something", str ) typeAND = StrTypeInfo( str, 0 ) typeOR = StrTypeInfo( str, 1) dalen = StrLen( str) allinfo = "" if typeAND==0 allinfo = StrCat(allinfo,"No defined characters found",@crlf,@crlf) else if typeAND==512 allinfo= StrCat(allinfo,"No common type matches found in string",@crlf,@crlf) else allinfo= StrCat(allinfo,"Entire string is :",@crlf,StrTypeInfo(typeAND,-1),@crlf,@crlf) endif endif allinfo= StrCat(allInfo,"String contains :",@crlf,StrTypeInfo(typeOR,-1),@crlf,@crlf) ; Loop once for each character For index = 1 to dalen char = StrSub( str, index, 1 ) typeinf = StrTypeInfo(StrTypeInfo(char,0),-1) allinfo = StrCat(allinfo,char," : ",typeinf,@crlf) Next Pause(str,allinfo) endwhile exit See Also: StrSub, StrLower, StrUpper StrUpper Converts a string to uppercase. Syntax: StrUpper (string) Parameters: (s) string 558 any text string. Switch Returns: (s) uppercase string. Use this function to convert a text string to upper case. Example: a = AskLine("STRUPPER", "Enter text","", 0) b = StrUpper(a) Message(a, b) See Also: StriCmp, StrLower Switch The Switch statement allows selection among multiple blocks of statements. Syntax: Switch expression case expression statements break case expression statements break EndSwitch Parameters: (s) expression an expression that must evaluate to an integer. The Switch statement allows selection among multiple blocks of statements, depending on the value of an expression. The expression must evaluate to an integer. The Switch statement causes the statements in the switch body to be scanned by the parser as it attempts to find a case statement. When a case statement is found, the expression following the case statement is evaluated, and if the expression evaluates to the same value as the expression following the Switch statement, execution of the following statements is initiated. The EndSwitch statement terminates the Switch structure. If a matching case expression was found, and execution was initiated, the following statements will affect continued execution: Break Terminates the Switch structure and transfers control to the statement following the next matching EndSwitch. Continue Stops execution and resumes scanning for a case statement. 559 SysParamInfo Case Ignored. Treated as a comment EndSwitch Terminates the Switch structure and transfers control to the next statement. Note: Switch and Select may be used interchangeably. They are synonyms for the same statement. EndSwitch, EndSelect, "End Switch", and "End Select" may be used interchangeably. Example: response=AskLine("Switch", "Enter a number between 1 and 3", 1, 0) Switch response case 1 Message("Switch", "Case 1 entered") break case 2 Message("Switch", "Case 2 entered") break case 3 Message("Switch", "Case 3 entered") break case response ; default case Message("Switch", "Default case entered") break EndSwitch See Also: If, For, GoSub, While SysParamInfo Retrieves or sets the value of one of the system-wide parameters. Syntax: SysParamInfo( request, value, INI-update) Parameters: (i) request (s/i) value 560 Integer that specifies the system-wide parameter to retrieve or set. Depends on specified request. (see below) Tan (i) INI-update Returns: (s/i) Ignored when retrieving information. When setting values this parameter determines to what extent the value gets updated: Meaning Value 0 Set system value in memory only for future reference. 1 Write new value to appropriate INI file. 2 Broadcast message to all applications informing them of new value. 3 Both 1 and 2. depends on specified request. Note: If this function is unable to execute for any reason, it returns the string "*UNSUPPORTED*" For a complete list of request numbers see the Windows Interface Language help file. Example: request = 114 ;GetScreenSaverRunning value = 0 update = 0 if SysParamInfo( request, value, update) == 1 Then Message("SysParamInfo ", "Screen saver is active") See Also: Environment MouseInfo, NetInfo, WinMetrics, WinSysInfo, WinResources Tan Calculates the tangent. Syntax: Tan(x) Parameters: (f) x angle in radians. Returns: (f) the Tan function returns the tangent of x. Calculates the tangent. If x is large, a loss in significance in the result or significance error may occur. Note: To convert an angle measured in degrees to radians, simply multiply by the constant @Deg2Rad. 561 Terminate Example: real=AskLine("Tangent", "Enter an angle between 0 and 360", "45", 0) answer=tan(real * @Deg2Rad) Message("Tangent of %real% degrees is", answer) See Also: Acos, Asin, Atan, Cos, Sin, Tanh Tanh Calculates the hyperbolic tangent. Syntax: Tanh(x) Parameters: (f) x angle in radians. Returns: (f) the Tanh function returns the hyperbolic tangent of x. Calculates the hyperbolic tangent. There is no error value. Note: To convert an angle measured in degrees to radians, simply multiply by the constant @Deg2Rad. Example: real=AskLine("TanH", "Enter an angle between 0 and 360", "45", 0) answer=Tanh(real * @Deg2Rad) Message("Hyperbolic Tangent of %real% degrees is", answer) See Also: Acos, Asin, Atan, Cos, Cosh, Sin, Sinh, Tan Terminate Conditionally ends a WIL program. Syntax: Terminate (expression, title, message) Parameters: (s) expression (s) title (s) message Returns: (i) 562 any logical expression. the title of a message box to be displayed before termination. the message in the message box. always 1. TerminateApp This command ends processing for the WIL program if "expression" is nonzero. Note that many functions return @TRUE (1) or @FALSE (0), which you can use to decide whether to cancel a menu item. If either "title" or "message" contains a string, a message box with a title and a message is displayed before exiting. Examples: ;Example 1 ; basically a no-op: Terminate(@FALSE, "", "This will never terminate") Message("Terminate"," Terminated.") exit ;Example 2 ; exits w/o message if answer isn't "YES": Terminate(answer != "YES", "", "") Message("Terminate"," Terminated.") exit ;Example 3 ; unconditional termination w/o message box (same as Exit) Terminate(@TRUE, "", "") Message("Terminate"," Terminated.") exit ;Example 4 ; exits with message if variable is less than zero: Terminate(a < 0, "Error", "Cannot use negative numbers") Message("Terminate"," Terminated.") exit See Also: Display, Exit, Message, Pause TerminateApp Terminates an application. Syntax: TerminateApp( winname/appname, name-type, flags ) Parameters: (s) winname/appname specifies a window name or application name, depending on the value of "name-type". (i) name-type number that specifies what type of value was passed in "winname/appname". See below. (i) flags see below. Returns: (i) @TRUE on success and @FALSE on failure. 563 TimeFunctions "winname/appname" specifies a window name or application name, depending on the value of "name-type" Name-type 0 1 2 3 Winname/appname full or partial windowname of a WinBatch program window full or partial windowname of a DOS program window full or partial windowname of a Windows program window application file name of a Windows program "flags" can be set to 0, or can specify one or more of the following values combined with the bitwise OR ('|') operator: Value 0 1 Meaning Default "current-session-only" flag (valid only if "name-type" == 3). If this flag is specified, and the script is running in a Terminal Services environment, then the specified application will only match if it is running in the same session as the script. Otherwise, the specified application will match regardless of what session it is running in. This function lets you terminate an application abruptly. Normally, you should use WinClose to close an application gracefully, but sometimes that may not be possible. Using this function is a drastic, last-resort method of terminating an app. Note: You will not receive any warning from the operating system before the application is closed, even if it contains unsaved work. Also, this function may leave the system in an unstable state. Use this function carefully. Windows Vista: This function may require an Administrator level account, because it relies on performance monitoring. Examples: appname = "notepad.exe" Run(appname, "") Message( appname, "Running") TerminateApp(appname, 3, 0) Message( appname, "Terminated") See Also: IntControl 12, WinClose TimeFunctions Most, but not all, time functions use the "datetime" format, which is actually just a special form of a string or list. 564 TimeAdd It looks like "YYYY:MM:DD:HH:MM:SS" For example, December 25, 2000, at 3:50:23 PM would be "2000:12:25:15:50:23" Note: If you choose to specify two digit dates see IntControl 41. The YY’s in the range 50 to 99 are assumed to be in the range 1950 to 1999. YY’s in the range 00 to 49 are assumed to be in the range of 2000 to 2049. If you need to compare two times in this format, use the TimeDiff, TimeDiffSecs or TimeDiffDays function to compute the difference in the times and return a positive or negative result. TimeAdd Adds two YmdHms datetime variables Syntax: TimeAdd(datetime1, datetime2) Parameters: (s) datetime1 (s) datetime2 Returns: (s) a datetime using the format of YYYY:MM:DD:HH:MM:SS. a datetime to be added to the original using the same format. a new datetime Use this function to add a specified datetime to an original datetime. TimeAdd uses normalized conversion so a valid datetime will be returned. Example: Now=TimeYmdHms( ) AddTime = "0000:00:00:157:00:00" ; 157 hours Later=TimeAdd(Now, AddTime) Message("157 hours from now will be", Later) See Also: FileTimeGet, FileTimeGetEx, TimeDate, TimeYmdHms, TimeDiffSecs, TimeDelay, TimeSubtract, TimeWait 565 TimeDayofWeek TimeDate Provides the current date and time in a human-readable format. For computations with times and dates the TimeYmdHms function should be used instead. Syntax: TimeDate ( ) Parameters: (none) Returns: (s) the current date and time. This function will return the current date and time in a pre-formatted string. The format of the string depends on the current settings in the [Intl] section of the registry key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\win.ini[Intl] The registry value will be examined to determine which format to use. You can adjust the registry value via the Regional and Language Options icon in Control Panel if the format isn't what you prefer. Note: This function is the same as the DateTime function, which it replaces. Example: a=Timedate( ) Message("Current date and time", a) may produce, depending on Control Panel settings: See Also: FileTimeGet, FileTimeGetEx, TimeAdd, TimeYmdHms, TimeDiffSecs, TimeDelay, TimeWait TimeDayofWeek Using the WIL language it is possible to grab the day of the week. The following example from TimeJulianDay grabs the current time and day of the week. Example: ;This example grabs the Time/Day of the Week. a=TimeYmdHms( ) 566 TimeDiff b=TimeJulianDay(a) c=(b+5) mod 7 day=ItemExtract(c+1, "Sun Mon Tue Wed Thu Fri Sat", " ") line=StrCat("Julian Date-> ", b,@CRLF,"Day of week-> ",day) Message(TimeDate( ), line) See Also: TimeJulianDay TimeDelay Pauses execution for a specified amount of time. Syntax: TimeDelay(seconds) Parameters: (f) seconds seconds to delay. Returns: (i) always 1. This function causes the currently-executing WIL program to be suspended for the specified period of time. Seconds can be a floating point number: TimeDelay(2.5). Smaller or larger numbers will be adjusted accordingly. Note: You can specify a negative number for "seconds", in which case the negative number will be treated exactly the same as a positive number. Example: Message("Wait", "About 15 seconds") TimeDelay(15) Message("Hi", "I'm Baaaaaaack") See Also: TimeWait, Yield TimeDiff Returns the difference between two points in time. Syntax: TimeDiff( datetime1, datetime2) Parameters: (s) datetime1 (s) datetime2 uses format YYYY:MM:DD. uses format YYYY:MM:DD. Returns: (i) difference between the two times, in YmdHms format. 567 TimeDiffDays "datetime1" and "datetime2" must be valid date-time strings, in YmdHms format. "datetime1" must be the later (more recent) of the two times. Because some months have more days than others, an adjustment may need to be made when converting the resulting "day" field into months. In the example: TimeDiff("1998:09:30:00:00:00", "1998:08:31:00:00:00") the result is, logically, "0000:00:30:00:00:00" (30 days). But in this example: TimeDiff("1998:10:01:00:00:00", "1998:08:31:00:00:00") where the operation wraps past the end of the month, there is some question what the result should be, since there is no such date as September 31. This function handles this by treating the period from August 31 to September 30 as one month, so the result would be "0000:01:01:00:00:00" (one month and one day). Example: ; How long has it been since the beginning of the decade diff = TimeDiff(TimeYmdHms(), "1990:01:01:00:00:00") Message("How long since beginning of decade?",diff) See Also: FileTimeGet, FileTimeGetEx, TimeDate, TimeAdd, TimeYmdHms, TimeDiffSecs, TimeDelay, TimeWait, TimeDiffDays TimeDiffDays Returns the difference in days between the two dates. Syntax: TimeDiffDays (datetime1, datetime2) Parameters: (s) datetime1 (s) datetime2 Returns: (i) uses format YYYY:MM:DD:HH:MM:SS, or YYYY:MM:DD uses format YYYY:MM:DD:HH:MM:SS, or YYYY:MM:DD the difference in days between the two dates. Use this function to return the difference in days between two dates. Hours, mins, secs, if specified, are ignored. "datetime1" must be the later (more recent) of the two times. Example: ;Shopping days til Christmas Now=TimeYmdHms( ); Get current time 568 TimeJulianDay Year=ItemExtract(1, Now, ":") Xmas=strcat(Year, ":12:25:00:00:00") Shopping=TimeDiffDays(Xmas, Now) if Shopping>0 Message("Shopping Days to Christmas", Shopping) else if Shopping<0 Message("You missed it by", abs(Shopping)) else Message("Merry Christmas", "And a Happy New year") endif endif See Also: FileTimeGet, FileTimeGetEx, TimeDate, TimeAdd, TimeYmdHms, TimeDiffSecs, TimeDelay, TimeWait TimeDiffSecs Returns time difference in seconds between the two datetimes. Syntax: TimeDiffSecs(datetime1, datetime2) Parameters: (s) datetime1 (s) datetime2 use format YYYY:MM:DD:HH:MM:SS. use format YYYY:MM:DD:HH:MM:SS. Returns: (i) the difference in seconds between the two times. Use this function to return the time difference between two datetimes. The time difference should not exceed 68 years or else an error will occur. "datetime1" must be the later (more recent) of the two times. Example: Now=TimeYmdHms( ) Midnight=strcat(strsub(Now,1,11), "00:00:00") Seconds=TimeDiffSecs(Now, Midnight) Message("Seconds since midnight", Seconds) See Also: FileTimeGet, FileTimeGetEx, TimeDate, TimeAdd, TimeDiffDays, TimeYmdHms, TimeDelay, TimeWait TimeJulianDay Returns the Julian day given a datetime. 569 TimeJulToYmd Syntax: TimeJulianDay(datetime) Parameters: (s) datetime use format YYYY:MM:DD. Returns: (i) the Julian day. Use this function to return the Julian date given a datetime. The Julian date is often used in banking and similar calculations as it provides an easy way to compute the difference between two dates. Note: Julian date 1= Jan.1,0000. Example: ;This example grabs the Time/Day of the Week. a=TimeYmdHms( ) b=TimeJulianDay(a) c=(b+5) mod 7 day=ItemExtract(c+1, "Sun Mon Tue Wed Thu Fri Sat", " ") line=StrCat("Julian Date-> ", b,@CRLF,"Day of week-> ",day) Message(TimeDate( ), line) See Also: FileTimeGet, FileTimeGetEx, TimeDate, TimeAdd, TimeDiffDays, TimeYmdHms, TimeDelay, TimeWait TimeJulToYmd Given a Julian day, returns the datetime. Syntax: TimeJulToYmd(julian-date) Parameters: (i) julian-date a Julian date. Returns: (s) the datetime corresponding to the specified Julian date. This function converts the specified (numeric) Julian date value to a datetime in YmdHms format. The "Hms" portion of the returned YmdHms string will always be "00:00:00". Example: today = TimeYmdHms( ) jul_today = TimeJulianDay(today) jul_lastweek = jul_today - 7 lastweek = TimeJulToYmd(jul_lastweek) 570 TimeWait FileTimeSet("stuff.txt", lastweek) Message("TimeJulToYmd","Done.") See Also: TimeJulianDay TimeSubtract Subtracts one YmdHms variable from another. Syntax: TimeSubtract( datetime, datetime-difference) Parameters: (s) datetime a datetime using the format of YYYY:MM:DD:HH:MM:SS. (s) datetime-difference amount of time to be subtracted from the original using the same format Returns: (s) time string in YmdHms format. "datetime-difference" is an amount of time to be subtracted from "datetime", in YmdHms format. Use this function to subtract a specified datetime from an original datetime. TimeSubtract uses normalized conversion so a valid datetime will be returned. "datetime difference" can not be larger than "datetime". TimeSubtract is NOT designed to determine the difference between two points in time. For that, use TimeDiffDays, TimeDiffSecs, or the TimeDiff function. Example: time_now = TimeYmdHms( ) time_yesterday = TimeSubtract(time_now, "0000:00:01:00:00:00") FileTimeSet("stuff.txt", time_yesterday) Message("TimeSubtract","Time Subtracted.") See Also: TimeAdd, TimeDiffDays, TimeDiffSecs, TimeDiff TimeWait Pauses execution and waits for the datetime to pass. Syntax: TimeWait (datetime) Parameters: (s) datetime use format YYYY:MM:DD:HH:MM:SS. 571 UacElevationLevel Returns: (i) always 1. Use this function to pause execution to wait for the datetime to pass. To wait for the next occurrence of the specified time, (i.e., today or tomorrow), specify "0000:00:00:Hours:Minutes:Seconds" for the date. Example: a=TimeYmdHms( ) ; Gets Current Time b=TimeAdd(a,"0000:00:00:00:00:07") ; Adds 7 seconds to current time TimeWait(b) ; Waits for that time to occur Display(3, "Time now should be", b) See Also: FileTimeGet, FileTimeGetEx, TimeDate, TimeAdd, TimeDiffDays, TimeDiffSecs, TimeYmdHms, TimeDelay TimeYmdHms Returns current date and time in the datetime format. Syntax: TimeYmdHms( ) Parameters: (none) Returns: (s) uses format YYYY:MM:DD:HH:MM:SS. Use this function to return the current date and time in the datetime format. Example: a=TimeYmdHms( ) Message("Time is", a) See Also: FileTimeGet, FileTimeGetEx, TimeDate, TimeAdd, TimeDiffSecs, TimeDelay, TimeWait UacElevationLevel Gets the current UAC elevation level. (Windows Vista only) Syntax: UacElevationLevel () Parameters: none 572 UacExePromptTest Returns: (i) UAC elevation level. Return value is one of the following levels: Level 0 1 2 3 Meaning Error, or unsupported platform. Process is default (UAC is disabled, or standard user). Process is running elevated. Process is not running elevated (user is in Administrators group). Example: level = UacElevationLevel( ) Message( "Current UAC elevation level", level ) Exit See Also: UacManifestSettings, UacExePromptTest UacExePromptTest Determines whether a program would require a UAC elevation prompt. Syntax: UacExePromptTest( programname ) Parameters: (s) programname specifies path and filename of the EXE to be tested. Returns: (i) see below. Return -1 0 1 Meaning running program would return an error. program would not require elevation. program would require elevation. Example: val = UacExePromptTest("notepad.exe") Message( "UacExePromptTest Returned", val ) Exit See Also: UacElevationLevel, UacManifestSettings 573 VarType UacManifestSettings Gets information on manifest and signature. Syntax: UacManifestSettings ( request ) Parameters: (i) request see below. Returns: (i/s) depends on request value specified. Request 0 1 2 3 Meaning (i) Manifest present. @TRUE or @FALSE. (s) Manifest requested execution level (Vista and newer). Returns a blank string on earlier Windows Platforms. (s) Manifest uiAccess (Vista and newer). Returns a blank string on earlier Windows Platforms. (i) Valid signature. @TRUE or @FALSE. Example: level = UacManifestSettings( 1 ) Message( "Manifest Requested Execution Level", level ) Exit See Also: UacElevationLevel, UacExePromptTest VarType Gets the type of a WIL variable. Syntax: VarType(varname) Parameter: (s) varname variable name to check. Returns: (i) type of variable (see below). This function returns the type of WIL variable that "varname" specifies. The return value will be one or more of the following type flags, combined using the bitwise OR ('|') operator: Type 574 Meaning VarType -1 0 1 2 5 32 65 128 256 512 1536 if the specified name is a function name or other reserved word. undefined integer string file handle floating point value binary buffer Unicode string array variant COM/OLE Object Example: #DefineFunction CheckBits(bitmask) totalbitmask = bitmask typelist = "" bit = 1 While bitmask ;while there's still a bitmask value If bitmask & bit ;check bit if bit&1 then typelist = strCat(typelist,@cr,"Integer(1)") if bit&2 then typelist = strCat(typelist,@cr,"String(2)") if bit&4 then typelist = strCat(typelist,@cr,"FileHandle(4)") if bit&32 then typelist = strCat(typelist,@cr,"FloatingPoint(32)") if bit&64 then typelist =strCat(typelist,@cr,"BinaryBuffer(64)") if bit&256 then typelist = strCat(typelist,@cr,"Array(256)") if bit&512 then typelist = strCat(typelist,@cr,"Variant(512)") if bit&1024 then typelist = strCat(typelist,@cr,"COMObject(1024)") ;decrement working bitmask number by existing byte increments bitmask = bitmask & ~bit Endif bit = bit * 2 ;increment byte EndWhile typelist = strCat(typelist,@cr,"---------------") typelist = strCat(typelist,@cr,"Total = ",totalbitmask) Return StrTrim(typelist) #EndFunction var1 = 1 Message(StrCat("var1 = ", var1), CheckBits(VarType(var1))) var2 = "abc" Message(StrCat("var2 = ",var2), CheckBits(VarType(var2))) var3 = FileOpen(StrCat(DirWindows(0),"win.ini"),"Read") Message(StrCat("var3 = ",var3), CheckBits(VarType(var3))) fileclose(var3) var4 = 1.1 Message(StrCat("var4 = ",var4), CheckBits(VarType(var4))) var5 = BinaryAlloc(4) Message(StrCat("var5 = ",var5), CheckBits(VarType(var5))) BinaryFree(var5) var6 = ArrDimension(2,2) 575 VersionDLL Message("var6 = {ARRAY}", CheckBits(VarType(var6))) var7 = ObjectCreate("WbemScripting.SWbemLocator") Message(StrCat("var7 = ",var7), CheckBits(VarType(var7))) Exit See Also: isDefined Version Returns the version number of the WIL exe program currently running. Syntax: Version( ) Parameters: (none) Returns: (s) WIL exe program version number. Use this function to determine the version of the WIL exe program that is currently running. Example: ver = Version( ) Message("Version number", ver) See Also: DOSVersion, Environment, FileVerInfo, VersionDLL, WinVersion VersionDLL Returns the version number of the WIL Interpreter DLL currently running. Syntax: VersionDLL( ) Parameters: (none) Returns: (s) WIL Interpreter DLL version number. Use this function to determine the version of the WIL Interpreter DLL that is currently running. It is useful to verify that a WIL program generated with the latest version of the language will operate properly on what may be a different machine with a different version of the WIL Interpreter DLL installed. 576 WaitForKey Example: ver = VersionDLL( ) If ver < "2.0a" Message("Sorry", "WIL version 2.0a or higher required") Exit endif Message("VersionDll", ver) See Also: DOSVersion, Environment, FileVerInfo, Version, WinVersion WaitForKey Waits for a specific key to be pressed. Syntax: WaitForKey (key1, key2, key3, key4, key5) Parameters: (s) key1 - key5 five keystrokes to wait for. Returns: (i) position of the selected keystroke (1-5). WaitForKey requires five parameters, each of which represents a keystroke. The WIL program will be suspended until one of the specified keys is pressed, at which time the WaitForKey function will return a number from 1 to 5, indicating the position of the "key" that was selected, and the program will continue. You can specify a null string ("") for one or more of the "key" parameters if you don't need to use all five. WaitForKey will detect its keystrokes in most, but not all, Windows applications. Any keystroke that is pressed is also passed on to the underlying application. WaitForKey supports the following keycodes: {BACKSPACE} {CLEAR} {DEL} {END} {ESCAPE} {F1} {F3} {F5} {F7} {F9} {F11} {F13} {F15} {BS} {DELETE} {DOWN} {ENTER} {ESC} {F2} {F4} {F6} {F8} {F10} {F12} {F14} {F16} 577 WaitForKeyEx {HELP} {INSERT} {LEFT} {NUMPAD+} {NUMPAD.} {NUMPAD0} {NUMPAD2} {NUMPAD4} {NUMPAD6} {NUMPAD8} {PGDN} {PRTSC} {SPACE} {TAB} {HOME} {INS} {NUMPAD*} {NUMPAD-} {NUMPAD/} {NUMPAD1} {NUMPAD3} {NUMPAD5} {NUMPAD7} {NUMPAD9} {PGUP} {RIGHT} {SP} {UP} Note that NumLock must be on for the codes {NUMPAD0} through {NUMPAD9} to be generated. Also, it cannot distinguish between the two "Enter" keys on the keyboard (both will generate an {Enter} code). Note: Certain special keycodes, such as {ALT} and {F10} may not work with this function and should be avoided. IntControl 80 can be used to wait for user to release *all* keys before proceeding. Example: k = WaitForKey("{F11}", "{F12}", "{INSERT}", "", "") switch k case 1 Message("WaitForKey", "You pressed the F11 key") break case 2 Message("WaitForKey", "You pressed the F12 key") break case 3 Message("WaitForKey", "You pressed the Insert key") break endswitch See Also: IsKeyDown, IntControl 80, WaitForKeyEx WaitForKeyEx Waits for a specific key to be pressed within timeout period. Syntax: WaitForKeyEx (keycodes, timeout) 578 WallPaper Parameters: (s) keycodes (i) timeout Returns: (i) a tab-delimited list of up to 100 keys to wait for. See WaitForKey for a list of key codes. the number of seconds to wait before returning. position of the selected keystroke, or 0 if none of the specified keys were pressed before the timeout occured. This function is like WaitForKey, but it allows you specify up to 100 keys to wait for and allows for a timeout. Note: Any items in the list past the first 100 will be silently ignored. If "keycodes" is a blank string (""), then the keycodes from the most recent use of this function will be used again, which will save the overhead of re-parsing the string. Specify 0 "timeout" to have the function return immediately without waiting. Specify -1 for no timeout (wait forever). If one of the specified keys is pressed before the timeout occurs, the function will return the value corresponding to the position in “keycodes” of the key that was pressed. The first key in the list is 1. If none of the specified keys are pressed before the timeout occurs, the function will return 0. Example: key = "{BACKSPACE},{BS},{CLEAR},{DELETE},{DEL},{DOWN},{END},{ENTER}" key = key:",{ESC},{F1},{F2},{F3},{F4},{F5},{F6}" key = key:",{F7},{F8},{F9},{F10},{F11},{F12},{F13},{F14}," key = key:",{F15},{F16},{HELP},{HOME},{INSERT},{INS},{LEFT}" key = key:"{PGDN},{PGUP},{PRTSC},{RIGHT},{SPACE},{SP},{TAB},{UP}," key = key:"0,1,2,3,4,5,6,7,8,9,`,-,=,[,],\,;,',.,/," key = key:"a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z" key = StrReplace(key,",",@tab) BoxOpen("WaitForKeyEx","Press a key") item = WaitForKeyEx(key,-1) dakey = ItemExtract(item,key,@tab) BoxShut() Message("WaitForKeyEx", StrCat("You pressed the '",dakey,"' key")) exit See Also: WaitForKey WallPaper Changes the Windows wallpaper. 579 While Syntax: WallPaper (bmp/html-name, tile) Parameters: (s) bmp/html-name (i) tile Returns: (i) Name of the bmp/html wallpaper file. @TRUE if wallpaper should be tiled; @FALSE if wallpaper should not be tiled. 2 - if the wallpaper should be stretched. always 0. This function immediately changes the Windows wallpaper. It can even be used for wallpaper "slide shows". This function supports the Active Desktop wallpaper in Internet Explorer 4.0. Example: DirChange("c:\windows") a = FileItemize("*.bmp") a = AskItemList("Select New paper",a,@tab,@unsorted,@single,@false) tile = @FALSE If FileSize(a) < 40000 Then tile = @TRUE Wallpaper(a, tile) See Also: WinParmSet, SysParamInfo While Conditionally and/or repeatedly executes a series of statements. Syntax: While continuation-condition series of statements EndWhile Parameters: (s) continuation-condition an expression to be evaluated. (s) series of statements statements to be executed repeatedly until the condition following the While keyword evaluates to @FALSE. The While statement causes a series of statements to be repeatedly executed until the "continuation-condition" evaluates to zero or @FALSE. The test of the "continuation-condition" takes place before each execution of the loop. A While loop executes zero or more times, depending on the continuation-condition. 580 WinActivate The following statements affect continued execution: Break Continue EndWhile Note: Terminates the While structure and transfers control to the statement following the next matching EndWhile. Returns to the While statement and re-evaluates the expression. Returns to the While statement and re-evaluates the expression. EndWhile and "End While" may be used interchangeably. Example: a=10 while a>5 Display(3, "The value of a is now", a) a=a-1 endwhile Message("The value of a should now be 5",a) See Also: If, For, GoSub, Switch, Select WinActivate Activates a previously running parent window. Syntax: WinActivate (partial-winname) Parameters: (s) partial-winname Returns: (i) either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be activated. @TRUE if a window was found to activate; @FALSE if no windows were found. Use this function to activate windows for user input. This function works only with top-level (parent) application windows. Example: Run("notepad.exe", "") WinActivate("~Notepad") See Also: WinActiveChild, WinGetActive, WinName, WinShow, Partial Window Names (pg.67) 581 WinArrange WinActiveChild Activates a previously running child window. Syntax: WinActiveChild(main windowname, child windowname) Parameters: (s) main windowname the initial part of, or an entire parent window name. (s) child windowname the initial part of, or an entire child window name. Returns: (i) @TRUE if the window was found to activate; @FALSE if no windows were found. Use this function to activate a child window for user input. The most recently used window whose title matches the name will be activated. Note: The partial window name you give must match the initial portion of the window name (as it appears in the title bar) exactly, including proper case (upper or lower) and punctuation. The parent window must exist or this function will return an error. Example: Run(StrCat(DirHome(),"winbatch studio.exe"),"") list = WinItemChild("WinBatch Studio") choice = AskItemList("Choose the child window to activate", list, @TAB, @UNSORTED,@SINGLE) if WinExistChild("WinBatch Studio",choice) WinActiveChild("WinBatch Studio",choice) endif See Also: WinActivate, WinGetActive, WinShow, Partial Window Names (pg.67) WinArrange Arranges, tiles, and/or stacks application windows. Syntax: WinArrange (style) Parameters: (i) style Returns: (i) 582 one of the following: @STACK, @TILE (or @ARRANGE), @ROWS, or @COLUMNS. always 1. WinClose Use this function to rearrange the open windows on the screen. (Any iconized programs are unaffected.) If there are more than four open windows and you specify @ROWS, or if there are more than three open windows and you specify @COLUMNS, @TILE will be used instead. This function works only with top-level (parent) application windows. Example: ; Reveal all windows WinArrange(@TILE) See Also: WinHide, WinIconize, WinItemize, WinPlace, WinShow, WinZoom WinClose Closes an open window. Syntax: WinClose (partial-winname) Parameters: (s) partial-winname Returns: (i) either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be closed. @TRUE if a window was found to close; @FALSE if no windows were found. Use this function to close windows. WinClose will not close the window which contains a currently executing WIL program. See IntControl 47. You can use EndSession to end the current Windows session. This function works only with top-level (parent) application windows. Example: Run("notepad.exe", "") Message("WinClose","Window is about to close.") WinClose("~Notepad") See Also: EndSession, WinHide, WinIconize, WinItemize, WinWaitClose, IntControl 47, Partial Window Names (pg.67) 583 WinExeName WindowOnTop Keep window on top. Syntax: WindowOnTop( partial-winname, mode ) Parameters: (s) partial-winname (i) mode partial windowname of the window to be affected. A number specifying what action to take. See below. Returns: (i) returns @TRUE on success, @FALSE on failure. This function tells the specified window to remain on top of all other windows, or to return to a normal (non-topmost) state. Mode 0 1 -1 Meaning Don't stay on top Stay on top Return window's current topmost state: @TRUE = topmost; @FALSE = not topmost Example: Run("calc.exe","") ;Place calc window on top WindowOnTop("Calculator",1) See Also: WinState WinExeName Returns the name of the executable file which created a specified window. Syntax: WinExeName (partial-winname) Parameters: (s) partial-winname the initial part of, or an entire, window name. Returns: (s) name of the EXE file, or "" on failure. Returns the name of the EXE file which created the first window found whose title matches "partial-winname". 584 WinExist "Partial-winname" is the initial part of a window name, and may be a complete window name. It is case-sensitive. You should specify enough characters so that "partial-winname" matches only one existing window. A "partial-winname" of "" (null string) specifies the window making the current call to the WIL Interpreter. WinExeName("") will return a full path to the program making the current call to the WIL Interpreter. Notes: This function works only with top-level (parent) application windows. WinExeName will return the string "(16-bit application)" for ANY 16 bit application. If WinExeName returns "" (null string), it means the function failed. You might be able to get extended error information from the wwwbatch.ini file. Windows NT or newer, this function returns module names instead of full program names. The module name is usually the same as the root name of the program, without the extension. Windows Vista: This function may require an Administrator level account, because it relies on performance monitoring. Example: Run("notepad.exe,"") prog = WinExeName("~Notepad") WinClose("~Notepad") TimeDelay(5) Run(prog, "") See Also: AppExist, AppWaitClose, Run, WinExist, WinGetActive, WinName, Partial Window Names (pg.67) WinExist Tells if specified window exists. Syntax: WinExist (partial-winname) Parameters: (s) partial-winname Returns: (i) the initial part of, or an entire, window name. @TRUE if a matching window is found; @FALSE if a matching window is not found. 585 WinExistChild Note: The partial window name you give must match the initial portion of the window name (as appears in the title bar) exactly, including proper case (upper or lower) and punctuation. This function works only with top-level (parent) application windows. Most of the "win" functions have a built-in wait (where required). WinExist does not. Example: if WinExist("~Notepad") == @FALSE Then RunIcon("Notepad", "") See Also: AppExist, WinActivate, WinClose, WinExeName, WinExistChild, WinGetActive, WinItemize, WinState, WinWaitExist, Partial Window Names (pg.67) WinExistChild Tells if specified child window exists. Syntax: WinExistChild ("partial-parent-windowname", "partial-child-windowname") Parameters: (s) partial-parent-windowname the initial part of, or an entire parent window name. (s) partial-child-windowname the initial part or, or an entire child window name. Returns: (i) @TRUE if a matching window is found; @FALSE if a matching window is not found. Use this function to test for the existence of a child window. Note: The partial window names you give must match the initial portion of the window name exactly, as it appears in the title bar, including proper case (upper or lower) and punctuation. The parent window must exist or this function will return an error. Example: Run(StrCat(DirHome(),"winbatch studio.exe"),"") list = WinItemChild("WinBatch Studio") choice = AskItemList("Choose the child window to activate", list, @TAB, @UNSORTED,@SINGLE) if WinExistChild("WinBatch Studio",choice) WinActiveChild("WinBatch Studio",choice) endif 586 WinHelp See Also: AppExist, WinActivate, WinClose, WinExeName, WinGetActive, WinItemize, WinItemChild, WinState, Partial Window Names (pg.67) WinGetActive Gets the title of the active window. Syntax: WinGetActive ( ) Parameters: (none) Returns: (s) title of active window. Use this function to determine which window is currently active. Example: currentwin = WinGetActive( ) Message("WinGetActive", "Current window is %currentwin%.") See Also: WinActivate, WinExeName, WinItemize, WinName, WinPlaceGet, WinPosition, WinTitle WinHelp Calls a Windows help file. Syntax: WinHelp (help-file, function, keyword) Parameters: (s) help-file (s) function (s) keyword Returns: (i) name of the Windows help file, with an optional full path. function to perform (see below). keyword to look up in the help file (if applicable), or "". @TRUE if successful; @FALSE if unsuccessful. This command can be used to perform several functions from a Windows help (.HLP) file. It requires that the Windows help program WINHELP.EXE or WINHLP32.EXE be accessible. The desired function is indicated by the "function" parameter (which is not case-sensitive). The possible choices for "function" are: 587 WinHelp Function "Contents" "Key" "PartialKey" "Context" "Command" "Quit" "HelpOnHelp" "HTML" Keyword Brings up the Contents page for the help file. Specify a null string ("") for the "keyword" parameter. Brings up help for the keyword specified by the "keyword" parameter. You must specify a complete keyword, and it must be spelled correctly. If there is more than one occurrence of "keyword" in the help file, a search box will be displayed which allow you to select the desired topic from the available choices. Brings up help for the keyword specified by the "keyword" parameter. You may specify a partial keyword name: if it matches more than one keyword in the help file, a search box will be displayed which allow you to select the desired one from the available choices. You may also specify a null string ("") for "keyword", in which case you will get a search dialog containing all keywords in the help file. Brings up help for the topic specified by "keyword". "Keyword" must be a numeric context identifier defined in the [MAP] section of the .HPJ file that was used to build the help file. Executes the help macro specified by the "keyword" parameter. Closes the WINHELP.EXE window, unless another application is still using it. Specify a null string ("") for the "keyword" parameter. Brings up the help file for the Windows help program (WINHELP.HLP). Specify a null string ("") for the "keyword" parameter. Launches HH.EXE to view a topic in an HTML help (.CHM) file. "Keyword" specifies the topic to display, or "" to view the starting topic in the file. Example: WinHelp("iexplore.chm", "HTML", "web_collect_favorites.htm") Which is identical to: Run("HH.EXE", "iexplore.chm::/web_collect_favorites.htm") Note: WILHH.EXE is a WinBatch utility that augments HTML Help. WILHH can be used in addition to or as a complete replacement for HH.EXE. WILHH offers solutions for some known bugs in HTML Help. WILHH helps you to resolve these problems with HH.EXE: - Open a standalone HTML Help window. Ask WILHH to 588 WinHide create a standalone HTML Help window. This window remains open until the user closes it. Once this window is created, you can open new topics in the window without creating a new window, just as you can with WinHelp. - Open an HTML Help window based on a keyword search. A common way of linking topics in a help system is through keyword and associative links--KLinks and ALinks, in WinHelp terminology. However, WILHH also allows you to open the new topics in a window that is already open. In addition, WILHH allows you to use ALinks and KLinks in ways that HH.EXE doesn't support. WILHH Commandline: WILHH.EXE {CHM} Opens a CHM file to its main page. WILHH.EXE {CHM} [{KEYWORD}:] Opens a CHM file and loads a topic based on keyword. Note: KEYWORD can specifie one or more ALink names or KLink keywords to look up. Multiple entries are delimited by a semicolon. Example: WinHelp("wil.hlp", "Key", "AskItemList") WinHide Hides a window. Syntax: WinHide (partial-winname) Parameters: (s) partial-winname Returns: (i) either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be hidden. @TRUE if a window was found to hide; @FALSE if no windows were found. Use this function to hide windows. The programs are still running when they are hidden. 589 WinIdGet A partial-window name of "" (null string) hides the window making the current call to the WIL Interpreter. This function works only with top-level (parent) application windows. Example: Run("notepad.exe", "") WinHide("~Notepad") TimeDelay(3) WinShow("~Notepad") See Also: RunHide, WinClose, WinIconize, WinPlace, Partial Window Names (pg.67) WinIconize Iconizes a window. Syntax: WinIconize (partial-winname) Parameters: (s) partial-winname Returns: (i) either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be iconized. @TRUE if a window was found to iconize; @FALSE if no windows were found. Use this function to turn a window into an icon at the bottom of the screen. A partial-window name of "" (null string) iconizes the current WIL Interpreter window. This function works only with top-level (parent) application windows. Example: Run("notepad.exe", "") WinIconize("~Not") ; partial window name used here See Also: RunIcon, WinClose, WinHide, WinPlace, WinShow, WinZoom, Partial Window Names (pg.67) WinIdGet Returns a unique "Window ID" (pseudo-handle) for the specified window name. 590 WinIsDOS Syntax: WinIdGet(partial-winname) Parameters: (s) partial-winname the initial part of, or an entire, window name. Returns: (s) the unique "Window ID". Use this function to obtain the unique "Window ID" (pseudo-handle) for the specified parent window name. All functions which accept a partial window name as a parameter now accept the Window ID obtained with WinIdGet. This can be useful to distinguish between multiple windows with the same name, or to track a window whose title changes. Example: Run("notepad.exe", "") winid1 = WinIdGet("~Notepad"); most-recently-accessed Notepad Run("notepad.exe", "") winid2 = WinIdGet("~Notepad"); most-recently-accessed Notepad WinPlace(0, 0, 500, @noresize, winid1) WinPlace(500, 0, 1000, @noresize, winid2) WinActivate(winid1) See Also: DllHwnd, WinExist, WinGetActive, WinItemNameId, WinTitle, Partial Window Names (pg.67) WinIsDOS Tells whether or not a particular window is a DOS or console-type window. Syntax: WinIsDOS("partial-winname") Parameters: (s) partial-winname Returns: (i) the initial part of, or an entire, window name. @TRUE if the window is a DOS window. @FALSE if it is not a DOS window. Use this function to determine if the application which created the specified window is a DOS or Windows Program. Note: "Partial-winname" is the initial part of a window name, and may be a complete window name. It is case-sensitive. You should specify enough characters so that "partial-winname" matches only one existing window. If it matches more than one window, the most recently accessed window which it matches will be used. 591 WinItemChild Example: comspec = Environment("COMSPEC") Run(comspec, "") TimeDelay(1) title= comspec a=WinIsDOS(title) if a==@true then message(title, "is a DOS window") else message(title, "is NOT a DOS window") See Also: WinExeName, WinExist, WinGetActive, WinItemize, WinName, WinState, WinTitle, Partial Window Names (pg.67) WinItemChild Returns a list of all the child windows under this parent. Syntax: WinItemChild("partial-parent-windowname") Parameters: (s) partial-parent-windowname the initial part of, or an entire, window name. Returns: (s) a list of all the child windows under the parent. Use this function to return a tab-delimited list of all child windows existing under a given parent window. Note: "Partial-parent-windowname" is the initial part of a window name, and may be a complete window name. It is case-sensitive. You should specify enough characters so that "partial-parent-windowname" matches only one existing window. If it matches more than one window, the most recently accessed window which it matches will be used. Example: Run(StrCat(DirHome(),"winbatch studio.exe"),"") list = WinItemChild("WinBatch Studio") choice = AskItemList("Choose the child window to activate", list, @TAB, @UNSORTED,@SINGLE) if WinExistChild("WinBatch Studio",choice) WinActiveChild("WinBatch Studio",choice) endif See Also: AppExist, WinActivate, WinClose, WinExeName, WinGetActive, WinItemize, WinState, Partial Window Names (pg.67) 592 WinItemizeEx WinItemize Returns a tab-delimited list of all open windows. Syntax: WinItemize ( ) Parameters: (none) Returns: (s) list of the titles of all open windows. This function compiles a list of all the open application windows' titles and separates the titles by tabs. This is especially useful in conjunction with the AskItemList function, which enables the user to choose an item from such a tab-delimited list. This function works only with top-level (parent) application windows. See WinItemChild to work with child windows. Example: ; Find a window allwins = WinItemize( ) mywind = AskItemList("Windows", allwins, @TAB, @unsorted, @single, @false) WinActivate(mywind) exit See Also: DirItemize, FileItemize, AskItemList, WinClose, WinGetActive, WinItemNameId, WinName, WinPlaceGet, WinPosition WinItemizeEx Returns the full name of window(s) matching a partial window name. Syntax: WinItemizeEx (partial-winname, multiple, hidden [, return-type]) Parameters: (s) partial-winname (i) multiple (i) hidden (i) return-type Returns: (s) specifies a partial window name to look for.It can be a blank string (""), in which case it will match any window. @TRUE or @FALSE. see below. @TRUE or @FALSE. see below. [optional] specifies the format in which the list of windows will be returned. list of the titles of all open windows. 593 WinItemNameId If 'multiple' is @TRUE, then this function returns a tab-delimited list of all open windows that match 'partial-winname'. If 'multiple' is @FALSE, then it returns the name of the first open window found that matches 'partial-winname'. If no appropriate matching windows are found, it returns a blank string (""). If 'hidden' is @TRUE, then hidden windows are included in the list of returned windows. If 'hidden' is @FALSE, then hidden windows are not included. If 'hidden' is @FALSE and 'multiple' is @FALSE, then this function returns the name of the first visible (non-hidden) open window found that matches 'partial-winname'. "return-type" specifies the format in which the list of windows will be returned, and can be one of the following: Type 0 1 2 Meaning Tab-delimited list of window titles (default) Tab-delimited list of window ID's List of window titles and their corresponding window ID's,in the form: "window1-name|window1-ID|window2-name|window2-ID|..." The "return-type" values are numbered differently than in WinItemProcID. Note: this function does not accept a Window ID as the 'partial-winname' parameter. Example: ; Find all windows that are not hidden wins = WinItemizeEx("",@TRUE,@FALSE) mywind = AskItemList("Windows", wins, @TAB, @unsorted, @single, @false) WinActivate(mywind) See Also: DirItemize, FileItemize, AskItemList, WinClose, WinGetActive, WinItemNameId, WinName, WinPlaceGet, WinPosition, WinItemize WinItemNameId Returns a list of all open windows and their Window ID's. Syntax: WinItemNameId( ) Parameters: (none) Returns: (s) list of the titles and Window ID's of all open windows. This function returns a list of top-level window titles and their corresponding "Window ID's", in the form: 594 WinItemProcId "window1-name|window1-ID|window2-name|window2-ID|..." Example: #DefineFunction UDFReformat_List (list) newlist = "" count = ItemCount( list,"|") count = count/2 For x = 1 to count by 2 title= ItemExtract(x,list,"|") id= ItemExtract(x+1,list,"|") newlist = StrCat(newlist,title,"|",id,@tab) Next newlist = StrTrim(newlist) Return newlist #EndFunction winlist = WinItemNameId( ) list = UDFReformat_List (winlist) AskItemList("Windows and ID's", list, @tab, @unsorted,@single, @false) See Also: WinIdGet, WinItemize WinItemProcId Returns a list of windows for the specified process. Syntax: WinItemProcID( process-id, flags, return-type) Parameters: (i)process-id (i)flags (i)return-type Returns: (s) returned from RunShell. see below. see below. a tab-delimited list of all top-level (parent) window ID's owned by the process specified by "process-id". This function is designed to be used in correlation with RunShell. You can obtain the process ID of an application that is launched with the RunShell function by specifying @GETPROCID as the "waitflag". This is the same as specifying @NOWAIT, except that on success the function will return the process ID of the application that was launched. This process ID can be used with the WinItemProcID function . The process ID may be a negative number. If a process ID cannot be obtained a 1 will be returned to indicate success. In all cases, a return value of 0 indicates failure. 595 WinMetrics "flags" can be 0, or one or more of the following values combined with the binary OR ("|") operator: Flag 0 1 2 4 8 Meaning Default list of window ID's Include windows with blank titles Include hidden windows Include windows which are not enabled for keyboard and mouse input Include windows with the title "WinOldAp" "return-type" specifies the format in which the list of windows will be returned, and can be one of the following: Type 0 1 2 Meaning Tab-delimited list of window ID's Tab-delimited list of window titles List of top-level window titles and their corresponding "Window ID's", in the form: "window1-name|window1-ID|window2-name|window2-ID|..." Example: procid = RunShell("calc.exe", "", "", @NORMAL, @GETPROCID) TimeDelay(3) If (procid != 0) && (procid != 1) ; if we got a valid process ID winids = WinItemProcId(procid, 2, 0) Message("Window ID(s)", winids) Endif See Also: RunShell WinMetrics Returns Windows system information. Syntax: WinMetrics (request#) Parameters: (i) request# see below. Returns: (i) see below. The request# parameter determines what piece of information will be returned. Req# 596 Return value WinMetrics -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 if WOW64 (32-bit emulation under 64-bit Windows), 0 otherwise pixels per horizontal dialog unit pixels per vertical dialog unit Windows Platform; 0 = Other, 1 = Windows 3.x, 2 = Windows for Workgroups, 3 = Win32s, 4 = Windows NT Family (e.g. 4.0, 2000, XP, 2003, Vista), 5 = Windows 95/98/ME WIL EXE type; 0=Win16, 1=Intel32, 2=Alpha32, 3=Mips32, 4=PowerPC32 WIL platform; 1=Win16, 2=Win32, 3=Win64 Number of colors supported by video driver Width of screen, in pixels Height of screen, in pixels Width of arrow on vertical scrollbar Height of arrow on horizontal scrollbar Height of window title bar Width of window border lines Height of window border lines Width of dialog box frame Height of dialog box frame Height of thumb box on scrollbar Width of thumb box on scrollbar Width of an icon Height of an icon Width of a cursor Height of a cursor Height of a one line menu bar Width of full screen window Height of a full screen window Height of Kanji window (Japanese) Is a mouse present (0 = No, 1 = Yes) Height of arrow on vertical scrollbar Width of arrow on horizontal scrollbar Is debug version of Windows running (0 = No, 1 = Yes) Are Left and Right mouse buttons swapped (0 = No, 1 = Yes) Reserved Reserved Reserved Reserved Minimum width of a window 597 WinMetrics 29 30 31 32 33 34 35 41 42 43 44 63 67 70 73 74 75 76 77 78 79 80 81 Minimum height of a window Width of bitmaps in title bar Height of bitmaps in title bar Width of sizeable window frame Height of sizeable window frame Minimum tracking width of a window Minimum tracking height of a window @TRUE or non-zero if the Microsoft Windows for Pen computing extensions are installed; zero, or @FALSE, otherwise. @TRUE or non-zero if the double-byte character set (DBCS) version of USER.EXE is installed; @FALSE, or zero otherwise. Number of buttons on mouse, or zero if no mouse is installed. Not supported. Not supported. Not supported. @TRUE or non-zero if the user requires an application to present information visually in situations where it would otherwise present the information only in audible form; @FALSE, or zero, otherwise. Not supported. Not supported. (WinNT 4.0+,) Non-zero if a mouse with a wheel is installed, zero otherwise (Win2000) Coordinates for the left side of the virtual screen (Win2000) Coordinates for the top of the virtual screen (Win2000) Width of the virtual screen, in pixels (Win2000) Height of the virtual screen, in pixels (Win2000) Number of display monitors on the desktop (Win2000) Non-zero if all the display monitors have the same color format, zero otherwise. There are a number of other request #'s which can be specified, but are of limited usefulness and therefore not documented here. Details on these can be obtained from Win32 programming references, available from Microsoft (and others). Example: mouse = "NO" If WinMetrics(19) == 1 Then mouse = "YES" Message("Is there a mouse installed?", mouse) See Also: Environment, MouseInfo, NetInfo, WinParmGet, WinResources, WinSysInfo, SysParamInfo 598 WinParmGet WinName Returns the name of the window calling the WIL Interpreter. Syntax: WinName ( ) Parameters: (none) Returns: (s) window name. Returns the name of the window making the current call to the WIL Interpreter. Example: allwins = WinItemize( ) win = AskItemList("Close window", allwins, @tab, @sorted, @single, @false) If win == WinName( ) Message("Sorry", "I can't close myself") else WinClose(win) endif Exit See Also: WinActivate, WinExeName, WinGetActive, WinItemize, WinTitle WinParmGet Returns system information. Syntax: WinParmGet (request#) Parameters: (i) request# see below. Returns: (s) see below. This function has been replaced by the more current function SysParamInfo. The request# parameter determines what piece of information will be returned. Req# 1 2 3 Meaning Beeping Mouse sensitivity Border Width Return value 0 = Off, 1 = On "threshold1 threshold2 speed" Width in pixels 599 WinParmSet 4 6 7 8 10 11 Keyboard Speed Horiz. Icon Spacing Screen Save Timeout Is screen saver enabled Wallpaper BMP file Desktop Pattern 12 13 14 15 16 Keyboard Delay Vertical Icon Spacing IconTitleWrap MenuDropAlign DoubleClickWidth 17 DoubleClickHeight 18 DoubleClickSpeed 19 MouseButtonSwap Keyboard Repeat rate Spacing in pixels Timeout in seconds 0 = No, 1 = Yes BMP file name Pattern codes (string of 8 space-delimited nums.) Delay in milliseconds Spacing in pixels 0 = No, 1 = Yes 0 = Right, 1 = Left Allowable horiz. movement in pixels for DblClick Allowable vert. movement in pixels for DblClick Max time in millisecs between clicks for DblClick 0 = Not swapped, 1 = swapped Example: If WinParmGet(8) == 1 Then Message("", "Screen saver is active") See Also: Environment, MouseInfo, NetInfo, WinMetrics, WinParmSet, WinResources, WinSysInfo, SysParamInfo WinParmSet Sets system information. Syntax: WinParmSet (request#, new-value, INI-control) Parameters: (i) request# (s) new-value (i) INI-control see WinParmGet see WinParmGet see below. Returns: (i) previous value of the setting. This function has been replaced by the more current function SysParamInfo. See WinParmGet for a list of valid request #'s and values. 600 WinPlace The "INI-control" parameter determines to what extent the value gets updated: INI-control 0 1 2 3 Meaning Set system value in memory only for future reference Write new value to appropriate INI file (which may be mapped to the registry in 32 bit Windows). Broadcast message to all applications informing them of new value Both 1 and 2 Example: WinParmSet(1, 1, 3) ; sets Beeping on Message("WinParmSet"," Window Parameters Set.") See Also: WallPaper, WinParmGet, SysParamInfo WinPlace Places a window anywhere on the screen. Syntax: WinPlace (x-ulc, y-ulc, x-brc, y-brc, partial-winname) Parameters: (i) x-ulc (i) y-ulc (i) x-brc (i) y-brc (s) partial-winname Returns: (i) how far from the left of the screen to place the upper-left corner (0-1000). how far from the top of the screen to place the upper-left corner (0-1000). how far from the left of the screen to place the bottom-right corner (10-1000) or @NORESIZE. how far from the top of the screen to place the bottom-right corner (10-1000) or @NORESIZE. either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be moved to the new position. @TRUE if a window was found to move; @FALSE if no windows were found. Use this function to move windows on the screen. (You cannot, however, move icons or windows that have been maximized to full screen). The "x-ulc", "y-ulc", "x-brc", and "y-brc" parameters are based on a logical screen that is 1000 points wide by 1000 points high. 601 WinPlaceChild You can move the window without changing the width and/or height by specifying @NORESIZE for the "x-brc" and/or "y-brc" parameters, respectively. Some sample parameters: Upper left quarter of the screen: 0, 0, 500, 500 Upper right quarter: 500, 0, 1000, 500 Center quarter: 250, 250, 750, 750 Lower left eighth: 0, 750, 500, 1000 This function works only with top-level (parent) application windows. Note: 1000x1000 virtual screen size is based on the primary monitor in a multimonitor display configuration Example: Run("Notepad.exe","") WinPlace(0, 0, 200, 200, "~Notepad") See Also: WinArrange, WinHide, WinIconize, WinPlaceChild, WinPlaceSet, WinPosition, WinShow, WinZoom, Partial Window Names (pg.67) WinPlaceChild Places a child window. Syntax: WinPlaceChild (x-ulc, y-ulc, x-brc, y-brc, partial-parent-winname, partial-childwinname) Parameters: (i) x-ulc how far from the left of the screen to place the upper-left corner (0-1000). (i) y-ulc how far from the top of the screen to place the upper-left corner (0-1000). (i) x-brc how far from the left of the screen to place the bottom-right corner (10-1000) or @NORESIZE. (i) y-brc how far from the top of the screen to place the bottom-right corner (10-1000) or @NORESIZE. (s) partial-parent-winname specifies the parent of the window to place. (s) partial-child-winname specifies the child window to be placed. Returns: (i) 602 @TRUE if a window was found to move. WinPlaceGet This function is like WinPlace, but places a child window. The coordinates are specified as virtual coordinates within the client area of the parent window, where the parent window is 1000 x 1000. Use this function to move child windows on the screen. (You cannot, however, move icons or windows that have been maximized to full screen). The "x-ulc", "y-ulc", "x-brc", and "y-brc" parameters are based on a logical screen that is 1000 points wide by 1000 points high. You can move the window without changing the width and/or height by specifying @NORESIZE for the "x-brc" and/or "y-brc" parameters, respectively. Some sample parameters: Upper left quarter of the screen: 0, 0, 500, 500 Upper right quarter: 500, 0, 1000, 500 Center quarter: 250, 250, 750, 750 Lower left eighth: 0, 750, 500, 1000 This function works only with child application windows. Note: 1000x1000 virtual screen size is based on the primary monitor in a multimonitor display configuration Example: Run(StrCat(DirHome(),"winbatch studio.exe"),"") list = WinItemChild("WinBatch Studio") choice = AskItemList("Choose the child window to activate", list, @TAB, @UNSORTED,@SINGLE) if WinExistChild("WinBatch Studio",choice) WinActiveChild("WinBatch Studio",choice) WinPlaceChild(0, 0, 200, 200, "WinBatch Studio", choice) Endif See Also: WinArrange, WinHide, WinIconize, WinPlace, WinPlaceSet, WinPosition, WinShow, WinZoom, Partial Window Names (pg.67) WinPlaceGet Returns window coordinates. Syntax: WinPlaceGet (win-type, partial-winname) Parameters: (i) win-type (s) partial-winname @ICON, @NORMAL, or @ZOOMED the initial part of, or an entire, window name. 603 WinPlaceSet Returns: (s) window coordinates (see below). This function returns the coordinates for an iconized, normal, or zoomed window. "Partial-winname" is the initial part of a window name, and may be a complete window name. It is case-sensitive. You should specify enough characters so that "partial-winname" matches only one existing window. If it matches more than one window, the most recently accessed window which it matches will be used. The returned value is a string of either 2 or 4 numbers, as follows: Iconic windows Normal windows Zoomed windows "x y" (upper left corner of the icon) "upper-x upper-y lower-x lower-y" "x y" (upper left corner of the window) All coordinates are relative to a virtual 1000x1000 screen. This function works only with top-level (parent) application windows. Note: 1000x1000 virtual screen size is based on the primary monitor in a multimonitor display configuration Example: Run("notepad.exe", "") pos = WinPlaceGet(@NORMAL, "~Notepad") TimeDelay(2) WinPlaceSet(@NORMAL, "~Notepad", "250 250 750 750") TimeDelay(2) WinPlaceSet(@NORMAL, "~Notepad", pos) See Also: WinGetActive, WinItemize, WinPlaceSet, WinPosition, WinState, Partial Window Names (pg.67) WinPlaceSet Sets window coordinates. Syntax: WinPlaceSet (win-type, partial-winname, position-string) Parameters: (i) win-type (s) partial-winname (s) position-string @ICON, @NORMAL, or @ZOOMED the initial part of, or an entire, window name. window coordinates (see below). Returns: (s) previous coordinates. 604 WinPosition This function sets the coordinates for an iconized, normal, or zoomed window. The window does not have to be in the desired state to set the coordinates; for example, you can set the iconized position for a normal window so that when the window is subsequently iconized, it will go to the coordinates that you've set. "Partial-winname" is the initial part of a window name, and may be a complete window name. It is case-sensitive. You should specify enough characters so that "partial-winname" matches only one existing window. If it matches more than one window, the most recently accessed window which it matches will be used. "Position-string" is a string of either 2 or 4 numbers, as follows: Iconic windows Normal windows Zoomed windows "x y" (upper left corner of the icon) "upper-x upper-y lower-x lower-y" "x y" (upper left corner of the window) All coordinates are relative to a virtual 1000x1000 screen. This function works only with top-level (parent) application windows. Note: 1000x1000 virtual screen size is based on the primary monitor in a multimonitor display configuration Example: Run("Notepad.exe","") WinPlaceSet(@ICON, "~Notepad", "10 950") See Also: WinActivate, WinArrange, WinPlace, WinPlaceGet, WinState, Partial Window Names (pg.67) WinPosition Returns Window position. Syntax: WinPosition (partial-winname) Parameters: (s) partial-winname the initial part of, or an entire, winname. Returns: (s) window coordinates, delimited by commas. Returns the current window position information for the selected window. It returns 4 comma-separated numbers (see WinPlace for details). This function works only with top-level (parent) application windows. Example: Run("notepad.exe", "") ; start Notepad WinPlace(0,0,300,300, "~Notepad") ; place Notepad 605 WinResources pos = WinPosition("~Notepad") ; save position TimeDelay(2) WinPlace(200,200,300,300, "~Notepad") ; move Notepad TimeDelay(2) WinPlace(%pos%, "~Notepad") ; restore Notepad See Also: WinGetActive, WinItemize, WinPlace, WinPlaceGet, WinState, Partial Window Names (pg.67) WinPositionChild Returns child window position. Syntax: WinPositionChild( partial-parent-winname, partial-child-winname) Parameters: (s) partial-parent-winname (s) partial-child-winname specifies the parent of the window. specifies the child window. Returns: window coordinates, delimited by commas. This function is like WinPosition, but returns coordinates for a child window. The coordinates are specified as virtual coordinates within the client area of the parent window, where the parent window is 1000 x 1000. This function works only with child application windows. Example: allwins = WinItemize( ) parentwnd = AskItemList("Top Level Windows", allwins, @tab, @sorted, @single, @false) childwins=WinItemChild(parentwnd) childwnd = AskItemList("Choose a child window to get coordinates from", childwins, @tab, @sorted, @single, @false) ret = WinPositionChild(parentwnd,childwnd) Message(StrCat("Parent: ",parentwnd, " Child: ",childwnd), StrCat("coordinates = ",ret)) Exit See Also: WinGetActive, WinItemize, WinPosition, WinPlace, WinPlaceGet, WinState, Partial Window Names (pg.67) WinResources Returns information on available memory and resources. 606 WinResources Syntax: WinResources (request# [, format] ) Parameters: (i) request# (i) format see below. [optional] see below. Returns: (i) see below. The value of request# determines the piece of information returned. Req# 10 Return value Number between 0 and 100 giving a general idea of current memory utilization, in which 0 indicates no memory use and 100 indicates full memory use. Total number of bytes of physical memory. Number of bytes of physical memory available. Total number of bytes that can be stored in the paging file. Note: that this number does not represent the actual physical size of the paging file on disk. Number of bytes available in the paging file. Total number of bytes that can be described in the user mode portion of the virtual address space of the calling process. Number of bytes of unreserved and uncommitted memory in the user mode portion of the virtual address space of the calling process. Number of bytes of unreserved and uncommitted memory in the extended portion of the virtual address space of the calling process (Windows 2000 and newer). 11 12 13 14 15 16 17 Format is an optional parameter that controls the format in which the size is returned. If the result is too large to be returned as an integer (larger than 2 gigabytes). Format Meaning 0 (Default) Floating Point 1 Huge number. This is a long decimal number string, which may represent a number too large to be converted to an integer.'Huge number' is a special data type. It is a long decimal number string, which may represent a number too large to be converted to an integer. This value cannot be modfied with standard arithmetic operations, it requires the use of the Huge Math extender. 607 WinState Example: mem = WinResources(10) Message("Current memory utilization ", mem) See Also: WinMetrics, WinParmGet, WinSysInfo, SysParamInfo WinShow Shows a window in its "normal" state. Syntax: WinShow (partial-winname) Parameters: (s) partial-winname Returns: (i) either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be shown. @TRUE if a window was found to show; @FALSE if no windows were found. Use this function to restore a window to its "normal" size and position. A partial-window name of "" (null string) restores the current WIL interpreter window. Example: RunZoom("Notepad.exe", "") ; other processing... WinShow("~Notepad") See Also: WinArrange, WinHide, WinIconize, WinZoom, Partial Window Names (pg.67) WinState Returns the current state of a window. Syntax: WinState (partial-winname) Parameters: (s) partial-winname the initial part of, or an entire, window name. Returns: (i) window state (see below). 608 WinSysInfo "Partial-windname" is the initial part of a window name, and may be a complete window name. It is case-sensitive. You should specify enough characters so that "partial-winname" matches only one existing window. If it matches more than one window, the most recently accessed window which it matches will be used. Possible return values are as follows. Value -1 0 1 2 3 Symbolic name @HIDDEN @FALSE @ICON @NORMAL @ZOOMED Meaning Specified window exists, but is hidden Specified window does not exist Specified window is iconic (minimized) Specified window is a normal window Specified window is zoomed (maximized) This function works only with top-level (parent) application windows. Example: RunIcon("Notepad.exe","") If WinState("~Notepad") == @ICON Then WinShow("~Notepad") See Also: Run, WinExist, WinGetActive, WinHide, WinIconize, WinItemize, WinPlace, WinPlaceGet, WinPlaceSet, WinPosition, WinShow, WinZoom, Partial Window Names (pg.67) WinSysInfo Returns system configuration information. Syntax: WinSysInfo( ) Parameters: (none) Returns: (s) a TAB delimited list of system configuration information. WinSysInfo returns a TAB-delimited list containing the following items: 1. 2. 3. 4. 5. 6. computer name of the current system. processor architecture. page size (specifies granularity of page protection and commitment). mask representing the set of processors configured into the system. number of processors in the system. processor type. 609 WinTitle 7. 8. 9. granularity in which memory will be allocated. system's architecture-dependent processor level. architecture-dependent processor revision. Example: sysinfo = WinSysInfo( ) computer = ItemExtract(1, sysinfo, @TAB) processor = ItemExtract(6, sysinfo, @TAB) Message(computer, "is a %processor%") See Also: WinMetrics, WinParmGet, WinResources, SysParamInfo WinTitle Changes the title of a window. Syntax: WinTitle (partial-winname, new-name) Parameters: (s) partial-window name either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be shown. (s) new-name the new name of the window. Returns: (i) @TRUE if a window was found to rename; @FALSE if no windows were found. Use this function to change a window's title. A "partial-window name" of "" (null string) refers to the current WIL interpreter window. Warning: Some applications may rely upon their window's title staying the same! Therefore, the WinTitle function should be used with caution and adequate testing. This function works only with top-level (parent) application windows. Example: ; Capitalize title of window allwinds = WinItemize( ) mywin = AskItemList("Uppercase Windows", allwinds, @TAB, @unsorted, @single, @false) WinTitle(mywin, StrUpper(mywin)) Drop(allwinds, mywin) See Also: WinGetActive, WinItemize, WinName, Partial Window Names (pg.67) 610 WinVersion WinVersion Provides the version number of the current Windows system. Syntax: WinVersion (level) Parameters: (i) level see below. Returns: (i) Windows version number. Level 0 Returns (i) Minor version: returns the decimal part of the Windows version number; i.e. 1.0, 2.11, 3.0, etc. 1 (i) Major version: returns the integer part of the Windows version number; i.e. 1.0, 2.11, 3.0, etc. 2 3 (i) Build number (s) CSD version: returns a string indicating the latest service pack that has been installed (e.g., "Service Pack 1"), or a blank string ("") if no service pack has been installed. (i) Windows platform [same as WinMetrics(-4)] Value Meaning 0 Other 1 Windows 3.X 2 Windows for Workgroups 3 Win32s 4 Windows NT Family 5 Windows 95/98/ME (s) Version string This is a string in the form: "platform-major-minor" where "platform" is one of the following: Value Meaning 0 Win32s 1 Windows 95/98/ME 2 Windows NT Family Major version number of the latest Service Pack installed. Minor version number of the latest Service Pack installed. Bit flags that identify the product suites available on the system. This can be 0, or one or more of the following values, combined using the bitwise OR ('|') operator: Value Meaning 1 Microsoft Small Business Server was once installed on the 4 5 6 7 8 611 WinVersion 9 system, but may have been upgraded to another version of Windows (see note below). 2 Windows Server 2003, Enterprise Edition, Windows 2000 Advanced Server, or Windows NT Server 4.0 Enterprise Edition is installed (see note below). 4 Microsoft BackOffice components are installed. 16 Terminal Services is installed. 32 Microsoft Small Business Server is installed with the restrictive client license in force (see note below). 64 Windows XP Embedded is installed. 128 Windows Server 2003, Datacenter Edition or Windows 2000 Datacenter Server is installed. 256 Terminal Services is installed, but only one interactive session is supported. 512 Windows XP Home Edition is installed. 1024 Windows Server 2003, Web Edition is installed. Note that you should not solely rely upon the '1' flag to determine whether Small Business Server has been installed on the system, as both this flag and the '32' flag are set when this product suite is installed. If you upgrade this installation to Windows Server, Standard Edition, the '32' flag will be unset, however, the '1' flag will remain set. In this case, this indicates that Small Business Server was once installed on this system. If this installation is further upgraded to Windows Server, Enterprise Edition, the '1' flag will remain set. Additional information about the system. This can be one of the following values: Value Meaning 1 The operating system is Windows "Longhorn", Windows XP Professional, Windows XP Home Edition, Windows 2000 Professional, or Windows NT Workstation 4.0. 2 The system is a domain controller. 3 The system is a server. Notes: A server that is also a domain controller is reported as '2', not '3'. A blank string will be returned for levels 6-9 on unsupported Windows platforms. To decipher between all Windows platforms. Use the function WinVersion(5) to tell which one you have: Windows 95 98 612 Platform 1 1 Major 4 4 Minor 0 10 WinWaitChild ME NT3.51 NT 4 NT 2000 XP 2003 (Server) Vista 7 1 2 2 2 2 2 2 2 4 3 4 5 5 5 6 6 90 51 0 0 1 2 0 1 v = WinVersion(5) Platform="Unknown" if v=="1-4-0" then Platform="Windows 95" if v=="1-4-10" then Platform="Windows 98" if v=="1-4-90" then Platform="Windows ME" if v=="2-3-51" then Platform="Windows NT 3.51" if v=="2-4-0" then Platform="Windows NT 4.0" if v=="2-5-0" then Platform="Windows 2000" if v=="2-5-1" then Platform="Windows XP" if v=="2-5-2" then Platform="Windows 2003 Server" if v=="2-6-0" then Platform="Windows Vista" if v=="2-6-1" then Platform="Windows 7" Message("Platform",platform) Example: minorver = WinVersion(0) majorver = WinVersion(1) buildver = WinVersion(2) csdver = WinVersion(3) Message("Windows Version", StrCat(majorver, ".", minorver, " ",buildver, " ", csdver)) See Also: Environment, FileVerInfo, Version, VersionDLL WinWaitChild Waits for a child window to exist. Syntax: WinWaitChild(partial parent winname, partial child winname, timeout) Parameters: (s) partial parent winname the initial part of, or an entire parent window name. (s) partial child winname the initial part of, or an entire child window name. (i) timeout the number of seconds to wait (maximum = 86400). Specify 0 to return immediately (no wait). Specify -1 for no timeout (wait forever). 613 WinWaitClose Returns: (s) @TRUE if the window appeared; @FALSE if it didn't. Note: This function has a built in ½ second time delay. This can be modified by IntControl 70. Example: Run(StrCat(DirHome(),"winbatch studio.exe"),"") WinWaitExist("WinBatch Studio", 5) TimeDelay(1) SendMenusTo("WinBatch Studio", "File Open") SendKeysTo("Open", "c:\config.sys{enter}") ret = WinWaitChild("WinBatch Studio", "c:\CONFIG.SYS", 5) if ret == @True Message("Notice","Child window found") else Message("Notice","Child window found") Endif See Also: AppWaitClose, IntControl 70, TimeDelay, RunWait, WinExist, WinExistChild, WinWaitClose, WinWaitExist, Partial Window Names (pg.67) WinWaitClose Suspends the WIL program execution until a specified window has been closed. Syntax: WinWaitClose (partial-winname [, timeout] ) Parameters: (s) partial-winname (i) timeout Returns: (i) either an initial portion of, or an entire window name. WinWaitClose suspends execution until all matching windows have been closed. number of seconds to wait (maximum = 86400). Specify 0 to have the function return immediately. Specify -1 for no timeout (wait forever). The default is -1. @TRUE if at least one window was found to wait for; @FALSE if no windows were found. Use this function to suspend the WIL program's execution until the user has finished using a given window and has manually closed it. This function works only with top-level (parent) application windows. If the window doesn’t exist, the function will immediately return the value @FALSE. If the window exists, the function will wait for it close or until the 614 WinWaitReady timeout period has elapsed, whichever comes first, and then return the value @TRUE. Note: This function has a built in ½ second time delay. This can be modified by IntControl 70. Example: Run("notepad.exe", "") Display(4, "Note", "Close Notepad to continue") WinWaitClose("~Notepad") Message("Continuing...", "Notepad closed") See Also: AppWaitClose, IntControl 70, TimeDelay, RunWait, WinExist, WinWaitChild, WinWaitExist, Yield, Partial Window Names (pg.67) WinWaitExist Waits for a window to exist. Syntax: WinWaitExist(partial-winname, timeout) Parameters: (s) partial-winname (i) timeout Returns: (s) the initial part of, or an entire, window name. the number of seconds to wait (maximum = 86400). Specify 0 to return immediately (no wait). Specify -1 for no timeout (wait forever). @TRUE if the window appeared; @FALSE if it didn't. Note: This function has a built in ½ second time delay. This can be modified by IntControl 70. Example: Run("notepad.exe", "") WinWaitExist("~Notepad", 5) TimeDelay(1) SendMenusTo("~Notepad", "File Open") SendKeysTo("File Open", "c:\config.sys~") See Also: AppWaitClose, IntControl 70, TimeDelay, RunWait, WinExist, WinWaitChild, WinWaitClose, Partial Window Names (pg.67) WinWaitReady Waits until an application is waiting for user input. 615 WinZoom Syntax: WinWaitReady( partial-winname, timeout ) Parameters: (s) partial-winname (i) timeout Returns: (i) the initial part of, or an entire, window name. the number of milliseconds to wait. Specify 0 to return immediately (no wait). Specify -1 for no timeout (wait forever). It returns @TRUE if it successfully waits, or @FALSE if a time-out occurred (or if it was unable to initiate a wait). This function waits until the process which created the specified window is waiting for user input with no input pending, or until the specified time-out interval has elapsed. It can only be used with 32-bit GUI applications. Example: Run("Notepad.exe","") retvalue = WinWaitReady("~Notepad", 5) WinClose("~Notepad") See Also: WinWaitChild, WinWaitExist WinZoom Maximizes a window to full-screen. Syntax: WinZoom (partial-winname) Parameters: (s) partial-winname Returns: (i) either an initial portion of, or an entire window name. The most-recently used window whose title matches the name will be shown. @TRUE if a window was found to zoom; @FALSE if no windows were found. Use this function to "zoom" windows to full screen size. A partial-winname of " " (null string) zooms the current WIL interpreter window. This function works only with top-level (parent) application windows. 616 Yields Example: Run("notepad.exe", "") WinZoom("~Notepad") TimeDelay(3) WinShow("~Notepad") See Also: RunZoom, WinHide, WinIconize, WinPlace, WinShow, Partial Window Names (pg.67) Yield Provides time for other windows to do processing. Syntax: Yield Parameters: (none) Returns: (not applicable) Use this command to give other running windows time to process. This command will allow each open window to process 20 or more messages. The Yield waits a very short time. The TimeDelay function gives other running windows time to process messages, like the Yield does. TimeDelay might be better to use for longer time delays. Example: ; run Excel and give it some time to start up sheet = AskLine ("Excel", "File to run:", "", 0) Run("excel.exe", sheet) Yield Yield Yield See Also: TimeDelay, TimeWait, Exclusive, WinWaitChild, WinWaitExist Yields Provides time for other windows to do processing. Syntax: Yields(count) 617 Yields Parameters: (s) count number of yields to perform. Returns: (not applicable) Use this command to give other running windows time to process. This command will allow each open window to process 20 or more messages. This function is the same as the "Yield" command, but allows you to specify the number of yields to perform; i.e., "Yields(5)" is the same as 5 consecutive "Yield" commands. The Yield waits a very short time. The TimeDelay function gives other running windows time to process messages, like the Yield does. TimeDelay might be better to use for longer time delays. Example: ; run Excel and give it some time to start up Run("excel.exe", "") Yields(300) See Also: Yield 618 Menu File Structure MENU FILES If you are using a batch file-based implementation of WIL, you can skip this section and move on to the WIL Tutorial (pg. 21). WinBatch, WebBatch, and Clock Manager are batch file applications. FileMenu, PopMenu and WinBatch Studio are menu file applications. About Menu Files This section of the manual shows how to create WIL menu files. It is not important at this point to understand the actual commands which are shown in the menus. WIL Batch processes can be run from batch files or from menu files. WinBatch uses batch files. Several other applications use WIL as their macro language in the form of menu files. The single workstation version of WinBatch, (not the Compiler), includes two accessory applications, PopMenu and File Menu. These run batch processes from menu files. WIL is also available to software developers for use as the macro language in their own software. How Menu Files are used WIL scripts can be implemented in two ways: via a batch process or a menu file. In a batch process, WIL scripts are associated with the WIL processor allowing them to be initiated and run on the desktop just as any true executable is launched and run. WIL scripts can also be launched as menu items from a drop down menu. However, you must have an implementation of WIL with the capability of generating the menu either within one of our applications or as an enhancement to standard Windows applications. WIL adds menu capability to the Windows Task Bar and the Shortcut Menu in the Windows Explorer via the utilities FileMenu and PopMenu. Menu File Structure WIL menus are defined in a menu file which is simply a standard ASCII text file (the kind created by Notepad). Each menu file consists of one or more lines of menu statements. Each line is terminated with a carriage return / line feed (CRLF) combination, and can be up to 2048 characters long. Generally, these files have an extension of .MNW, or .MNU. See your product documentation for the name of the default menu file that it uses. 619 Menu File Structure Every menu file contains one or more menu items. When activated they appear as drop-down menus. They may also contain top-level menu names which show up in a main menu bar (refer to your product documentation for more information). Each menu item consists of a title which identifies the item, followed by one or more lines of menu code which the WIL Interpreter will execute when you choose the item. Essentially, your menu file is an outline of menu options, formatted with specific spacing and containing sections of code. There are two main parts of a menu file: The first section, which is optional, is the initialization code. This section is executed once when the menu is first loaded and run. It's located before the first menu item. The remainder of the menu file consists of menu item titles and their associated statements. The code under each menu title is executed when the corresponding menu item is selected. Execution begins at the first statement under a menu item and continues up to the definition of the next item. Menus can be up to four levels deep. Levels are determined by the column position of the first letter in the menu title. The top level menu starts at Column 1, the second starts in Column 2, and so on. The WIL code must begin at Column 5 or greater. Same level menu items must be separated by WIL code. In the example below, Option #1 and Option #2 are separated by the WIL code which is to be executed. &Top Menu (Level 1) Option #1 (Level 2) Submenu of Option #1 (Level 3) Submenu of Option #1 (Level 4) WIL code Option #2 (Level 2) Submenu (Level 3) WIL code Your application probably included a pre-defined sample menu. Refer to it for a practical example of correct menu structure. Here is another example of an extremely simple menu file: 620 Menu File Structure &Games &Solitaire Run("sol.exe", "") The first line, &Games, begins in column 1, and therefore defines a top-level menu item. Depending on the product you are using, it may either appear on a menu bar or it may appear on the first-level drop-down menu. The ampersand (&) is optional; it defines an Alt-key combination for the entry (Alt-G in this example). It will appear in the menu as Games. The second line, &Solitaire, begins in column 2, and defines the title for an individual menu item. Again, the ampersand (&) is optional. It defines an Alt-key combination of Alt-S. This item will appear in the menu as Solitaire. The third line, Run("sol.exe", ""), is the actual code which will be executed when this menu item is selected. Like all menu code, it must be indented at least four spaces (i.e., it must begin in column 5 or higher). This third line is really the entire WIL program; the two lines above it are simply titles which define the position of the program (i.e., the menu item) in the overall menu structure. Here's a slightly expanded version of the program: &Games &Solitaire Display(1, "Game Time", "About to play Solitaire") Run("sol.exe", "") Here, we've simply added a line of code, changing this into a two-line program. Notice that each additional line of code is still indented the same four spaces. Now, let's look at a menu file which contains two menu items: &Games &Solitaire Run("sol.exe", "") &Minesweeper Run("winmine.exe", "") We've added a new menu item, Minesweeper, which begins in column 2 (like Solitaire) and will appear under the top-level menu item Games. To add a new top-level menu item, just create a new entry beginning in column 1: &Games &Solitaire Run("sol.exe", "") &Minesweeper Run("winmine.exe", "") &Applications &Notepad Run("notepad.exe", "") 621 Menu File Structure &WinBatch Studio Run("winbatch studio.exe", "") Now there are two top-level menu titles, Games and Applications, each of which contains two individual items (the blank line between Games and Applications is not necessary, but is there just for readability). In supported applications such as FileMenu, a comment can be displayed on the status bar in the Windows Explorer. This works only for top level menu items. The comment must be on the same line as the top level item. For example, the menu item below is a main menu for running Games. "Killers of Time" is the comment that appears in the status bar. &Games ;Killers of Time &Solitaire Run("sol.exe", "") In addition to top-level menus, you can optionally define up to three additional levels of submenus. The titles for the first-level, second-level and third-level submenus must begin in columns 2, 3, and 4 respectively, and the individual menu items they contain must be indented one additional column. For example: &Applications &Editors &Notepad Run("notepad.exe", "") &WinBatch Studio Run("winbatch studio.exe", "") &Excel Run("excel.exe", "") In the above example, Editors is a submenu (beginning in column 2), which contains two menu items (beginning in column 3). Excel also begins in column 2, but since it does not have any submenus defined below it, it is a bottom-level (i.e., individual) menu item. Here's an even more complex example: &Applications &Editors &Notepad Run("notepad.exe", "") &Winbatch Studio Run("winbatch studio.exe", "") |&Spreadsheets &Windows-based &Excel Run("excel.exe", "") _&DOS-based 622 Menu Hotkeys &Quattro Run("q.exe", "") We've added an additional level of submenus under Spreadsheets, so that the bottom-level menu items (Excel and Quattro) now begin in column 4. There are also two special symbols presented in this menu: the underscore (_), which causes a horizontal separator line to be drawn above the associated menu title, and the vertical bar (|), which causes the associated menu title to appear in a new column. Some applications allow you to place an individual (bottom-level) menu item in column 1: &Notepad Run("notepad.exe", "") in which case it will appear on the top-level menu, but will be executed immediately upon being selected (i.e., there will be no drop-down menu). Modifying Menus As stated earlier, menu files must be created and edited with an editor, such as WinBatch Studio, that is capable of saving files in pure ASCII text format. After you have edited your menu, it must be reloaded into memory for the changes to take effect. You may be able to do this manually, via the application's control menu (see your product documentation for information). Or, you can have a menu item use the Reload function. Otherwise, the menus will be reloaded automatically the next time you execute any menu item. However, if the menus are reloaded automatically, the WIL Interpreter will not be able to determine which menu item you had just selected, and it will therefore display a message telling you that you need to re-select it. Menu Hotkeys In addition to the standard methods for executing a menu item (double-clicking on it, highlighting it and pressing Enter, or using Alt + the underlined letter), you may be able to define optional hotkeys for your menu items. (PopMenu and WinBatch Studip have this capability, FileMenu does not.) Hotkeys will cause an item to be executed immediately upon pressing the designated hot key. Hotkeys are defined by following the menu item with a backslash (\) and then the hotkey: &Accessories &Notepad \ {F2} Run("notepad.exe", "") &Calculator \ ^C Run("calc.exe", "") In the above example, the F2 key is defined as the hotkey for Notepad, and Ctrl-C is defined as the hotkey for Calculator. 623 Menu Items Most single keys and key combinations may be used as hotkeys, except for the F10 key, and except for Alt and Alt-Shift key combinations (although you may use Alt-Ctrl key combinations). Refer to the SendKey function (pg. 516) for a list of special keycodes which may also be used as hot keys. If you always access a menu item by using its hotkey, you may not need or want the menu item to appear in the pull-down menus. If so, you can make it a non-displayed menu item by placing a @ symbol in front of the title. For example: &Accessories @Notepad \ {F2} Run("notepad.exe", "") In this case, Notepad would not appear in the pull-down menus, but could still be accessed by using the F2 hotkey. Note: Hotkeys and non-displayed menu items may not work in all implementations of the WIL Interpreter. Menu Items Menu titles can consist of letters, digits, spaces, punctuation marks - in fact any displayable ANSI characters your text editor can create. There are special characters you can use to modify the appearance of items in the menus. & Causes the following character to be underlined in the menu item. The user can select the item by pressing the ALT key with the character instead of using the mouse. | In a main menu, puts this item on a new line. | In a drop down menu, this item starts a new column. _ Used to create a horizontal bar (in drop down menus only). @ Causes the item not to be displayed in the menu. In order to identify a menu item within a WIL statement, each menu item you define has an associated menu name. The menu name is built using only the letters and digits that make up the menu title. Menu names are case-insensitive; you don't have to worry about how the actual menu title is capitalized in order to identify it. 624 Menu Items For menu items in a pop-up menu, the menu name consists of its parent menu's name, plus the pop-up menu item's name concatenated at the end. Top-level menu names must begin in column 1. Submenu names are optional, and if used must begin in column 2-4; each column of indentation represents an additional level of submenu nesting. Actual menu code must begin in column 5 or higher, and must appear directly under the menu name to which it belongs. 625 Predefined Constants APPENDIX Constants Predefined Constants WIL has a number of built-in integer constants that can make your scripts much more readable. These start with the @-sign, and are case-insensitive. Logical Conditions Menu Handling @NO @OFF @TRUE @YES @ON @FALSE @CHECK @UNCHECK @DISABLE @ENABLE Window Arranging @NORESIZE @STACK @ARRANGE @TILE @ROWS @COLUMNS Window Status @NORMAL @ZOOMED @ICON @HIDDEN @GETPROCID OS Dependent @CAPSLOCK 626 String Handling @FWDSCAN @BACKSCAN System Control @MAJOR @MINOR Error Handling @CANCEL @NOTIFY @OFF Keyboard Status @SHIFT @CTRL Mouse Control @LBUTTON @RBUTTON Floating Point Constants @NUMLOCK @REGCLASSES @REGCURRENT @REGMACHINE @REGUSERS @SCROLLLOCK @WHOLESECTION @MBUTTON @LCLICK @RCLICK @MCLICK @LDBLCLICK @RDBLCLICK @MDBLCLICK BinarySort Control Miscellaneous @ASCENDING @DESCENDING @STRING @WORD1 @WORD2 @WORD4 @FLOAT8 @MULTIPLE @NOWAIT @OPEN @ROWS @SAVE @SINGLE @SORTED @STACK @TILE @UNSORTED @WAIT INI File Management @WHOLESECTION String Constants WIL defines a few string constants that are handy for formatting and processing text data. These start with the @-sign, and are case-insensitive. @CRLF 13,10 cr,lf @LF @CR @TAB 10 lf 13, cr 09 tab Floating Point Constants WIL has several predefined floating point constants that can be handy for scientific and engineering scripts. Like all WIL constants, they start with the @-sign, and are case-insensitive. @AMC Atomic Mass Constant 1.66043E-27 @GOLDENRATIO Goldenratio 1.6180339887498948 627 Floating Point Constants @AVOGADRO Avogadro's Constant 6.02252E23 @GRAVITATION Gravity Constant 6.670E-11 @BOLTZMANN Boltzmann Entropy Constant 1.38054E-23 @LIGHTMPS Speed of Light (miles/sec) 186272 @DEG2RAD Degrees to radians conversion constant 0.017453292519943 @LIGHTMTPS Lightmtps meters/sec 2.997925E8 @e @MAGFIELD Magnetic Field Constant 1.256637 Base of natural or Napierian logarithms 2.718281828459045 @ELECTRIC Electric Field Constant 8.8541853E-12 @PARSEC Parsec (AU) 206.265 @EULERS Eulers's Constant 0.5772156649015338 @PI @FARADAY Faraday Constant 9.64870E4 @PLANCKERGS Planck's Constant (Ergs) 6.6252E-27 @GFTSEC Gravitational Acceleration feet/sec2 32.174 9.80665 @PLANCKJOULES Planck's Constant (joules) 6.6256E-34 @GMTSEC Gravitational Acceleration meters/sec2 9.80665 @RAD2DEG Radians to Degrees Conversion Constant 57.29577951308232 628 Pi 3.141592653589793 INDEX INDEX @ @CRLF, 57 @TAB, 57 A About, 86 Abs, 86 Acos, 87 AddExtender, 87–89 AppExist, 89–90 AppWaitClose, 90–91 ArrayFileGet, 91–92 ArrayFileGetCsv, 92–93 ArrayFilePut, 93–94 ArrayFilePutCsv, 94–95 Arrayize, 95 Arrays, 82–83 ArraySwapElements, 96 ArrDimension, 96–98 ArrInfo, 98–99 ArrInitialize, 99 Asin, 100 AskColor, 100–101 AskDirectory, 101–3 AskFileName, 103–5 AskFileText, 105–6 AskFont, 106–8 AskItemList, 53, 108–10 AskLine, 43, 110–11 AskPassword, 112 AskTextBox, 112–13 AskYesNo, 43, 113–14 Atan, 114 Average, 115 B Beep, 44, 115 Binary Operations, 116 BinaryAlloc, 116–17 BinaryAllocArray, 117–19 BinaryAnd, 119–20 BinaryBufInfo, 120–21 BinaryCheckSum, 121–22 BinaryClipGet, 122–23 BinaryClipPut, 123–24 BinaryCompare, 125 BinaryConvert, 125–27 BinaryCopy, 127–28 BinaryEodGet, 128 BinaryEodSet, 128–29 BinaryFree, 129–30 BinaryHashRec, 130–31 BinaryIncr, 131–32 BinaryIndex, 132–33 BinaryIndexBin, 133–34 BinaryIndexEx, 134–35 BinaryIndexNC, 135–36 BinaryOleType, 136–39 BinaryOr, 139–40 BinaryPeek, 140–41 BinaryPeekHex, 141–42 BinaryPeekStr, 142–43 BinaryPeekStrW, 143 BinaryPoke, 143–44 BinaryPokeHex, 144–45 BinaryPokeStr, 145–46 BinaryPokeStrW, 146–47 BinaryRead, 147 BinaryReadEx, 147–48 BinaryReplace, 149 BinarySort, 149–51 BinaryStrCnt, 151–52 629 INDEX BinaryTagExtr, 152–53 BinaryTagFind, 153–55 BinaryTagIndex, 155–56 BinaryTagInit, 156–58 BinaryTagLen, 158–59 BinaryTagRepl, 160–62 BinaryWrite, 162 BinaryWriteEx, 163–64 BinaryXlate, 164–65 BinaryXor, 165–66 Break, 166–67 ButtonNames, 167–68 C Call, 168–69 Cancel, 63–64 Ceiling, 169–70 Char2Num, 170–71 ChrGetCodePage, 171 ChrHexToString, 171–72 ChrHexToUnicode, 171–72 ChrSetCodePage, 172–73 ChrStringToHex, 173 ChrStringToUnicode, 173–74 ChrUnicodeToHex, 174 ChrUnicodeToString, 174–75 ClipAppend, 175 ClipGet, 175–76 ClipGetEx, 176 ClipHasFormat, 176–78 ClipPut, 178 COM, 417–23 Command Line Parameters, 22 Comments, 77 ComputerNameGet, 178–79 ComputerNameSet, 179–80 Conditional Branching For, 339–40 ForEach, 340–41 If, 348–50 Select, 511–12 Switch, 556–57 Terminate, 559–60 While, 577–78 630 Constants, 71–72 Floating Point, 625–26, 625–26 Predefined, 72, 624–26 String, 72, 625 Constants/Predefined, 624 Continue, 180–81 Cos, 181–82 Cosh, 182 CreateObject, 182 CRLF, 66 CurrentFile, 182–83 CurrentPath, 183–84 CurrFilePath, 184 D DataCast, 185 DDEExecute, 185–86 DDEInitiate, 186–87 DDEPoke, 187–88 DDERequest, 188–89 DDETerminate, 189–90 DDETimeout, 190 Debug, 66, 191–93 DebugData, 193 DebugTrace, 194–98 Decimals, 198–99 Dialog, 199–232 Dialog - Using Internet Explorer Controls in WIL Dialogs, 223–32 Dialog User-Defined-Callback Function or Subroutine, 216–23 DialogControlGet, 232–36 DialogControlSet, 236–40 DialogControlState, 240–44 DialogObject, 244–47 DialogProcOptions, 247–51 DirAttrGet, 252 DirAttrGetEx, 252–55 DirAttrSet, 252–56 DirAttrSetEx, 256–59 DirChange, 47, 259 DirExist, 259–60 DirGet, 48, 260–61 DirHome, 261 INDEX DirInfoToArray, 261–63 DirItemize, 55, 263 DirMake, 264 DirRemove, 264 DirRename, 265 DirScript, 265–66 DirSize, 265–67 DirWindows, 267 DiskExist, 268 DiskFree, 268–69 DiskInfo, 269–70 DiskScan, 270–71 DiskSize, 271–72 DiskVolInfo, 272 Display, 42, 273 DllCall, 273–76 DllCall Additional Information, 276–77 DllCallCdecl, 276–80 DllFree, 276–81 DllHinst, 281–82 DllHwnd, 282 DllLastError, 282–83 DllLoad, 283 DOSVersion, 284 Drop, 284–85 DropWild, 285–86 Dynamic Dialogs, 215 E EndSession, 47, 286 Environment, 58, 286–87 EnvironSet, 287–88 EnvItemize, 288–90 ErrorMode, 49, 290–92 Errors, 83 see also. LastError, ErrorMode, Debug Exclusive, 292 Execute, 292–93 ExeTypeInfo, 293–94 Exit, 294 Exp, 294–95 Extenders, 64 F Fabs, 295 File Delimiters, 69 File Management, 47 FileAppend, 295–96 FileAttrGet, 296–97 FileAttrGetEx, 297–99 FileAttrSet, 300 FileAttrSetEx, 300–302 FileBaseName, 302–3 FileClose, 303 FileCompare, 304 FileCopy, 48, 305–6 FileCopyAttr, 306–7 FileCreateTemp, 307–8 FileDelete, 48, 308–9 FileDigest, 309–10 FileExist, 48, 310–11 FileExtension, 311 FileFullName, 311–12 FileGet, 312 FileGetW, 312–13 FileInfoToArray, 313–15 FileItemize, 53, 315 FileItemPath, 316 FileLocate, 316–17 FileMapName, 317–19 FileMove, 319–20 FileMoveAttr, 320–21 FileNameLong, 321 FileNameShort, 321–22 FileOpen, 322–23 FilePath, 323–24 FilePut, 324 FilePutW, 324–25 FileRead, 324–26 FileRename, 49, 326–27 FileRoot, 327 FileSize, 327–28 FileSizeEx, 328–29 FileTimeCode, 329–30 FileTimeGet, 330 FileTimeGetEx, 331 FileTimeSet, 331–32 631 INDEX FileTimeSetEx, 332–33 FileTimeTouch, 333 FileVerInfo, 333–36 FileWrite, 336–37 FileYmdHms, 337 FindWindow, 337–38 Floor, 338–39 Flow Control, 34 For, 339–40 ForEach, 340–41 G GetExactTime, 341–42 GetObject, 342 GetTickCount, 342 GoSub, 343 Goto, 343–44 I IconExtract, 344–45 IconInfo, 345–46 IconReplace, 346–48 Identifiers, 72 If, 31, 348–50 IgnoreInput, 350 IniDelete, 351 IniDeletePvt, 351–52 IniItemize, 352 IniItemizePvt, 353 IniRead, 353–54 IniReadPvt, 354–55 IniWrite, 355 IniWritePvt, 355–56 InstallFile, 356–58 Int, 358 IntControl, 67, 358–91 IsDefined, 391 IsFloat, 391–92 IsInt, 392–93 IsKeyDown, 393 IsLicensed, 393–94 IsNumber, 394 ItemCount, 394–95 632 ItemCountCsv, 395–96 ItemExtract, 396–97 ItemExtractCsv, 397–98 ItemInsert, 399 ItemLocate, 399–400 ItemRemove, 400 ItemReplace, 401 ItemSort, 401–2 K KeyToggleGet, 402 KeyToggleSet, 402–3 Keywords, 75 L LastError, 403–4 Log10, 404 LogDisk, 404–5 LogE, 405 M Max, 405–6 menu files menu structure, 617–21 menuitems, 622–23 Menu Files, 617–23 Message, 42, 406 Microsoft Windows determining the version, 607–10 Min, 406–7 Mod, 407 MouseClick, 407–8 MouseClickBtn, 408–9 MouseCoords, 409–10 MouseInfo, 410–11 MouseMove, 411–12 MousePlay, 412–14 MsgTextGet, 414–15 N Net101, 415 NetInfo, 415–16 INDEX Num2Char, 416–17 O ObjectAccess, 423–24 ObjectClose, 424–25 ObjectConstantsGet, 425–27 ObjectConstToArray, 427–28 ObjectCreate, 428–30 ObjectEventAdd, 433 ObjectEventRemove, 433–34 ObjectGet, 435–37 ObjectOpen, 437–38 ObjectType, 438–40 ObjectTypeGet, 440–44 Operators, 75–77 Precedence, 76 P Parameters Commandline, 22 Function, 78 ParseData, 444–45 Pause, 42, 445 PipeClientClose, 445–47 PipeClientOpen, 447–48 PipeClientSendRecvData, 448–49 PipeInfo, 450–51 PipeServerClose, 451–52 PipeServerCreate, 453–54 PipeServerRead, 454–55 PipeServerWrite, 455–57 PlayMedia, 457–58 PlayMidi, 458–59 PlayWaveForm, 459–60 Print, 463 PtrGlobal, 460 PtrGlobalDefine, 460–62 PtrGlobalTest, 461–62 PtrPersistent, 462–63 R Random, 464 RegApp, 465–66 RegCloseKey, 466–67 RegConnect, 467–68 RegCreateKey, 468 RegDeleteKey, 469 RegDelValue, 469–70 RegEntryType, 470–74 RegExistKey, 474 RegExistValue, 474–75 Registration Database Operations, 464–65 RegLoadHive, 475–76 RegOpenFlags, 476–77 RegOpenKey, 477–78 RegOpenKeyEx, 478–79 RegQueryBin, 479–80 RegQueryDword, 480–81 RegQueryEx, 481–82 RegQueryExpSz, 482–83 RegQueryItem, 483–84 RegQueryKey, 484–85 RegQueryKeyLastWriteTime, 484–85 RegQueryKeys, 485 RegQueryMulSz, 485–86 RegQueryQword, 486 RegQueryStr, 486–88 RegQueryValue, 488–89 RegSetBin, 489–90 RegSetDword, 490–91 RegSetEx, 491 RegSetExpSz, 492–93 RegSetMulSz, 493–94 RegSetQword, 494 RegSetValue, 494–95 RegUnloadHive, 495–96 Reload {*M}, 496 Return, 496–97 RtStatus, 497–98 Run, 40, 41, 498–99 RunEnviron, 499–500 RunHide, 500–501 RunHideWait, 501–2 RunIcon, 41, 502 RunIconWait, 503 Running programs, 40 DOS programs, 58 633 INDEX RunShell, 41, 503–4 RunWait, 504–5 RunWithLogon, 41, 505–10 RunZoom, 40, 510 RunZoomWait, 510–11 S Sample WBT file, 60 Select, 511–12 SendKey, 512–16 SendKeysChild, 516–17 SendKeysTo, 59, 517–18 SendMenusTo, 518–19 SendMessageA, 519–20 SendMessageW, 520 ShellExecute, 41, 520–21 ShortcutDir, 521–24 ShortcutEdit, 525–26 ShortcutExtra, 526–28 ShortcutInfo, 528–29 ShortcutMake, 529–30 Sin, 530–31 Sinh, 531 SnapShot printscreen, 531–32 Sounds, 70, 532–33 SoundVolume, 533 Sqrt, 533–34 Statements reference, 71–181 StrByteCount, 534 StrCat, 535 StrCharCount, 535–36 StrClean, 536–37 StrCmp, 537–38 StrCnt, 538 StrFill, 539 StrFix, 539–40 StrFixBytes, 540–41 StrFixBytesL, 541 StrFixChars, 541–42 StrFixCharsL, 542–43 StrFixLeft, 543 StriCmp, 543–44 634 StrIndex, 544–45 StrIndexNc, 545–46 StrIndexWild, 546 StrInsert, 546–47 StrLen, 547–48 StrLenWild, 548 StrLower, 548–49 StrOverlay, 549 StrReplace, 550 StrScan, 550–51 StrSub, 551–52 StrSubWild, 552 StrTrim, 553 StrTypeInfo, 553–55 StrUpper, 555–56 Substitution, 73–74 and StrCat, 535 Switch, 556–57 SysParamInfo, 557–58 T Tan, 558 Tanh, 558–59 Terminate, 559–60 TerminateApp, 560–61 Termination of WIL, 66 Things To Know, 63 TimeAdd, 562 TimeDate, 562–63 TimeDayofWeek, 563 TimeDelay, 44, 563–64 TimeDiff, 564–65 TimeDiffDays, 565 TimeDiffSecs, 565–66 TimeFunctions, 560–61 TimeJulianDay, 566 TimeJulToYmd, 567 TimeSubtract, 567–68 TimeWait, 568 TimeYmdHms, 569 U UacElevationLevel, 569–70 INDEX UacExePromptTest, 570 UacManifestSettings, 570–71 User Defined Callback, 223 User Defined Functions, 79–81 V Variables, 30, 73 VarType, 571–72 Version, 572–73 VersionDLL, 573 W WaitForKey, 573–75 WaitForKeyEx, 575–76 WallPaper, 576–77 While, 577–78 WIL programs error handling, 83 WIL programs WIL language components, 71–77 WIL Tutorial, 21–62 WinActivate, 46, 578 WinActiveChild, 578–79 WinArrange, 579 WinClose, 46, 580 Window Management, 44 Window Names, 67 WindowOnTop, 580–81 WinExeName, 580–82 WinExist, 46, 582 WinExistChild, 582–83 WinGetActive, 583–84 WinHelp, 584–86 WinHide, 586 WinIconize, 44, 586–87 WinIdGet, 587–88 WinIsDOS, 588 WinItemChild, 588–89 WinItemize, 589–90 WinItemizeEx, 590–91 WinItemNameId, 591–92 WinItemProcId, 592–93 WinMetrics, 593–95 WinName, 595–96 WinParmGet, 596–97 WinParmSet, 597–98 WinPlace, 598–99 WinPlaceChild, 599–600 WinPlaceGet, 600–601 WinPlaceSet, 601–2 WinPosition, 602 WinPositionChild, 602–3 WinResources, 603–4 WinShow, 44, 604–5 WinState, 605–6 WinSysInfo, 606 WinTitle, 607 WinVersion, 607–10 WinWaitChild, 610–11 WinWaitClose, 611 WinWaitExist, 612 WinWaitReady, 612–13 WinZoom, 44, 613 Y Yield, 613–14 Yields, 614–15 635