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.
This function gives us the ability to turn off the dialog boxes that hang our EXE servers, so that we can trap problems with the error handler instead.
nSetting = SYS(2335 [, nNewSetting ] )
Parameter |
Value |
Meaning |
nNewSetting |
Omitted |
Returns the current setting of SYS(2335), in VFP runtime only. In the development environment, returns the empty string. |
0 |
Unattended mode. If a dialog attempts to force your EXE into a modal condition, an error (number 2031, "User Interface operation not allowed at this time") is generated instead. |
|
1 |
Normal mode. This is the default, where dialogs can interrupt the operation of your application. |
|
nSetting |
Empty String |
Returned in development mode. |
"0" or "1" |
Returns the current mode of the EXE—not the previous mode, but the mode after the SYS() function has been executed. |
Ted once wrote a Remote Automation server, and had lots of problems trying to figure out why the process kept hanging after some modifications to the code. It turned out, if you watched the task bar while starting the server, a task named “Open” would appear, but there was no way to activate that task, no way to bring it forward, nothing to do but halt the task. Finally, after some detailed code review, the line SET HELP
TO was found, which of course does not SET HELP
off, but rather tries to SET HELP
to the FoxHelp file. Since this was a production machine with no such file, a friendly FoxPro locate dialog would appear. However, since this was a Remote Automation server, it had no interface. Hang city.
SYS(2335) allows us to avoid all that trouble. If you are developing COM EXEs and want to make sure they don’t attempt to create a dialog, hanging your server, set SYS(2335) as soon as possible in the code that starts your server.
SYS(2335) reports that a DLL starts out in mode 1, but that is incorrect. An attempt to start a dialog within an in-process DLL always fires an error 2031. We think SYS(2335) should report that you are in unattended mode. Instead, you need to check both this function and the StartMode property to determine if your application has started as an EXE or DLL. |
lnOldMode = SYS(2335) && preserve the old mode
lnNewMode = SYS(2335,0) && and set it as desired.