Hacker’s Guide to Visual FoxPro
An irreverent look at how Visual FoxPro really works. Tells you the inside scoop on every command, function, property, event and method of Visual FoxPro.
FoxTools.FLL is a dynamic link library (DLL) that has been specially compiled to access the Visual FoxPro API. (For information on creating FLL files, see “Creating a Basic FLL Library” in the VFP Help). It includes some useful utility functions. Check out HOME()
+ “\TOOLS\FOXTOOLS.CHM” for additional details.
Starting in Visual FoxPro 6.0, many of these functions have been incorporated directly into the language and no longer require the FLL to be loaded. These include: ADDBS()
, DEFAULTEXT()
, DRIVETYPE()
, FORCEEXT()
, FORCEPATH()
, and the entire set of Just* functions. VFP 7 includes replacements for the Words() and WordNum() functions. However, FoxTools still contains several functions that make it useful, and we include this reference as an aid to those functions as well as to developers unfamiliar with FoxTools who need to maintain code from an older version.
Two functions within FoxTools allow Visual FoxPro applications to access and call functions built into dynamic link libraries (DLLs). The functions called this way may be part of the Windows native API, or they may be supplied by a third party. Any function that can operate when supplied with character and numeric parameters (structures cannot be created and passed from Visual FoxPro) can be run this way.
nFuncHandle = RegFn( cFuncName, cParamTypes,
cRetType, cLocation )
nFuncHandle = RegFn32( cFuncName, cParamTypes,
cRetType, cLocation )
Parameter |
Value |
Meaning |
cFuncName |
Character |
The name of the function. Note that many function names are case-sensitive. |
cParamTypes |
Character |
A list of the type of parameters accepted by the function, in the order they must be supplied. Parameters which are to be passed by reference need to be preceded with an "@" symbol. Acceptable types are: |
cRetType |
Character |
A single character, describing the type of the return value of the function. |
cLocation |
Character |
The name of the DLL containing the function. If the function is built into the core Windows API, WIN32API can be specified instead, which allows the same code to run on different Windows installations. |
The ability to access DLL functionality using FoxTools was important when introduced in FoxPro 2.5, but it has been superseded somewhat by the addition of the DECLARE-DLL command. However, DECLARE accesses only those DLLs that have been recompiled to work within the 32-bit environment in which Visual FoxPro lives. Older, 16-bit applications are accessible only through the RegFn()–CallFn() sequence.
Registering DLLs works the same way whether they are 16-bit or 32-bit. First the function must be “registered” with FoxPro: FoxPro must be told the name of the function, its location, what parameters it accepts and what it returns.
In VFP 3 on Win 3.1 installations, RegFn() calls 16-bit DLLs; on 32-bit installations (WinNT and Win 95), RegFn() can also access 32-bit DLLs. RegFN32() always uses 32-bit DLLs. We recommend the use of DECLARE-DLL if you can be sure you’re accessing a 32-bit DLL, and RegFn() otherwise.
One last note: If you’ll be calling 16-bit functions using RegFn() from the 32-bit platforms, make sure DDEReg.EXE is included in your distribution disks, because this provides the mechanism to communicate with 16-bit DLLs. For VFP 3 running under Win32s, you’ll need to include the file Fll32_16.DLL instead.
RetVal = CallFn( nFuncHandle, Param1, Param2, ... )
Now that you’ve gone to all the trouble of declaring the function, invoking it is pretty straightforward. Use the function handle returned to you from the RegFn() function as the first parameter to tell CallFn() which function it should be accessing, then pass the number and type of parameters specified in the RegFn() function. The return value you receive should be of the type specified.
* Resource. PRG - Displays free system resources
SET LIBRARY TO home()+"FOXTOOLS" ADDITIVE
nGFSR = RegFn('GetFreeSystemResources', "I", "I", "USER")
? "System Resources ", CallFn(nGFSR,0)
? "GDI Resources", CallFn(nGFSR,1)
? "User Resources", CallFn(nGFSR,2)
These functions modify a supplied drive, path, file name and extension to return only a portion of the supplied information or force a specific format. Almost all of these functions were added to the language in VFP 6. In the following and the other tables in this topic, those functions included directly within VFP are marked with an asterisk.
Function |
Parameters |
Purpose |
AddBS* |
cPathAndFile |
Returns the string with an ending backslash, if one isn't already present. |
CleanPath |
cPathAndFile |
Makes a best guess at the correct path and file name, removing invalid characters. |
DefaultExt* |
cPathAndFile, cExt |
Appends file extension cExt to cPathAndFile, if no extension is present. |
ForceExt* |
cPathAndFile, cExt |
Forces (appends or replaces) the specified extension onto the file name. |
ForcePath* |
cPathAndFile, cPath |
Forces (prepends or replaces) the specified path onto the file name. |
JustDrive* |
cPathAndFile |
Returns just the drive letter. |
JustExt* |
cPathAndFile |
Returns just the extension. |
JustFName* |
cPathAndFile |
Returns the file name with extension. |
JustPath* |
cPathAndFile |
Returns the path, with drive if supplied. |
JustStem* |
cPathAndFile |
Returns the file name without a path or extension. |
ValidPath |
cPathAndFile |
Determines whether a drive, path, file name and extension could be valid, following the rules of DOS file and path naming restrictions. Does not test for the existence of the path or file. Does not work with operating systems that support spaces in path names. |
These functions provide access to the Windows clipboard, to determine the format of the information saved there and manipulate it. Use these functions to examine the contents of the clipboard and request the data in a specific format, or to register the format your application uses to post data onto the clipboard. These can be handy especially if you are using Fpole.DLL to transfer data to and from your application.
Function |
Parameters |
Purpose |
CloseClip |
none |
Closes the handle opened with OpenClip(). |
CountClipF |
none |
Returns the number of different formats in which the information on the clipboard may be requested. |
EmptyClip |
none |
Empties the clipboard. |
EnumClipFm |
nIndex |
Returns a number corresponding to the format in which the clipboard contents may be requested. See the Windows SDK documentation (WinUser.H) for details. |
GetClipDat |
nFormat |
Retrieves a handle to the current clipboard data in the format specified by nFormat. |
GetClipFmt |
nFormat |
This is supposed to retrieve a custom clipboard format name, but it is way too deep into the weird Windows way for us to follow. If you really need to use this function, we recommend you plow through the Win32 SDK for help. |
IsClipFmt |
nFormat |
Returns a logical response to the query of whether the clipboard contents can be rendered in the specified format. |
OpenClip |
nWndHandle |
Opens the clipboard for manipulation by the other functions listed here. We recommend passing MainHwnd() as the argument. |
RegClipFmt |
cFormatName |
Allows you to register a custom clipboard format, use it to render data into the clipboard and later extract it. |
SetClipDat |
nFormat, cData |
Allows storage of data to the clipboard in the format specified. |
Functions for doing some useful things with string manipulation. Two of these functions were added to the core product in VFP 7, though their names were changed (to protect the innocent?) in the process.
Function |
Parameters |
Purpose |
NextWord |
cText, nPosition |
Returns the first word or word fragment starting at position nPosition in the supplied character string or memo field, optionally ending at the specified word delimiters (in addition to space and tab). |
Reduce |
cString |
This function is documented as a means to replace repeated occurrences of cCharacter in cString with a single occurrence. It will, as long as cCharacter is a space (or omitted and allowed to default to a space—also undocumented). If it is any other character, all occurrences of that character are obliterated and replaced with spaces. Blech. You can write better. |
StrFilter |
cString1, cString2 |
Removes all the characters from cString1 not in cString2. We can do the same thing with STRTRAN() or SYS(15), so we see no particular advantage to this function. |
WordNum* |
cText, nIndex |
Returns word number nIndex from the supplied character string or memo field. Starting in VFP 7, you can use the native GetWordNum() function instead. |
Words* |
cText |
Returns the number of words in the supplied text. Starting in VFP 7, you can use the native GetWordCount() function instead. |
These functions allow access to the internal editing and Windows functions of the Visual FoxPro editor. They start with _ED and _W and are documented, not in FoxTools’ Help file, but rather in the main Help file supplied with FoxPro.
A plethora of other functions got tossed into FoxTools, because someone needed them or asked for them.
Function |
Parameters |
Purpose |
DriveType* |
cDriveLetter |
There's one difference between the native VFP command and the FoxTools function for earlier VFP versions: If the drive does not exist, VFP 5 and earlier return 0. VFP 6 and later versions return 1. In all other cases, both functions return the type of drive specified: 2=diskette, 3=hard drive, 4=network or removable, 5=CD-ROM, 6=RAM disk. |
FoxToolVer |
none |
Returns the version of FoxTools, "3.12" for Visual FoxPro 3.0b, and "6.00" for VFP 6.0 and later. |
GetFileVersion |
cFileName, @ArrayName |
Introduced in VFP 5, superseded by the more useful and native AGetFileVersion() in VFP 6, this function returns version information for a file. |
GetProStrg |
cSection, |
Equivalent of Windows API GetProfileString. See the entry DECLARE-DLL for a detailed study of this function. |
MainHwnd |
none |
Returns the window handle of the main FoxPro window required by many Windows API functions. Starting in VFP 7, you can use the hWnd property of _VFP. |
MkDir |
cDirectory |
Creates a directory. "Included for backward compatibility"—use the Visual FoxPro MD command instead. |
MsgBox |
*numerous* |
See the FoxTools documentation for all the parameter variations. Also, see the MessageBox() entry in the Reference section for an explanation of when to use this function rather than MessageBox(), and a description of the undocumented SYSTEMMODAL option. |
PutProStrg |
cSection, cEntry, cValue |
Writes an entry to Win.INI in the format cEntry=cValue. See the discussion in DECLARE-DLL for good reasons not to use this function. |
RGBComp |
nRGBNumber, @nRedColor, @nGreenColor, @nBlueColor |
Returns the values of the three Red, Green and Blue colors from a single color number you get back from a function like GetColor(). |
RmDir |
cDirectory |
Removes a directory. "Included for backward compatibility"—use the Visual FoxPro RD command instead. |
Many of the functions have been included within FoxTools because they are used in the programs that come with Visual FoxPro—programs such as AddLabel.App, Browser.App, Builder.App and Convert.App. These functions can be included within your own programs, provided that you bundle FoxTools with your application. Note that FoxTools.FLL must actually be included on the disk, and not bound into your APP or EXE, in order to be used.
? FoxToolVer() && Returns "6.0"
* Throw some text into the clipboard and see in what formats
* it can be pasted into another application.
_CLIPTEXT = "Hey!"
NOTE: The results you see will vary by platform, but these ;
should give you an idea of what to expect.
? OpenClip(0) && returns .T.
? CountClipF() && returns 3 (formats)
? EnumClipFm(0) && returns 1 (CF_TEXT)
? EnumClipFm(1) && returns 16 (CF_LOCALE)
? EnumClipFm(16) && returns 7 (CF_OEMTEXT)
? CloseClip() && returns T.
? Reduce("1 2 3") && returns "1 2 3" (single spaces)
AddBS(), AGetFileVersion(), Declare-DLL, DefaultExt(), DriveType(), ForceExt(), ForcePath(), GetColor(), GetWordCount(), GetWordNum(), hWnd, JustDrive(), JustExt(), JustFName(), JustPath(), JustStem(), MD, MessageBox(), RD, Set Library, StrTran, Sys(15)