Microsoft KB Archive/112014

= Microsoft Knowledge Base =

README.TXT for Microsoft Test Version 2.0 for Windows
Last reviewed: October 19, 1994

Article ID: Q112014

The information in this article applies to:

- Microsoft Test for Windows, version 2.0

SUMMARY
This article contains the complete text of the README.TXT file that shipped with Microsoft Test version 2.0 for Windows.

MORE INFORMATION
Release notes for Microsoft Test, Version 2.0 C) Copyright Microsoft Corporation, 1993

This document contains the release notes for version 2.0 of Microsoft Test. The information in this document and in the Help menu is more up-to-date than that in the books.

CONTENTS
Part    Description ---

1    Documentation Errata and Additions a      Microsoft Test User's Guide b      Microsoft Test User Interface Editor User's Guide 2    New Dynamic-Link Library Procedures New TESTCTRL.DLL Procedures New TESTDLGS.DLL Procedures New TEST TALK Procedures New TESTUIL.DLL Procedures 3    Enhanced Functionality Test Dialogs User Interface Editor Detecting a Disk in Drive A: or B:           RUN Statement/Function NOT (!) Operator Test Trap Additions, Corrections, and Changes 4    Miscellaneous Using MS-DOS Boxes on the Novell Network Test Talk Issues Callbacks as Parameters PART 1: Documentation Errata and Additions

a: Microsoft Test User's Guide

TESTDLGS.EXE and TESTSCRN.EXE Filenames
Please note the following changes:

TESTDLGS.EXE was renamed to TESTDLG.EXE TESTSCRN.EXE was renamed to TESTSCN.EXE These filenames were changed so that the .EXE files did not have the same name as the dynamic link libraries (DLLs) TESTDLGS and TESTSCRN. When the names were the same, you couldn't run the .EXE if the DLL was already loaded. This situation occurred when you ran a script that called a DLL, stopped it at a breakpoint, and then tried to run the .EXE.

Page 58, Compiling Your Script
Before the sentence located at the end of the second paragraph in this section that says:

You can run your pcode file by using WBRUN20.EXE and passing it the pcode filename. Insert the following paragraphs:

To run a pcode file, the following files must be present:

The .PCD file WBRUN20.EXE WBEXEC20.DLL RBHEAP.DLL DLLs that you call from your script (TESTCTRL, TESTEVNT, etc.)

Under Windows 3.0, the DLLs must be in either the current directory, the WINDOWS or WINDOWS\SYSTEM directory, or a    directory in your path. Under Windows 3.1, the DLLs can be    in any of the above directories, and can also be in the directory where WBRUN20.EXE is located.

Page 86, Saving a Reference Image to a File
Add the following note after step 4 in the "To save an image to a file" procedure:

NOTE: Screen files cannot contain images that were captured using different video modes. If you captured and saved screen images in a file using one video mode, and try to capture and save a new screen image to the same file using a different video mode, an "Invalid    Screen Mode" error occurs. See Appendix B for a list of video modes.

Page 105, STRING *, Fixed-Length
Add the following paragraphs:

The maximum size of a fixed-length string is 32767 bytes. If this size is exceeded, an 'Invalid Size for Fixed-Length String' error occurs during compilation.

DIM S AS STRING * 32767 'this is valid DIM Y AS STRING * 32768 'this fails with an error

NOTE: this limitation does not apply to variable-length strings.

Page 111, User-Defined Data Types
Add the following paragraph and examples after the TYPE LOGRECORD example on this page:

The maximum size of a user-defined variable is 32,767 bytes. If this size is exceeded, an "overflow" error occurs during compilation. In the following examples Type1 is defined having the maximum size. Type2 produces an "overflow" error.

TYPE Type1 x as string * 32767    'The maximum size END TYPE

'This will produce an "overflow" error TYPE Type2 x as string * 32767 y as string * 2 END TYPE

Page 212, Monitoring a Station's Status
The following status code needs to be added to the list in this section:

Status Code         Value    Description -    ST_RECONNECTED          5     If a station has disconnected from the host and attempts to                                  reconnect, its old entry in the station list is updated to this status. Page 324 and 325, SendData and SendDataFile Procedures

The syntax for the DECLARE FUNCTION statements for these two procedures is missing a parameter (wType%). These statements should look like this:

DECLARE FUNCTION SendData LIB "TESTHost.dll" (StationNum%,      wType%, lpData AS ANY, DSize&) AS INTEGER

DECLARE FUNCTION SendDataFile LIB "TESTHost.dll" (StationNum%,      wType%, FileName$) AS INTEGER

wType% Communicates to the station what kind of data you are sending. For example, if you are sending a script to be executed, set this parameter to DT_SCRIPT. When the station gets the data, this parameter determines what gets returned by the GetDataType function on the station side.

Page 388, Return Values
Add the following Error messages to the end of the table on this page (Value 29 is replaced):

Error message              Value -    ERR_CANT_MOVE_WND            29 ERR_CANT_SIZE_WND           30 ERR_CANT_ADJ_SIZE_POS_WND   31 ERR_CANT_FIND_LBBOX         32 ERR_NOT_OPERATOR_NOT_ALLOWED 33 ERR_CANT_ADD_NULL_ITEM      34 ERR_BAD_POINTER             35 MAX_ERROR                   36

Pages 393-397, WFndWnd and WFndWndWait Procedures (TESTCTRL.DLL)
Add the following wFlags to the list starting on page 393:

FW_MAXIMIZE    If a window is found, it is maximized. FW_MINIMIZE    If a window is found, it is minimized. FW_RESTORE     If a window is found, it is restored. FW_DIALOG      Find dialog boxes (class #32770) only. FW_DIALOGOK    Find either windows or dialog boxes Additional Comments:

The first 3 wFlags in this list do not imply FW_FOCUS. If the window is an MDI window, it can be maximized, minimized, or restored without automatically gaining the focus. Although FW_MAXIMIZE and FW_RESTORE do not imply FW_FOCUS, top-level windows will get the focus because of the way Windows works.

Some applications put up dialog boxes with the same caption as the application's main window. If this happens, you may find the wrong window if you use WFndWnd. Instead, use WFndWndC and specify a class when locating windows in these cases.

To make things easier and more readable when looking for a dialog, instead of using WFndWndC and specifying the class name "#32770" (the dialog class), you can use WFndWnd and use the FW_DIALOG flags.

Page 394, WFndWnd Procedure (TESTCTRL.DLL)
o In the description of FW_IGNOREFILE at the top of this page,

replace the word "following" with "preceding." o In the first paragraph in the Comments section on this page,

after the first sentence, add the following:

NULL and an empty string ("") for the lpszCaption$ parameter are not treated the same:

("")    The window must have an empty caption to match. NULL    The window caption/text is ignored; can be anything.

Page 475, FILELIST Statement
Add this note before the "Examples" heading:

NOTE: The maximum number of files in the file list is 65,000. If a FILELIST ADD statement causes the file list to exceed this size, a run-time error 11, "Filelist processing error," occurs. The file list will contain only the first 65,000 files added to it. No more files can be added until a    FILELIST REMOVE or a FILELIST CLEAR statement is used.

Page 488, LEN Function
Add the following paragraphs to the "Remarks" section:

If is a user-defined type, LEN returns the size of the TYPE structure. For example:

TYPE MyType elem1 As Integer elem2 As String * 10 END TYPE

LEN(MyType)               'returns 12.

If is an array, LEN returns the size of an    individual array element. For example:

DIM array(100) AS DOUBLE LEN(array)               'returns 8.

Page 494, MSGBOX Statement
o MB_APPLMODAL Description

Add this note to the description in Table 9.4:

NOTE: When you set the MB_APPLMODAL flag, the message box is modal to the script window for that script, not to the Test Driver window in    which you are running the script. o The example after the paragraph following Table 9.4 is not correct:

MB_OKCANCEL + MB_ICONSTOP + MB_DEFBUTTON1 + MB_APPLMODAL

It should look like this:

MB_OKCANCEL OR MB_ICONSTOP OR MB_DEFBUTTON1 OR MB_APPLMODL o A new flag has been added for the MSGBOX statement and function.

It is:

Symbolic constant    Value     Description ---

MB_NOBEEP           32,768     Turns off the system beep that sounds when you choose an icon and its dialog box appears.

Page 501, OPTION BASE Statement
Additional Remarks:

The Microsoft Test OPTION BASE statement is different in    some ways from the OPTION BASE statement in QuickBasic and Visual Basic. In QuickBasic and Visual Basic, you can use OPTION BASE only once in a program. Also, you must use it    before any arrays are dimensioned.

The Microsoft Test OPTION BASE is a toggle switch. You can use it more than once. For example:

DIM array1(10) AS INTEGER 'Defaults to base 0 OPTION BASE 1 DIM array2(20) AS SINGLE OPTION BASE 0 DIM array3(30) AS DOUBLE

Page 501, OPTION INTEGER Statement
The OPTION INTEGER statement affects the output of the RND function and the TIMER function as follows:

If OPTION INTEGER is used, RND generates a random integer between 1 and 32,767. Otherwise it generates a random number between 0 and 1.

If OPTION INTEGER is used, TIMER returns a long integer containing the number of milliseconds since the system started. Otherwise, it returns a double-precision floating-point value containing the number of seconds since the system started. PART 1: Documentation Errata and Additions

b: Microsoft Test User Interface Editor User's Guide

Page 101, MSTLoadIcon Function Syntax
Add the following information to the paragraph that starts "icon ID is the resource ID number... ":

To get the resource ID number of an icon 1. From the Icons dialog box, select an icon. 2. Press F2. The resource ID number and the icon is displayed.

PART 2: New Dynamic-Link Library Procedures
The procedures in this section are "new" because they were created after the books went to press.

New TESTCTRL.DLL Procedures
o WLabelLen

Included if W_STATIC is defined.

Syntax: Declare Function WLabelLen Lib "TestCtrl.DLL" Alias "WLabelLen" (hwnd%) AS INTEGER

Returns: Length of associated label; zero if no associated label.

Comments: WLabelLen obtains the length of the associated label for the specified window. hwnd% is the Window to check. If zero, check the control with the focus.

hwnd% must be a child (WS_CHILD) and cannot have a    caption (WS_CAPTION). o WLabelText

Included if W_STATIC is defined.

Syntax: Declare Sub WLabelText Lib "TestCtrl.DLL" Alias "WLabelText" (hwnd%, lpszBuffer$)

Declare Function LabelText (hwnd%) AS STRING

Returns: Nothing.

Comments: WLabelText obtains the text of the associated label for the specified window. hwnd% is the Window to check. If hwnd% is zero, checks the control with the focus. lpszBuffer$ is the buffer for label text.

hwnd% must be a child (WS_CHILD) and cannot have a    caption (WS_CAPTION). Both of the above procedures can be used to determine whether a control has an associated label. WLabelLen returns zero if no label, and LabelText returns an empty string if no label.

o WListItem(action)Ex

Four new procedures are identical to their non-"Ex" counterparts, except for the added parameter ixOffset%.

Syntax: Declare Sub WListItemClkEx Lib "TESTCTRL.DLL" Alias "WListItemClkEx" (lpszName$, lpszItem$, ixOffset%)

Declare Sub WListItemCtrlClkEx Lib "TESTCTRL.DLL" Alias "WListItemCtrlClkEx" (lpszName$, lpszItem$, ixOffset%)

Declare Sub WListItemShftClkEx Lib "TESTCTRL.DLL" Alias "WListItemShftClkEx" (lpszName$, lpszItem$, ixOffset%)

Declare Sub WListItemDblClkEx Lib "TESTCTRL.DLL" Alias "WListItemDblClkEx" (lpszName$, lpszItem$, ixOffset%)

Comments: The value of ixOffset% determines where the item is clicked: = 0: item is clicked in the center of the item rectangle, zooming is performed to support File Manager-type list boxes. > 0: item is clicked at ixOffset% from the left of the item rectangle < 0: item is clicked at ixOffset% from the right of the item rectangle

New TESTDLGS.DLL Procedures
o SetMatchPreferences

Syntax: Declare Sub SetMatchPreferences (ExDlg%, FzDlg%, ExMenu%, FzMenu%)

CONST MATCH_TEXT    = 1 'Text CONST MATCH_CASETEXT = 2 'Text, case insensitive CONST MATCH_CLASS   = 4 'Class name CONST MATCH_STATE   = 8 'State CONST MATCH_STYLE   = 16 'Style CONST MATCH_RECT    = 32 'Rectangle CONST MATCH_ALL     = 63 'Match all

Comments: This procedure sets the criteria for a Test Dialogs comparison. The integer for each comparison type is some combination of the MATCH_ flags. The default state is equivalent to the following:

MATCH_ALL               'Exact, Dialogs MATCH_CLASS OR MATCH_STATE      'Fuzzy, Dialogs MATCH_TEXT OR MATCH_CASETEXT OR MATCH_STATE 'Exact, Menus MATCH_TEXT OR MATCH_CASETEXT      'Fuzzy, Menus o GetMatchPreferences

Syntax: Declare Sub GetMatchPreferences (ExDlg AS POINTER TO INTEGER,                        FzDlg AS POINTER TO INTEGER,                         ExMenu AS POINTER TO INTEGER,                         FzMenu AS POINTER TO INTEGER)

Comments: This procedure gets the criteria for a Test Dialogs comparison. The MATCH_ flags are the same as defined for SetMatchPreferences.

New Test Talk Procedures
o SetLanaNum

If you have more than one LAN adapter or protocol on your machine, you can choose which adapter or protocol to use when running Test Talk. Both Test Talk DLLs (TESTHOST.DLL and  TESTSTAT.DLL) contain this new procedure.

Syntax: DECLARE FUNCTION SetLanaNum(LNum%) AS INTEGER

Return Values: SetLanaNum returns TRUE if the lananum can be used; FALSE if not. If the function returns FALSE, it means either that there is no adapter or LAN protocol for that lananum, or that the adapter or LAN protocol exists and doesn't    support NETBIOS.

Comments: This function checks the specified lananum to see whether it    supports NETBIOS. If it does, then that lananum is used by    Test Talk from then on.

When the Test Talk DLLs load, they automatically search the first eight lananums (0 - 7) for the first one that supports NETBIOS. The first one found is used unless you change it by using SetLanaNum. o NetBIOSAvailable

This procedure is included in both TESTSTAT.DLL and TESTHOST.DLL. It  checks the first eight (0 - 7) lananums for the first one that supports NETBIOS. The first one found is used by Test Talk unless you change it with SetLanaNum. If NetBIOSAvailable returns FALSE, it means that no adapter or LAN protocol on the machine supports NETBIOS.

New TESTUI.DLL Procedures
MSTSysMenu

Included if either W_MENU or TESTUI is defined.

Syntax: Declare Sub MSTSysMenu Lib "TESTUI.DLL" Alias "MSTSysMenu" (hwnd%, iMenuType%)

Const MST_GLOBAL = 1 Const MST_APP   = 2 Const MST_WINDOW = 4 (only applies to User Interface Editor's                          test mode windows)

Comments: MSTSysMenu drops the specified sysmenu on the specified window. hwnd% is the Window to check. If zero, check the active window. iMenuType% is the Type of the sysmenu. It can be any one of the following: MST_GLOBAL MST_APP MST_WINDOW

If the window doesn't have the specified sysmenu installed, nothing happens. If the window has the specified sysmenu and it is not the active window, it is made the active window. MSTSysMenuExists

Included if either W_MENU or TESTUI is defined.

Syntax: Declare Function MSTSysMenuExists Lib "TESTUI.DLL" Alias "MSTSysMenuExists" (hwnd%) AS INTEGER

Return Values: The function returns a bit pattern:

bit 0    1 if a global sysmenu is installed bit 1    1 if an application-specific sysmenu is installed bit 2    1 if a window-specific sysmenu is installed

(NOTE: Bit 2 only applies to the User Interface Editor when in    test mode.)

Comments: MSTSysMenuExists determines if the specified window has an    MSTSysMenu installed. hwnd% is the Window to check. If zero, check the active window.

Examples: MSTSysMenuExists returns the following values:

Zero         If no sysmenus are installed. MST_GLOBAL(1)    If only a global sysmenu is installed. MST_APP(2)    If only an application-specific sysmenu is installed. MST_WINDOW(4)    If only a window-specific sysmenu is                    installed. 3         If both a global and an application-specific sysmenu are installed. o MSTLoadBitmap

Syntax: int = MSTLoadBitmap(bitmap ID, .RES file)

Return Value: MSTLoadBitmap returns hBitmap (the bitmap handle) which is used when calling MSTDestroyBitmap.

Comments: See MSTLoadIcon on page 100 in the Microsoft Test User Interface Editor User's Guide.

To get the resource ID number of a bitmap: 1. From the Sysmenu Bitmaps dialog box, select a bitmap. 2. Press F2. The resource ID number and the bitmap is displayed. o MSTDestroyBitmap

Syntax: MSTDestroyBitmap(hBitmap)

Comments: See MSTDestroyIcon on page 101 in the Microsoft Test User Interface Editor User's Guide.

Test Dialogs
o Converting Version 1.0 Files

Files created using version 1.0 are no longer readable by  Test Dialogs. To convert 1.0 files to 2.0 format:

1. Use the Test Dialogs user interface to create a new 2.0 file. 2. Use the new File.Convert 1.0 File command to import the contents of the 1.0 file. This converts the dialogs in the 1.0 file and appends them to the currently open 2.0 file.

It is better to recapture the dialogs using version 2.0, than to  convert them from version 1.0. Version 2.0 stores more information about dialog controls making it possible to accurately preview and export the dialogs. For this reason comparisons are more reliable.

For example, in 1.0 the coordinates for each control were saved relative to the screen, and in 2.0 they are saved relative to their parent. If the dialog is in a different screen location during comparison, the rectangles will still match, provided their position relative to the dialog window itself did not change. Also, style bits are now stored for the controls, allowing Test Dialogs to distinguish different controls within the same class.

In version 1.0, the following information was stored:

- Text (up to 256 characters) - Class name (to 32 characters). Menu items are of the class "MenuItem." - State: - for class BUTTON, 0 = unchecked, 1 = checked, 2 = undetermined - for menu items, return value of GetMenuState at time of capture - fVisible = TRUE if control is visible - fEnabled = TRUE if control is enabled - Rectangle. Screen-relative position and size of control (GetWindowRect at time of capture).

In version 2.0, the following information is stored:

- Text (up to 2048 characters) - Class name (complete, no enforced length limit) - Style bits: - for menus, this field is used to identify pop-up menus; contains the number of sub-menus in a pop-up menu - for controls and windows, this field contains the style bits - State: - for menu items, return value of GetMenuState at the time of capture - for controls and windows, this field is a combination of bits: 1 if the control is visible 2 if the control is enabled 4 if the control is a button and is checked 8 if the control is a 3-state button and is indeterminate - Font (for controls and windows only). Face name, height, and weight of font used to paint the control at time of capture. - Rectangle. Position and size of control relative to its parent. o Text Import and Export

You can create a text file in RC-like format, representing dialogs and menu structures. You can edit the text file using any text editor, and then import it into a dialog file using the import feature.

If you capture a menu and then remove items from it using the User Interface Editor, you cannot preview or export the menu. If you convert a menu from a 1.0 file, the converted menu won't be completely accurate. If there are second- or higher-level menus, they will appear as top- level menus. To fix this in import/export, do the following:

1. Create a text file. 2. Edit the text file to place the higher-level menu in a     pop-up structure. 3. Re-import the menu.

User Interface Editor
o Dragging and Dropping Icons

In the User Interface Editor, you can add icons to the .RES file by dragging them from the Preview window of the Icons dialog box and dropping them into the Icons list.

To assign an icon to an item, you can drag it from the Icons list box and drop it onto a sysmenu item in a sysmenu or onto an icon control in a dialog box.

Double-clicking to assign the icon still works as before. o Using the SPACE key with Icons and Bitmaps

In the User Interface Editor, pressing SPACE now acts just like double-clicking the left mouse button in the Icons/SysMenu Bitmaps dialog to assign icons to icon controls and sysmenu items. o New Check Box in "Arrange.Settings" Dialog Box

The "Arrange.Settings" dialog box has an additional check box:

Hide &UI-Editor while in test mode

The check box is selected by default. If it is selected, only the Test Mode Dialog or Test Mode Menu window is visible while in test mode. If not selected, UIEditor items are visible as usual.

This option prevents access to the properties bar 3D and Iconbar check boxes while in test mode. Therefore, a method was added to  select these check boxes if the User Interface Editor is hidden in   test mode. When you test a dialog, the following menu item is  added to the Test Dialogs system menu:

&View 3D 'Toggles 3D mode

If the dialog being tested has no system menu, and the User Interface Editor is hidden, then you cannot toggle between 3D and 2D.

For testing an MSTSysMenu, the following items have been added to the Test Windows system menu:

S&ysMenu 'Toggles from iconbar to sysmenu if currently iconbar &Iconbar 'Toggles from sysmenu to iconbar if currently sysmenu &View 3D 'Toggles 3D mode if sysmenu. Grayed if iconbar.

For testing an Application menu, no items have been added to the system menu. For testing any item, the "Close" system menu item for the Test Dialog and Menu Test window has been changed to:

&Design Mode Alt+F4 o Dialog Coordinates and Control Units

The coordinates displayed in the upper left of the User Interface Editor's properties bar were formerly displayed in dialog units. Now dialogs and controls are displayed in either "dialog units" or  "pixels." To change between the two, simply click with the right mouse button anywhere in the dialog you are editing.

Detecting a Disk in Drive A: or B:
The following example shows what happens for each statement, assuming that drives A: and B: exist, but there is no disk in either drive.

ON ERROR GOTO ErrorTrap print exists("A:") 'This works, since the drive really is there print exists("B:") 'This works, since the drive really is there chdrive("A:")     'This works, since the drive really is there print CURDIR$     'This fails and can be trapped OPEN "A:\temp.dat" for output as #1 'This fails and can be trapped close chdrive("B:")     'This works, since the drive really is there print CURDIR$     'This fails and can be trapped OPEN "B:\temp.dat" for output as #1 'This fails and can be trapped close end

ErrorTrap: PRINT PRINT ERRORS PRINT "The drive either does not have a disk" PRINT "inserted or the drive door is open." PRINT RESUME NEXT In summary:


 * 1) In version 1.0, a sysmodal dialog would have occurred on the CURDIR$ statement and the OPEN statement. This error ruins automated tests since it can't be trapped. This no longer occurs. You can trap and recover from these errors and your automated tests can continue unattended.
 * 2) If you are writing a program that must detect whether a disk is in the drive (a setup program, for example), you can do this by using CURDIR$ or OPEN, trapping the error, then prompting for a disk or taking other appropriate action.

RUN Statement/Function
The RUN function and statement have been modified to look in WIN.INI for file extensions. If you run an extension (for example, .TXT) that has an associated .EXE in WIN.INI, RUN will use the associated extension and pass the string argument to it as the command line.

NOT (!) Operator
Using the NOT operator (!) with any of the W(type)SetClass procedures makes no sense and can actually cause problems. Therefore, this operator is no longer supported, and will cause the following error if it is used with any W(type)SetClass procedure.

ERR_NOT_OPERATOR_NOT_ALLOWED = 33 The class name "NOT (!) operator" is supported only by WFndWndC and WFndWndWaitC.

Test Trap Additions, Corrections, and Changes
For information on Microsoft Test event traps, please see the file README.TXT in the V2SAMPLE\TRAPS subdirectory.

Using MS-DOS Boxes on the Novell Network
If you are using the Novell network and experience intermittent problems using an MS-DOS box, please change or add the following line in your SYSTEM.INI 386enh section.

[386enh] TimerCriticalSection = 5000 The SYSTEM.INI file is located in your Windows directory.

Test Talk Issues
o Procedures Fail when NETBIOS is not Available

The Test Talk procedurss now fail when NETBIOS is not available. There is no error message; the routines simply do nothing or  functions return FALSE. If Test Talk scripts don't appear to be  working, you can call NetBIOSAvailable to see if this is the problem. See the description of NetBIOSAvailable in Part 2. o Declarations are Not Included in DECLARES.INC

Including the precompiled header DECLARES.INC (built as part of the  setup process) in your script doesn't pull in the Test Talk declarations and constants. This is because several routines in  TESTHOST.DLL and TESTSTAT.DLL have the same names. To use Test Talk, you must $DEFINE either TESTHOST or TESTSTAT and include MSTEST.INC, rather than using DECLARES.INC. You can also build your own precompiled headers for the host and station scripts (one header  for host scripts and another for station scripts). o "Setup" Functions

Three functions in the Test Talk DLLs are considered "setup" functions:

NetBiosAvailable, SetLanaNum, and SetMachineName

You must call these at the beginning of your script, before you call JoinGroup. After you have joined a group, all three of these functions will return FALSE. While you belong to a group, you can't  change the lananum or machine name.

Callbacks as Parameters
If a script gives the address of a routine (a callback) to a DLL procedure, and that procedure takes SINGLE or DOUBLE parameter types, it is the caller's responsibility to pass those values by reference.

All TestBasic procedures expect their parameters by reference, which means a pointer to the data rather than the data itself. The only two exceptions are:

INTEGER and LONG, which are special cases to be passed by value from callbacks STRING, which is converted to a temporary variable-length string and essentially passed by value Incorrect use of parameters in callbacks will cause your script to crash.