Running Old Applications under Windows 2000, NT
|Latest Rev: Jan, 2006.
| 1. Please do NOT copy these
notes, nor any associated files, from
here to any other public
website, newsgroup, etc. Just refer to or link to the notes here. That way,
all of us can always locate the up-to-date details.
2. On the same basis, we hope that these notes are not
duplicates of similar info elsewhere. If you notice such duplication, please
let us know.
3. These notes generally refer to XP, but most (if not
all) comments apply to W2K also, and a few comments apply to OSes prior to
4. These notes assume the latest Service-Packs and all
major patches have already been applied to the OS.
5. Regarding XP: very many XP tips suggest that XP-Pro
is significantly better and more stable than XP-Home. These notes assume
6. Some of the following segments are "technical". If you
think sections are badly written, let us know, and we'll gladly try to
improve them. If some items relate to your needs, but are "incomprehensible"
(though, hopefully, accurate!), then perhaps you should request your IT
folk(s) to investigate.
7. If you notice any errors/omissions/incompleteness,
etc, we will gladly update accordingly. Thank you.
|For good information, please first refer to the
following articles, and search the 'net for similar essays:
Apps Find a New Home On Windows XP, by Brian Proffit (PC-Mag).
legacy applications feel at home in Windows XP, by Faithe Wempen
3. Microsoft Knowledge Base (KB) Article
[Q]279792: HOW To: Enable Application Compatibility-Mode Technology in
Windows 2000 SP2 and SP3.
4. Also the following MS KB articles:
303528, HOW TO: Keep a Jet 4.0 Database in Top Working Condition
296264, Configuring Opportunistic Locking in Windows
129202, PC Ext: Explanation of Opportunistic Locking on Windows NT
148367, Possible Network File Damage with Redirector Caching
142803, Locking Error or Computer Hangs Accessing Network Database Files
174371, Possible Database File Damage When Data Is Appended
124916, Some Client Applications Fail When Writing to Windows NT
126026, Server Optimization in RFCB Caching
219022, Improving Performance of MS-DOS Database Applications
161504, PRB: "Error Reading Drive" with Windows NT 3.5 as Server
169608, Occasional File Corruption When Using Unbuffered I/O
165403, Windows 95 Update Prevents Sending Clear-Text Password Over Net
321733, "Delayed Write Failed" Error Message When You Write a File to a
812937, (XP bug), File Lock or Access Denied Error Message When You Save
Files Over the Network
330174, (XP), "Delayed Write Failed" !!!
293842, (2K), "Lost Delayed-Write Data" !!!
811492, (XP and W2003 DEL-timeout bug), It May Take 35 Seconds to Delete
Files over the Network
314106, Troubleshooting MS-DOS-based programs in Windows XP
163525, Delay when saving Word file to Windows NT 4.0 server. (Op-Lock
issues with MS-Office products!!!!).
249799, Slow Network performance with SP 4, 5, 6, or 6a (Windows NT
4.0). You must install SP 6a anyway, and then contact Microsoft for updated
281672, Possible data loss after you enable the "Write Cache Enabled"
feature on Hard-Disks (Windows 2000). BUT, check the SuperBase notes
here, especially down near the end of the page, which discusses the
"automatic (?)" enabling of "Write-Caching", even after it has been manually
And many others!!!!
5. MS KB article
321169, re Slow performance when copying files from XP to a W2K Domain
these notes also at SmallBizServer.
6. An excellent Delphi-Magazine article is
here, and covers Paradox File-Corruption issues, Op-Locks, etc.
7. Some Op-Locks notes by the SuperBase folks
8. MSDN essays on Opportunistic Locks.
9. Super notes on bugs in W2K, possible patches/fixes,
etc, at Djgpp_w2k and
(DJGPP is a FREE highly recommended C/C++ development environment, to
produce MS-DOS/MS-Windows/Linux-DOSEmu apps; see
Delorie). Maybe Off-Topic, but a Free PASCAL system is available at
FreePascal.org, and is slated as a clone of TP 7 and is similar to
This seems to be an excellent source of Networking notes, and has much info
on Novell software, updates, KB essays, etc.
11. Axcel21.Very well known
and highly recommended site.
Brinkster.com/ivanf (beware some of the humour !!).
13. Is-it-true has massive
and excellent XP/NT/W2K tips.
Samba/docs/man has excellent details on Samba (file server running under
Linux for MS clients), especially
a section on Op-Locks, Damaged lock files, etc.
NtCompatible is a busy site.
Registry Settings, Op-Locks, Write-Cache & Flush-Buffers under
|You are advised to make all the Registry edits
as documented in the above references, and in various
relevant Paradox FAQs, newsgroups postings, etc. The important references
include Disabling Opportunistic-Locking and Write-Behind Caching. Some users
report no unusual problems when some or all of these updates are NOT
applied, and some suggest that performance might be reduced somewhat with
some of the updates. However:
most of these suggestions come directly from Microsoft
most apply to all types of shared data-bases, and not
just Paradox apps.
My overall opinion is that it's better to make all the changes.
For simplicity, refer to the following steps and to a Registry file which
1. If you don't understand exactly what we're doing here,
then please do NOT proceed. Seek assistance from an IT person who's familiar
with Registry updates...
2. Run these steps at your own peril!!
REG file. Unzip. Check that all entries in it are reasonable, and that
the file is not corrupted.
4. Feel free to insert additional entries, or remove some
of the suggested entries, if appropriate. And, making the suggested changes
may reduce performance a little on your systems... you must make the final
5. Just in case some problems arise while you're trying
to apply the supplied REG file: There are different versions of RegEdit;
W98SE uses RegEdit ver 4.x and XP uses ver 5.x. However, it seems that the
XP version accepts REG files written by ver 4.x, but 4.x does not accept 5.x
formats. Further, it seems there are just a few differences in the REG
Remove the comment-lines in the file, if your copy of RegEdit
blows up on them they begin with a semi-colon.
W98SE uses a header (line-1 of the Reg file) of REGEDIT4 (which
is in the supplied file). XP (SP1) normally writes and reads a header of
Windows Registry Editor Version 5.00, but it also accepts the W98SE
From some tests, it seems there are some minor syntax changes in
the REG files; sometimes Double-Words and 4-byte Hex values retain their
exact identities, and sometimes each might appear as the other (with the
individual bytes reversed, as expected). Technically, these two formats are
usually equivalent, so perhaps there is no significance to these syntax
Finally, the REG file must end with a blank line otherwise the
end-entry is not imported...
6. Perhaps print the REG file, and go through all the
entries in it, noting the current settings in your Live Registry. That way,
you can easily reset to the old values, if anything goes wro...
7. Make a backup of your live Registry files. (This is
documented in the Windows Help systems).
8. Click on the final (!) REG file to automatically
import it into your Registry using the RegEdit/RegEdt32 utility. This
option might be disabled in your system; if so, you might try a right-click
on the Reg file, and select the Merge option. Or seek assistance from your
9. Verify (very carefully!) that all the required updates
have been made to your Registry.
10. You should make these changes in all client-PCs, and, where
possible and appropriate, in all your file servers.
11. You'll probably have to re-boot to activate the changes.
12. If your Registry is not updated correctly, then restore
your backup, and investigate further...
13. From time-to-time, I suggest you check back on the website,
to retrieve the latest rev of the REG file.
If these REG updates won't apply automatically, you'll have to implement
them manually, using RegEdit/RegEdt32. And with Great Care!. (If updating
the DiscardCacheOnOpen parameter manually, select a data-type of BINARY.
If updating the OpLockBreakWait parameter, note that the HEX value of 23
(seconds) corresponds to a decimal value of 35).
If the REG file works well for you, perhaps you should update the startup
programs in your apps to ensure that the stated settings are always in the
live Registry just in case some other apps decide to alter them later
or, perhaps better, to always force the above stated values...
I've seen some conflicting advice on some of these registry updates, and the
suggested settings may contain redundant values. Eg, the Linkage entries
are sometimes listed as belonging INSIDE the Parameters Key, and sometimes
listed as at the SAME level as the Parameters key.
Netware Server: The REG file contains SOME Netware recommendations
(at the end of the file), but, alas, only SOME!! If you're running Netware,
you'll probably have to try to make additional Registry updates manually -
check on the Novell website (at least
here). I have not verified the exact spelling of the "Name" of each
entry (both in the Netware entries in the REG file, and the reg entries
listed below). It's likely that you'll find access to many of these entries
through Netware Config menus - but perhaps it's still worth checking using
The nasty issue arising here is that, on XP (and perhaps W2K/NT), users
cannot add a Key directly under [HKLM]. Normally, this is a "permissions"
issue in RegEdt32, and can be easily changed by an "admin" user
right-clicking the relevant "key", and modifying the permissions. But not,
seemingly, directly under [HKLM]. As far as I know, there is no "normal" way
to create such keys!! Therefore, the subkey of \NETWORK\ cannot be easily
added to a registry under [HKLM], and therefore the various "values" listed
below cannot be created. I have no solution. You might look at a Registry
utility by Frank Keyne named
RegDACL. Or, you
might just "hope" that your Netware drivers do not rely on any of the
following registry values!!. I think these key-creation problems do not
arise under older versions of Windows:
Note-1: the following reg-entries alre already in the REG file, but
they appear only as "comments". If you know that your OS will accept subkeys
under [HKLM], then, for convenience, you can simply un-comment the set of
entries at the end of the REG file, and import the entire REG file.
Note-2: for DWORD entries, 0=Off/No, 1=On/Yes. For STRING Values,
the GUI may show the entries as ON/OFF, Registry uses YES/NO.
[HKLM\Network\Novell\System Config\NetWare DOS Requester], a STRING
value Name of "CACHE WRITES" should be set to "OFF" (default = ON/YES).
[HKLM\Network\Novell\System Config\NetWare DOS Requester], a STRING
value Name of "TRUE COMMIT" should be set to "ON" (default = NO/OFF).
[HKLM\Network\Novell\System Config\NetWare DOS Requester], a STRING
value Name of "DELAY WRITES" should be set to "OFF" (default = NO/OFF).
[HKLM\Network\Novell\System Config\NetWare DOS Requester], a STRING
value Name of "FILE CACHE LEVEL" should be set to "0" (default = 3, Range =
[HKLM\Network\Novell\System Config\NetWare DOS Requester], a STRING
value Name of "OPPORTUNISTIC LOCKING" should be set to "OFF" (default =
Corrections to the REG file are most welcome!
Many thanks to Dr. Andrew J Stevenson for inquiring on the
Win95Truncate[D]Extensions entry. I now think BOTH values are needed
(Win95TruncateExtensions and Win95TruncatedExtensions) web searches throw
up info on both settings.
Warnings: A few of the suggested registry edits have been discussed
many times on the Paradox newsgroups. Usually, some of the Registry Keys are
stated, with the suggested Values. However, over the past few years, some of
the keys have been consistently mistyped in the NG postings. Presumably,
someone got it wrong originally, and then others merely re-posted the
incorrect messages.... etc.... Furthermore, many of my recommendations have
never been mentioned on the Paradox NGs, AFAIK. Is this because they do not
apply, or because..... So, if readers simply followed the instructions in
these NG messages especially the incorrect ones then they have NOT
implemented the recommended precautions. NOT SMART!!. If there is a
possibility that YOU implemented incorrect or incomplete instructions, then
I respectfully suggest you run the above procedure anyway to be sure
to be sure!!
Windows-2000/XP Write-Caching: An additional setting should be
checked for each appropriate Hard-drive. Presumably, this should be applied
to all Server and all Shared (P2P) Drives. Maybe it's not as important on
Drives which hold only temporary files... such as Local drives... but some
technical folks would advise that ALL drives (involved in shared-database
apps) should have Write-Caches disabled. Unfortunately, I cannot build these
updates into another simple REG file, because the keys depend on your
hardware. So, you'll have to proceed as follows (the following sequence
applies to XP you'll notice that a few of the steps don't arise under
1. Start; Control-Panel; System
2. Select Hardware
3. Click on Device-Manager
4. Expand the Disk Drives list
5. Right-Click on the relevant drive
6. Select Properties
7. Select Policies
8. Un-Check the Write-Cache option
10. Repeat from step-5 for other relevant drives
11. Save; Exit.
Windows-NT/2000/XP Flush Buffers:
MS-KB article 224922 discusses shared database access, data-integrity,
OpLocks, etc, and recommends that app developers should flush file buffers
at any time that represents delineation of a transaction. This can be done
by calling the Win32 FlushFileBuffers API Call.
Copying data to/from a TCP Server:: See
KB 823764. "Slow Performance Occurs When You Copy Data to a TCP Server
by Using a Windows Sockets API Program". One solution is to manually
add/change a registry entry. These entries are NOT in the OpLocks.Reg file
(because the entries contain GUIDs), so you'll have to make the change
W2K: TcpDelAckTicks; Reg_DWord = 0
W3K/XP: TcpAckFrequency; Reg_DWord = 1
|Check the Samba documentation mentioned
above. Chapter 14 includes recommendations and notes on
how to disable Op-Locks on the Samba server, how to recover from Lock
It's essential to use recent Samba builds, because older versions had issues
regarding full Windows compatibility, etc.
DNS and WINS must be configured correctly also.
Michael Lueck (of LDS) has a
presentation on Samba-PDC, which is mentioned frequently on
the NGs, and which is highly recommended.
Long Delays when Printing - System.ini:
|A: If you experience long delays before spooled
reports start printing, perhaps you should update the SYSTEM.INI file.
Please refer to a full explanation written by Dave Porter. Until I have a
reference to Dave's notes, here's my shorthand version:
1. Open SYSTEM.INI for editing.
2. Check if there is a section headed [NETWORK]. If not,
create that head at the end of the file. (This section applies to the
3. In that section, insert a line: PrintBufTime=10
4. Check if there is a section headed [IFSMGR]. If not,
create that head at the end of the file. (This section applies to the
5. In that section, insert the same line: PrintBufTime=10
6. Save System.ini.
The above times are in Seconds, and control the delay between the end of the
generation of a spooled print file, and printing it. The default is 45
seconds. You may have to tweak the above values a little:
If the generation of all print files is fast, and there
are no long pauses during the generation process, then perhaps the values
could be even lower.
If the generation is sometimes slow, and, especially,
if reports are long, with long pauses during the generation process, then
you may have to increase the above values accordingly, so that printing does
not commence prematurely.
This matter is covered in some detail by Davide Guolo,
B: I've seen references to the following suggestion, but I've not tested it:
1. Run REGEDIT, and access
2. Locate the "LPT_timeout" entry, and reduce the value
to, perhaps, 2-5 (seconds)
C: If using the Capture command (in Netware) to control the allocation of
LPTn:, then use EndCap to release the print queue when it has been
generated, or access the Novell printer options and activate Auto-EndCap
(AU). Use "Capture /?" for more info.
|I've seen many references to problems with
Realtek NICs. Seemingly, the Drivers supplied by MS on the W98 CDs are
broken, as noted in MS KB 189778. The recommendation is to get updated
drivers from Realtek.
Path / "%PATH%":
|Watch out for Paths which are not acceptable to
the parser code in older DOS apps. Older programs might not understand
embedded spaces, embedded double-quotes, etc. And older parsers might blow
up on very long PATH statements.
In your BAT files, constructs such as: IF [%Path%]== GOTO ABC are not
processed properly in XP. Sometimes, where %PATH% is referenced, the
command-interpreter does not expand the syntax like it did in W95/W98, and
the operations either fail, or yield incorrect results. The only syntax that
I found acceptable is to use double-quotes in the above lines; eg IF
%PATH%==123 GOTO ABC.
|Also referring to BAT files, utilities like
CHOICE.COM are no longer supplied (in Windows\Command) with the newer OSes
like XP. You'll need to copy these from elsewhere (maybe some older MS OS
CD, or some MS resource-kit) into some accessable folder.
Alternatively, you might check out some interesting utilities from Bill
Stewart (BStewart@IName.com). Look at GetKey, GetKeyD, GetVar and GetVarD.
They are powerful and extremely well documented. And Free!. At
"&" in Folder-Names:
|The & character is the Continuation character
for CMD.EXE commands in W2K/XP, and is therefore now unacceptable in BAT
lines. So, an old folder-name like COM&EXE is not allowed. Change it to,
say, COM_EXE, and change all references in BAT files, Menu systems, etc.
"If Exist ...\NUL":
|Despite being recommended by Microsoft as a
method to check for the existence of a Folder, IF EXIST xxxxx\NUL is
problematic again under XP. (It was also broken under initial releases of
W95). I wasted very many hours trying to overcome this problem with BAT
syntax, and failed! I patched LesSpace to trap the internal execution of IF
EXIST NUL commands, and return the correct result to the BAT file. If your
BAT files rely on the IF EXIST NUL construct, and you cannot come up with
BAT lines which work, you may have to use LesSpace! Hint: you might also
check if BAT experts like Timo Salmi, Ted Davis (T.E.D.), etc, have a
|At least some versions of PKZIP don't run
successfully under XP. Steve Green has more details on
his website, where he suggests using the -3 command-line option.
|I think that all versions of Windows support
LPT1-3 well. And, usually, LPT4. However, as the port-number goes up
I have apps which were designed to use printers at LPT2-LPT6. Prior to
W2K/XP, the following approach worked very well:
When the app starts, use the CAPTURE or NET USE command
to Capture (Link/Match) the required LPTn port to the relevant named printer
In the app, copy the report to the relevant LPTn port
which then sends it to the appropriate named printer
Release the captured ports when the app closes.
LPT5+ had issues under W2K (The printer-status is returned as Invalid, yet
printing works well!).
Under XP, LPT6+ don't work properly (I've not investigated).
Discard the LPTn:/CAPTURE/NET-USE/COPY/RELEASE
Identify just the relevant Windows Printer-Names.
Use Copy Report-File-Name \\Server-Name\Printer-Name
(if the printers are normal LPTn-type devices), or
Use Print /D:\\Server-Name\Printer-Name
Report-File-name (for LPTn-type devices), or
Maybe try some some suitable Printing utilities such as
Peter Lerup's PrintFile, or
Davide Guolo's PrintFil.
CMD.EXE and COMMAND.COM:
|XP and W2K (and NT) have two
Command-Interpreters (shells), CMD.EXE and COMMAND.COM.
CMD is a newer true-32-bit native command-line shell
- with support for the older DOS commands. It is NOT a DOS Window. It
has a significantly extended Batch language, Long-Filename support, command
history (like DOSKEY), multi-threaded, drag-&-drop support, etc. It
recognises files with the normal program extensions, including .COM, .EXE,
.BAT, .CMD, .VBS, .JS, and .WS, and any other extensions that are defined in
the PATHEXT env-var as executables. But, interestingly, if it is passed any
file-name (with or without the file's extension), either at the
command-prompt, or in a BAT file, then CMD.EXE will examine the file
contents, and if it recognises it as executable, it will run it !!!!.
COMMAND corresponds to the old 16-bit shell, and starts
an NTVDM (NT Virtual DOS Machine). It cannot support long-filenames, for
example, does not set ErrorLevel after some commands, has the customary
memory restrictions, etc. It is available for compatibility with older apps.
Tests indicate that COMMAND internally calls CMD (for most functions!). It
uses the COMSPEC Env-Var to locate CMD.EXE. If this env-var is not
available, or if it cannot find CMD.EXE, then COMMAND.COM will just ignore
any DOS-type commands. To check that COMMAND uses CMD:
1. Close any Console windows.
2. Launch Task-Manager, observe
the Processes tab, and note that CMD and NTVDM are not running.
3. File, New-Task, enter
4. NTVDM will start.
5. If you run some slow task (eg,
DIR \*.* /s) in the COMMAND window, you'll notice that CMD will be run
I think DOS-like commands are executed as follows:
A DOS-Box is activated, from a shortcut, PIF file, BAT
If a command-interpreter is not required, eg, when
running a COM program, the program is activated.
For other EXEs, PIFs, CMDs (same as BAT, but processed
under CMD.EXE in NT/W2K/XP), BATs or COMs, either CMD.EXE or
NTVDM/COMMAND.COM is started, and this program eventually runs the required
To control many aspects of the execution of programs,
PIF files can be tailored as appropriate, as discussed below.
If a command-interpreter is activated, tests suggest that the older
COMMAND.COM is usually executed (eg, for BAT files). Some experts suggest
that CMD.EXE may be marginally better, and, because it is a more recent
product, it's use is generally recommended above COMMAND.COM. However, for
older apps, and if all parameters are configured properly, my tests worked
satisfactorily under COMMAND.COM.
You can usually control which cmd-int is used: eg, to
force execution under CMD.EXE on W2K/XP, you could insert CMD.EXE /C in
Icons/Shortcuts and at the start of BAT lines which call other programs or
other BAT files.
If all users have W2K/XP, the perhaps just force
CMD.EXE everywhere! (with CMD.EXE /C).
Obviously, if you use BAT files that must run on
various OSes (and where CMD.EXE is sometimes not available), and if you'd
like to exercise some control over which interpreter is used, then you have
You could build different BAT files for each OS, or
You could extend the BAT files internally to check for
CMD.EXE, and use it where it's available.
Otherwise, your BAT file must not have any dependencies
on the cmd-ints available; you're stuck with what's installed; you must plan
PdoxDOS PAL procedures (DO_RUN(), DOUBLE_EMBED(), etc) could be used to
Shell-to-DOS. They will seek CMD.EXE, and use it if available. They have
been tested (a little!) under W2K and XP, and have worked well so far...
I've seen some notes suggesting that:
XP defaults to the interpreter specified in the COMSPEC
variable. There are a few places where one might try to SET COMSPEC which
I've not investigated, so I don't know if this comment is true. Overall, I
think the statement is untrue.
Within a dox-box, COMSPEC can be checked to see which
cmd-int is active. From brief tests, I think this statement is also untrue.
For example, sometimes, if you open COMMAND.COM, and issue SET, you'll see
COMSPEC pointing at CMD.EXE !! Also, as mentioned already, COMMAND.COM uses
CMD.EXE to execute most commands, and uses the COMSPEC env-var to locate
CMD.EXE. So, for now, I do not know any reliable way to determine WHICH
cmd-int is activate but, so far, I've never had a pressing need to know
which cmd-int is running...
Microsoft has a good
KB essay on some NTVDM issues.
|I don't have a crystal-clear picture of all the
angles on the usage of these files in W2K/XP; I've stumbled over the
following issues... and some solutions which work...
These comments do NOT tell you precisely what to do; they're intended to
alert you to the issues you can then decide what's best for your
users/clients/apps... In these notes, I'll try to visualise a Complex site,
with lots of users, and all varieties of OSes. Your situations may be
I suggest that you configure the W2K/XP environment which applies to BOTH
CMD.EXE and COMMAND.COM. This involves tuning/creating PIF files, and
adjusting copies of AUTOEXEC.NT and CONFIG.NT.
W2K & XP have a file named _DEFAULT.PIF in the main Windows folder
(usually C:\WINDOWS\, but better to use %windir% or %winbootdir%, or
%SystemRoot%, as noted below). I think that this is used for all CMD.EXE
shells, if no other PIFs are available.
I think the _DEFAULT.PIF is NOT the default for COMMAND.COM, but I don't
know where it's default settings are held perhaps the Registry, or maybe a
file named NOCLOSE.PIF (?). However, you can just locate COMMAND.COM in
%SystemRoot%\System32, get at it's Properties, and adjust the settings. This
process will create (or update) a COMMAND.PIF file.
You might be in a position to configure the _DEFAULT.PIF and COMMAND.PIF
files to your apps needs. If so, you probably should delete all PIFs that
refer to your programs/BAT files, to ensure the default PIFs are always
(or, better, keep them in a safe Backup location, so that they can be
retrieved if ever needed).
However, if users run a variety of apps, with different PIF settings, then
you probably cannot meddle with these default PIF settings, and instead, you
must supply special PIFs tailored for your BATs/Icons/Shortcuts, etc.
Your app might have many BAT files, many EXEs, many COMs, etc. And, you
might have PIFs referring to some of these, and no PIFs for others. I assume
(but I've not verified) that the dos-box will seek PIFs for each executable,
and, where not found, revert to the parents PIF settings, and, ultimately,
to the _DEFAULT/COMMAND settings.
To configure any PIF file, access its Properties, and adjust them as
follows. NB: Many of thedefault settings are NOT suitable for PDoxDOS. You
MUST check all the relevant PIFs, perhaps changing to the following
Activate Close on Exit
Under Program/Advanced, change the references to the
CONFIG and AUTOEXEC files, if relevant. (See below).
Under Memory, set each of the memory settings to
AUTO, Uncheck Protected, and check Uses-HMA. Depending on whether and how
your BAT files use Environment space, you may need to set the Initial
Environment to AUTO, or you may need to set it to a desired value.
Under Screen, check Restore-Settings-at-Startup,
check Fast-ROM-Emulation, and check Dynamic- Memory-Allocation. (However,
I'm not certain that these are always the optimum settings ???).
Under Misc, Uncheck Always-Suspend, move the
Idle-Sensitivity slider towards the Low end, Uncheck Exclusive-Mode, check
Warn-if-still-Active, check Fast-Pasting, and check all the shortcut keys
Under Compatibility, check the
Run-in-compatibility-mode, and select W98 (or W95). (See separate note below
A QuickEdit option may be accessible that may have
to be set in a particular way to facilitate Mouse/Beep usage. See separate
Mouse/Beep section below.
Make any other desired changes (fonts, screen-saver,
etc), and Save.
Also, if the app runs too slowly, or pauses occasionally, some experts
recommend additional PIF changes:
Disable Compatible-Timer-Hardware in the active PIF(s)
(in the Advanced button)
Disable Idle-Detection in the PIF
For Printing, choose LPTn in preference to Parallel, if
this option is available in the app.
|W2K/XP also have default CONFIG.NT and
AUTOEXEC.NT files in the %SystemRoot%\SYSTEM32\ folder. I have seen comments
indicating that these files are used only with COMMAND.COM, and not under
CMD.EXE I have not checked. You can use just these default files for
running your DOS apps, or you can make special copies of them for each App,
with whatever location and name that you prefer, (as documented in the above
references). If you make separate copies of these files, then ensure that
the PIFs refer to the special copies as mentioned above.
You should check/change the CONFIG file:
You might want to activate the ECHOCONFIG command.
You might want to activate the NTCMDPROMPT command.
You might want to make other changes, add other lines,
You might want to use ANSI.SYS.
See the Win-9X notes a few lines down for other
You should check/change the AUTOEXEC file:
You might want to add a PATH statement.
You might want to change the defaults, delete/add
lines, set Env-Vars, etc.
Experts recommend something like SET PROMPT=$m$_$p$g,
to show the UNC name on LANs.
See the Win-9X notes a few lines down for other
But, also see separate note below re Env-vars.
CONFIG.SYS should probably include (assuming you use the relevant paths,
options, etc, as appropriate):
Device=C:\Windows\EMM386.exe NOEMS I=B000-B7FF
Maybe load ANSI.SYS.
Shell=C:\Command.com C:\ /P /E:2048
AUTOEXEC.BAT should probably include (within reason!):
LH Mode Con Codepage C:\Windows\Command\ega.cpi)
LH Mode Con Codepage Select=437
LH Keyb UK,,C:\Windows\Command\Keyboard.sys
NB: I tried similar lines in the above files under W2K/XP to configure the
environment, with limited success. Eg:
lh %SystemRoot%\System32\mode.com CON CODEPAGE
lh %SystemRoot%\System32\mode.com CON CODEPAGE Select=437
lh Kb16 UK,,%SystemRoot%\System32\Keyboard.sys
When COMMAND.COM was opened, the first 2 lines above always gave Bad
Command or Filename errors. I don't know why except that I've seen some
W2K notes indicating that the MODE utility has been changed a lot under
W2K/XP. The 3rd line seemed to run correctly !!
In your Start-Up BAT files, I strongly suggest you use some utilities to
ENSURE that your environment (Memory, Registry, Disk-Space, etc, etc) is
acceptable, before starting the main apps. Furthermore, when PdoxDOS itself
starts up, you should also run some additional tests on the environment. In
some W2K/XP tests which I ran (without these pre-tests active), Paradox
started up, but with NO (repeat NO!) extended memory, etc, etc. Unless the
app code checks these basic matters, it may not be obvious that the app is
running in an extremely restricted and compromised configuration.
PIF Compatibility-Mode: Another interesting one. The Properties of
any executable file, which, I assume, includes all EXEs, COMs, BATs, PIFs,
etc, include a Compatibility tab. This has a few settings, including a
Win-95 option, W98, etc. One interesting factor is that these settings are
NOT held within the PIF file (as applies to all other settings). They are
held in the Registry in [HKEY_USERS\ ????\ Software\ Microsoft\ Windows NT\
CurrentVersion\ AppCompatFlags\ Layers]. Which means that it's not so easy
to distribute an app with suitable Compatibility-mode settings already
prepared. You may need to advise the installer to set them manually. Also,
these settings apply to the PIF itself, as well as applying to the
BAT/COM/EXE file that the PIF controls. AFAIK, you can have X.BAT, which
runs X.COM, and X.PIF (which has the settings applying to X.COM).
Compatibility-mode options appear on the properties of X.BAT and X.PIF,
and can be set differently. If they are different, I don't know which one
gets priority. I suggest it's safer to use the same settings on BOTH tabs.
%windir% / %WinBootDir% / %SystemRoot% Env-Vars:
|Another issue relating to CMD.EXE vs.
COMMAND.COM: If you run SET in each, you'll probably see different
Environment-Variables. (I think the CMD.EXE vars are based on those accessed
from the Control-Panel, whereas those for COMMAND.COM are based on the
relevant AUTOEXEC file). Previous versions of Windows had a %windir%
variable to identify the Windows Folder. Under XP, it seems the more
appropriate var is %SystemRoot%. So, if you have some code that likes to
know the Windows Folder-name, you'll probably have to check for all 3 of
these env-vars, as shown in the sample Do_Run() PAL code.
|In W2K/SP, the set used for COMMAND.COM differs
from that used for CMD.EXE. So, if you want to assign special vars, or
extend the PATH var, etc, you'll probably need to adjust AUTOEXEC.NT and/or
any additional special AUTOEXEC files, AND the entries reached under
Control-Panel; System; Advanced, Env-Vars. In the later case, you have
access to System vars, and to vars for a specific user... Perhaps alter
the System ones, but YMMV (your mileage may vary!).
In some brief tests, it seems the PATH is sometimes still limited to a total
length of 127, but I've seen notes that a longer path can be built by
inserting a prefix of \\?\.
After making any changes, you should run your BAT file(s), include SET
statements where appropriate, and verify that your env-var updates are ok.
And, if all your systems support CMD.EXE, then Script files can use SetLocal
and EndLocal to simplify the use of temp variables.
Mouse BEEPs / Hangs under W2K / XP / Terminal-Services:
|Since W2K was released, the problems of using
the Mouse with older apps continues to be a work-in-progress. And some
BEEPs sometimes Hang! Hopefully all of you readers will contribute your
experiences, and we will be able to itemise the definitive
You MUST have all the latest SPs and major OS patches applied. At the time
of writing, these are at SP4 for W2K, and SP1 for XP.
Some messages on the NGs mention some never-ending BEEP problems under
W2K/XP. Under W2K (without -BIOS), I did encounter hangs where, for
example, a ValCheck (in PdoxDOS) fails. Normally, a short BEEP would be
issued, but in my tests, a hang occurred, probably just before or at the
start of the intended BEEP. It seems these Beep and Hang matters are
interlinked, and they suggest a problem with W2K/SP4 related to the internal
handling of the Keyboard port (which supports the beep also), and timers. No
similar issues were noted with XP.
Basically, Mouse movements in the above environments either
work properly, or
move the Mouse pointer (as used to Select a text-area),
but the normal input cursor does not respond, or
cause major crashes.
Sometimes BEEP never stops. I think there may be 2 factors here at least:
There's a well-known bug in the Paradox engine: If
SLEEP (not BEEP) extends over the period from just-before midnight to
just-after, then SLEEP won't stop. For this reason, a special PAL proc
should always be used instead of the standard SLEEP operation, to ensure
this condition cannot arise. (Example available on request). It's likely
that similar code is used within Paradox to implement the SLEEP and BEEP,
and maybe there is some connection with this bug in Pdox, and some BEEP
Over the years, the general advice is to use -BIOS.
But, in some environments, this causes Mouse-movements to Bomb (see table
below). However, if -BIOS is NOT used in the command-line, then sometimes
BEEPs will hang (Steve Green has
further details) or the system will Hang with no sound. Also, some other
users have reported better results generally under W2K/XP if the -BIOS is
omitted. ... work-in-progress.... However, so far, I think we simply MUST
use -BIOS, and then try to work around any remaining issues.
||Cmd or Command
||Y (or N)
||Select-text only; No app "Cursor".
||Generally OK; Might bomb on
||Generally OK; Might bomb on
||Select-text only; No app "Cursor".
||Select-text only; No app
||Generally OK; Might bomb on
It seems that a variety of factors influence the results:
Command-Interpreter: CMD.EXE or COMMAND.COM? I could
not get a COMMAND.COM DOS-box running reliably under W2K (probably due to
dual-boot problems), so the BEEP and MOUSE results are pending. I plan to
build another test-PC with W2K, and then hopefully complete the above
Full-Screen or Windowed: Windowed recommended (perhaps
mandatory!). Under Terminal-Services, the app should be locked into
Windowed. Unfortunately, Full-Screen normally yields better performance than
Windowed! For some interesting options on how to enable Full-Screen mode,
especially under VISTA, check
here - it discusses using an XP video driver, using a standard SVGA
driver, and using a DOS emulator, eg, DOSBOX.
QuickEdit ticked in the PIF file: If checked, the
Mouse can be used to select text, and cut/copy/paste it. The default XP
behaviour is to disallow QE. On the COMMAND.COM icon, this option is greyed
out, and unchecked. (Perhaps because COMMAND.COM never supported QE
functions?). Yet, when the icon is activated, to open up a dos-box, the
option is not greyed, and is initially checked. NB: to get at the default XP
setting of QE, use RegEdit to access HKEY_CURRENT_USER\Console, and set
QuickEdit to a Double-Word of 0 (default, disable), or 1 (enable). While in
this section of the Registry, you can also access the QE settings of all
-BIOS: Generally recommended, and others have
experienced BEEP problems when it is omitted....
"-NoRealHeap: Command-line option: I think it matters little, but maybe it
results in better stability.
For now, the highlighted lines in the above table seem optimal !! And
these suggest that W2K should be used as sparingly as possible !!
Windows 2003 Server:
|Dave Porter reports that this OS is much better
than W2K, and reports no problems with Beeps, Mouse usage, etc. It might be
interesting if someone were to check if the CMD.EXE, COMMAND.COM and/or
NTVDM.EXE tools could be lifted from W-2003, and run under W-2000 !!.
|I've seen recommendations that the Priv-Dir
should be emptied before or just when Paradox starts up. It seems to be a
good idea anyway, because temp-files are sometimes left in this folder after
crashes. I have a PAL proc to do this if anyone is interested.
If any ZZZ file is there from a prior crash, it should
be copied to some other safer place before the folder is cleared.
Any special CFG files should not be deleted.
Paul A (ID is HyperNoodle on the NGs) suggested some BAT lines:
Save the ZZZ file to ???
For %%i in (C:\Pdox-Pvt\*.*) do If /i Not
Del /f /q %%i
Poor performance with XP & W98:
|Very poor performance has been reported when
exchanging data between XP and W98 PCs. For much info, check Brian
Livingston's newsletters; especially
1. Replace old Hubs with Switches
2. Tune Anti-Virus software (don't scan ALL files see
3. Disable unwanted LAN protocols.
See separate note here on NIC settings.
If low speed is still an issue, maybe run some "traces" on the LAN, to help
identify the causes. Ethereal is
highly recommended, and is Open-Source, and Free! As well as logging traffic
in a wired installation, it can also handle some Wireless environments. See
the Ethereal website for full Docs. Preferably run it on a separate PC which
can log the traffic between a suspect client and the server. If "switches"
are used, Ethereal may not be able to see all relevant traffic, so you may
need to investigate the config and logging options in the switches (eg, port
mirror the relevant port on the switch), or perhaps temporarily install an
|Generally, the default settings in Anti-virus
Scan ALL files, each time they are accessed
Scan ALL emails as they are downloaded.
The consensus is that these specific defaults are not appropriate for shared
Scanning ALL files significantly degrades application
performance, and serves no useful purpose where database files contain no
executable code, and therefore cannot be infected.
And scanning all emails are they are downloaded can
also degrade performance, and seems pointless if the user will diligently
delete all suspect emails before they are opened. Also, I've seen
configuration problems where tools (which automatically intercept and
analyse emails) upset the standard email software, especially if the email
software is being re-installed, re-configured, or upgraded.
1. Configure the resident AV tool to scan ONLY files
(including emails) that can contain viruses. (In NAV, this is termed
2. When running a full Batch AV scan (perhaps weekly),
then ensure the AV tool is configured to scan ALL files.
3. Use some utility to review all emails before they are
downloaded, and delete all the rubbish there. (I use Magic Mail Monitor, a
free open-source tool from SourceForge.net, but there are many similar
4. Don't configure the AV tool to scan emails are they
5. If an attempt is made to open an infected email, the
resident AV utility should detect it, and alert the user.
|Seemingly, there are at least 3 different
algorithms in the various Microsoft OSes to shorten long-filenames to an 8.3
format. To avoid problems, the general recommendation is to ALWAYS use only
Further info at:
For WinNT/2000/XP, if you're getting errors related to 8.3 filenames, or if
you run any apps that require 8.3 support, then you should verify that the
8.3 naming feature is enabled:
Open REGEDIT (Start, Run, Regedit)
Navigate to: HKEY_LOCAL_MACHINE\ System\
CurrentControlSet\ Control\ FileSystem
The value of "NtfsDisable8dot3NameCreation" should be
If you have no "8.3" apps, then disabling the generation of 8.3 filenames
(by setting the above value to '1') is supposed to yield improved
LAN speeds at 100Mbs?:
|If some/all the NICs and some/all the
Hubs/Switches are capable of running at 100Mbps, it is strongly recommended
to check the actual LAN throughput. Some users have reported poor LAN speed
when the NICs and/or Hubs/switches were set to "Auto" - it seemed the
devices were spending significant time trying to negotiate the optimum
speeds. In some cases, forcing the speed to 100/Full-Duplex yielded
significant improvements. However, in other cases, this approach actually
decreased the LAN speed.
For NICs in individual PCs, the usual procedure is something like:
Select the NIC/Ethernet Adaptor, and hit Properties
Select Duplex-Mode, and set it to Full-Duplex
Select Speed, and set to 100Mbps
OR, set the speed to Auto!!
OK, Save, Exit
You should similarly check if there are features/options in your
hubs/switches to force them to Full-Duplex, and 100Mbps, and test each
"RETURN RETVAL" in Paradox-DOS:
|This burned me some years ago, and has not
been mentioned on the NGs (AFAIK), and arose again just recently in some
discussions with Steve Green.
If you're an expert PAL programmer (eg, if you're familiar with changing the
standard RETVAL definition to a global Array perhaps where you're trying
to return multiple values in a single RETURN statement), then just ignore
this note you know it all already.
Basically, I think a simple RETURN RETVAL statement should be used with some
RETVAL is a normal GLOBAL Variable.
RETVAL is automatically filled by very many PAL
operations, as noted in the PAL manuals.
RETVAL is also filled, automatically, by the RETURN
statement, if a value/variable/expression is included in the RETURN syntax.
(Long strings are truncated to 255, etc).
From a compiler viewpoint, I think the 3rd point above is odd...
RETURN (only) will leave the global RETVAL unchanged,
and as per it's more recent update.
RETURN XYZ will automatically copy the contents of XYZ
But, RETURN RETVAL ?: Assuming no complex intention is
involved, this is a strange statement, IMO, and maybe best avoided. Will the
system try to copy RETVAL into RETVAL? Hello?
If the CallING code is explicitly using the returned
value, then the RETURN statement simply must include the returned
Expression, and so-be-it if it's got to be RETVAL.
If the CallING code is not explicitly using the
returned value, then RETURN RETVAL and RETURN are always equivalent (I
think), and I would vote for the latter.
The general advice is to use or preserve RETVAL
immediately after it has been set, because subsequent operations, including
Calling any Proc, may change it.
MS / NOVELL Client (LANs):
|The general advice is that you MUST have
version 4.83 SP1 (or later) of the Novell-Client drivers. (I have not
confirmed that this advice applies only to specific OSes, eg, W2K and/or XP,
or to all versions of Windows). Currently, I do not have recommendations for
To check the version of the MS client (in W98):
Select the Network Adaptor
Driver File Details
Check the File Version, update if needed.
VREDIR / VNETSUP:
|On Windows 95 and NT systems, you MUST check
that VREDIR.VXD is at version 4.00.1116 or later, and VNETSUP.VXD is at
4.00.1112 or later. If necessary, download the latest versions from MS
(filename is Vrdrupd.exe).
|Recently (2004-2005 epoch !), some tech users
have composed excellent "Service Packs" and advice to update W98SE
installations. In general, these packs contain many/most of the Microsoft
fixes and updates, and also contain some 3rd-party add-ons. For excellent
advice, try Bob G's notes
here, or Axcel216's (or MDGx!) excellent site
here (general) or
here (specific). And check
out the latest "Win98SE-SP" at
High CPU usage:
|Numerous issues can result in very high CPU
usage. One which we've experienced recently (in XP) was caused by installing
a very large HOSTS file. In such cases, a special Hosts "server" service
should also be installed. If no precautions are taken, one of the SVCHOST
sessions grabs all available CPU cycles, apparently for periods of 20-25
mins! A recommended solution is to access the running "services", and to
stop and disable the "DNS Client".
Some CPU loading is caused by old 16-bit apps that are constantly polling
the keyboard, awaiting keystrokes. In these cases, this behaviour results in
no other apps getting any worthwhile CPU cycles, and the PC will seem to be
"hung". Obviously, the best solution is to change this software to NOT poll
the keyboard, and to release all CPU cycles until an actual keystroke occurs
(ie, intercept the Keyboard-Interrupt). If the software cannot be adjusted,
then the solution is to intercept this polling, pause it briefly (in
millisecs!), and yield these CPU cycles to other tasks. The topic is covered
in great detail here, where a highly
recommended software utility, TameDOS, is available. The subject is also
covered by Citrix,
here, and a few solutions are discussed - including DOSKBD and DPAKBD
(and TameDOS is also mentioned!).
All my tests of Paradox-DOS indicate that it does NOT constantly poll the
keyboard in the above fashion, and, therefore does not overload the CPU in
that manner. And, therefore, the above solutions are not relevant. So, if
PDoxDOS does seem to lock out the CPU, it suggests that other factors are
involved - eg, Anti-Virus/Spyware scanners, etc.
BDE - Latest Version (188.8.131.52):
|Use only the latest version. Download from the
Corel website (or from
here, or from anywhere!). BUT, before upgrading, ensure that the
manufacturers / suppliers of your BDE apps have no objections to using the
After upgrading, ensure all the BDE options are still
optimal, as noted in the next section.
To get the Version-No of the installed BDE: Start;
Settings/Control-Panel; "BDE Administrator"; Configuration; Object; Version
BDE - Optimal Config:
|Some basic notes / rules regarding BDE (for
optimum stability and speed):
- Ensure that "Opportunistic Locks" are Disabled on all PCs on which
the BDE is running, and on the servers (if the servers are running
Windows). See fuller details above.
- A special "NET Directory" should be created on the Server,
accessible to all BDE clients. It should be down at least 2 levels, eg,
X:\BDE\NET\. Use Control-Panel;
BDE-Config; Configuration; Drivers; Native; Paradox. It must be EXACTLY
the same entry on ALL BDE clients. For stand-alone apps, obviously, it
must be somewhere on the "local" PC. If you're changing this value, you
should first ensure that no BDE clients are running at that moment, and you
should scan all PCs (Server and Clients) for all old PDOXUSRS.NET (and
PARADOX.LCK and PDOXUSRS.LCK) files, and delete them. If they won't
delete for you, you may have to reboot the PC, and re-try the Delete.
- A special "Private Directory" must be defined in the apps also. It
should be on the Local disk, and should also be 2 levels deep: eg,
C:\BDE\PRIVATE\. It should
normally be empty.
- The "Block Size" defaults to 2048. Leave this, or increase it as
needed. See separate notes below.
- Start; Settings / Control-Panel; BDE-Config; Configuration; System;
Init - for the following items (thanks to Liz McGuire and others for
compiling many of these at
- "Language": "ASCII" ANSI, or whatever is appropriate.
- "Local Share" (default = FALSE). Change
to TRUE - ALWAYS!
- "Low Memory Usage": 32 (Default)
- "Max Buff Size" (default = 2048): 8192 (if 32MB RAM); 16384 (if
64MB), 32768 (128MB), up to 65536 (>= 256MB).
- "Max File Handles" (default = 48): leave at default, or
increase, up to 100 max. Run some tests to get the optimal
- "Mem Size" (MB; default = 16); 15 (if 32MB RAM); 35 (if 64MB),
(128MB), up to 192 (>= 256MB). (Ie, about 0.75 * "free" RAM)
- "Min Buff Size" (default = 128): 4096.
- "Shared Mem Location" (default = Blank): Recommendations to
set to 5BDE or 6BDE. (I assume these are Hex values).
- "Shared Mem Size" (KB; default = 2048): 6000 (if 32MB RAM); 14000
(if 64MB), 25000 (128MB), up to 60000 (>= 256MB). (Ie, about 0.25
* "free" RAM)
- [Other items left at default values]
- Of course, it's always possible that some other app might upset the
BDE settings at a later time. Therefore, it's recommended that you check
them from time-to-time, just to ensure they're not clobbered...
- A specially-modified DLL must be used to avoid the "4GB" blow-ups.
- In the properties of your BDE apps/icons, ensure that "BackGround
Suspend" is NOT selected. And perhaps check this from time-to-time,
to ensure it's still OK!
here for some commentary on Op-Locks, BDE settings, Paradox Data
BDE - Insufficient Space:
|Just like the older Paradox-DOS products, the
BDE also cannot handle large Hard-Disks - typically where over 4GB is free
in the partition. The internal calculations hit "overflow" conditions, and
the BDE incorrectly thinks that the free space is very low (or perhaps
negative), and it bombs with an "Insufficient Space" error. For solutions,
you should check on the BDE discussion groups, etc.
These links might also be useful:
http://qc.borland.com/wc/qcmain.aspx?d=7089. Discussions, some
suggestions for developers.
Delphi-based solution. Reputed to be inappropriate for some OSes, eg:
Rick Kelly has created an excellent generic
recommended "patch" to
eliminate the 4GB bug. Rick Rans composed usage instructions, and I supplied
a simple "hex patcher". It's best home is probably
here (Downloads, ""), so visit there for all
the latest on it. Meanwhile, I've a copy of the package on the
I was marginally involved in a 2GB/4GB discussion on the "Borland.Public.BDE"
discussion group, in which the main contributor, C.P., posted the following
message on Dec 16, 2006:
"Thanks, I actually saw that.
But, in investigating the Code Central 'fix', I found that Delphi users have
2 versions of GetDiskFreeSpaceEx available:
- One in Windows.pas, and
- One in SysUtils.pas).
Both versions of GetDiskFreeSpaceEx return 2 possible values for free space:
- the total free space on the path, or
- the free space available to the caller.
Depending on which GetDiskFreeSpaceEx version, which OS you're using, and
whether you're checking total free space vs. free space to/for the caller,
you'll get different results. I found the only way to get consistently
correct results was to use the SysUtils.pas version of GetDiskFreeSpaceEx.
1. The Windows.pas version of GetDiskFreeSpaceEx is the 'raw' API version
2. The SysUtils.pas version is a Borland version to deal with the fact
that some OS'es don't actually have GetDiskFreeSpaceEx in their API.
3. The Windows.pas version was only correct for Win2000/XP/2003 (but not
I don't have disk quotas turned on, on my SBS 2003 server.
With the Windows.pas version of GetDiskFreeSpaceEx, it always said there was
about 4000 petabytes of free space available to the caller, regardless of
OS. On Win2000/XP/2003, it gave the correct amount of 'total free space'.
(One WinNT/98 it always rounded 'total free space' _down_ to the nearest
4GB, so if there was 7 GB free, it'd say there was 4. If there was 3 GB
free, it'd say there was 0). I'm guessing that if I did have disk quotas
enabled, the free space available to the caller might actually show the
correct value on Win2000/XP/2003.
For the SysUtils.pas version, I got the same, correct values for all OS'es,
for both free space available to caller, and total free space. If I had
disk quota's enabled, I'd hope to maybe see differing values for free space
available to caller, but I haven't tested this.
BTW, my testing is done with a Delphi 5 app.
I'd like to know exactly what Rick Kelly's code looks like - especially if
he used Delphi. The Code Central patch was always checking the space
available to the caller using the Windows.pas version of GetDiskFreeSpaceEx.
So it thinks there's always 4000 petabytes free, which the patch will then
always report as 4 GB free. My suspicion is that Rick Kelly's patch is
probably directly using the Win32 API version of GetDiskFreeSpaceEx. And,
as a result may not get the correct results for free space on 98 or NT. If
he's only checking the free space available to the caller, it may also be
wrong on 2000/XP/2003.
I'm posting this in part because this stuff is a bit new to me (I don't
usually deal with the Win API). It's possible that I may have done
something wrong, but I'm pretty sure my testing of the 2 GetDiskFreeSpaceEx
versions is solid. There's type conversion going on between standard Win32
API (C) types and Delphi types. Maybe the problem is actually in Delphi 5,
and not the GetDiskFreeSpaceEx Win32 API? So, if Rick used some other
language, then maybe he wouldn't see what I saw."
[I've made marginal formatting changes to the above quote. At the time of
writing this note, I could not find the above message/thread via Google, so
I was unable to post a direct link to it. My view is that Rick's patch
should be OK in all environments, but this is not verified. I'll update the
above, if/when any clarity emerges].
BDE / Paradox - DB Capacity:
|(This is my summary, and is subject to
The maximum capacity of each table is determined by:
- the "Block-Size" of the table
- the size of each record (= width of each "row") in the table.
- the max no. of Blocks in a table - always 65,500 (approx).
"Block-Size" is a parameter among the BDE/Paradox options, ranges from 1k to
32k, and can be any of the following values:
1024 (1K) [64MB]
2048 (2K) [128 MB]
4096 (4K) [256 MB] (there's no 8k block-size, supposedly
because of reported bugs with this value)
16384 (16K) [1024 MB, 1GB]
32768 (32K) [2048 MB, 2GB]
The value within squared brackets is the maximum size of the data in a
table, for the stated Block-Size.
The block-size of each table is determined when the table is created:
- If the table is created "Manually", the Block-Size is taken from a
setting in the BDE config at that time. The block-size is usually either 1k
or 2k, which would allow for table(s) to be up to 64MB or 128MB.
- If the table is created "in code", eg, from a Query, the BDE will
decide on the Block-Size, and I think it's usually the biggest block-size of
all the contributing tables. However, note that some "Join"-type Queries
might initially generate huge volumes of data in temporary tables, and then
discard most of this data before delivering the final result table. In such
cases, the huge internal tables might exceed the available capacity
thresholds (and throw errors, or generate incorrect results), even though
the final result is well within the max limits!
1. I've seen notes somewhere that 8K block-sizes were "problematic", and
therefore that value is not supported. Furthermore, at the time of writing
this note, some Paradox-NG messages (esp. from Denn Santoro) suggested that 4K was stable, and
that 16K and 32K may have "issues" - in some situations. [Personally, having
been involved in the development of some similar low-level ISAM handlers, I
can understand "boundary" conditions arising when blocks are marginally
under or over or exactly at various thresholds. If 8K and/or 16K/32K
are problematic sometimes, then I'd guess it's possible that all values are
problematic under similar boundary conditions - except that, hopefully,
these boundaries occur very infrequently in real-life. The ultimate "test"
is to write "Soak" code, which bombards the database with random
functions and random data
(Reads, Inserts, Updates, Deletes), perhaps running for days-on-end. It must
separately record every action it performs, and remember the effect it
"should have" on the main database. Then, on demand, it can verify that the
database matches the data that "should be" in it - at that moment. If
not, retrace the activity until the bug is identified].
2. Some internal Paradox code, and (because BDE was built on earlier
Paradox functions), possibly some BDE code also, is not robust when
using Secondary-Indices into tables that contain over 32,000 (32,767,
actually) Blocks. Ie, tables that are more than half their maximum capacity.
If any records are held in the upper half of the available blocks, then the
Sec-indices are totally ignored, and Sec-Index performance collapses. The solution
is to ensure that tables with Sec-Indices never exceed HALF their capacity,
and, if it's likely to happen, then to increase the Blocks-size as needed.
(And TEST the increased Block-size!!)
3. Why not always use the MAX Block-size? Obviously, you must first
choose a block-size that's adequate for your databases. And then a
block-size that's stable. Finally, if this leaves you with a few block-size
options, you should check the speed of your app, with typical tables,
typical operations (inserts, deletes, searches, etc), and on typical
hardware (PCs, LANs, Servers). Not a trivial task - especially if an app has
50-100 tables!! You'll probably find that, in most circumstances, the
smallest (acceptable) block-size, per table, will deliver the best overall
The number of data-records that fit into each "block" depends, obviously, on
the size of each record, which depends on the fields (and bytes) in each
record... First, here's a list of field-types:
* = this data is stored externally, in the table's .MB file. A
field-header is stored in the main .DB table - it's 10 bytes + the size
(1-255) of the actual data that's held in the main table.
And there's always an overhead of 6 bytes per Block, and a block cannot
handle "split" records. Eg: if Record-size = 100, and Block-size is 2048,
then the max. no or records per block = Integer of ((2048-6) / 100) =
2042/100 = 20. And, in that case also, the max No. of records in that table
= 20 * 65500 = 1,300,000 (approx).
Examples - this table shows the max no of records (approx) that can be in a
table, with various Record-Sizes and Block-Sizes:
Other factors may also limit the theoretical maximum capacity of tables -
eg, specs of Secondary-Indices, "Packing", distribution of keys, etc....
And, if Block-sizes are changed, apps must be tested - some users have
reported issues with some Block-sizes...
Finally, if you have a table that's "maxing out" with it's current
block-size, and you want to give it some more headroom, then the normal
procedure is to do the following steps manually - or write special code to
- Change the BDE to the block-size you want
- Build a new empty table (it'll have that new block-size)
- Copy the data from the old table to the new one
- Activate the new table instead of the old one (keep a backup of the
- Reset the BDE - if needed.
BDE / Paradox - LockWise / NetDump / LockDump (and BDE
|These utilities are useful to analyse the NET
and LCK files, especially when problems arise.
LockWise is available from Al Breveleri, and can be downloaded from
NetDump and LockDump are on the
For details on all the low-level functions available in the BDE, check
"Lock file has grown too large":
Ensure that the app is designed to use at least 3 separate
folders/sub-folders: DATA, NET, and PRIV, and confirm that the app is
ACTUALLY using the assigned PRIV and NET folders! More specifically:
In Delphi, use something like:
:= ExtractFilePath(ParamStr(0)) + 'PRIV';
:= ExtractFilePath(ParamStr(0)) + 'NET';
In C / C++:
// szPath is the fully qualified path (not relative) to the PRIV directory.
// szPath is the fully qualified path (not relative) to the NET directory.
// hSes is the current session handle. This can be retrieved using the
BDE / Windows VISTA / Office 2007:
Some folks have reported that the BDE works
well under Vista.
One needs to be aware of the additional attempts in Vista
to control access to Folders, Files, etc, and therefore the
.NET file must be placed in a suitably accessible area. ALL Users must have
full access to this directory, and these permissions must automatically
apply (cascade) to all files and sub-folders in it. The same full-access
permissions must also be applied to all database folders - to allow full
shared access to the .LCK files, as well as to the data files.
To Config BDE under VISTA, choose Objects | Options
from the menu; and check the "Win 3.1 compatibility" checkbox
(save for use with Win 3.1/Win95). All BDE
settings will then be stored in the BDE config file (idapi.cfg), instead of the
Ensure the "idapi.cfg" file (and all other "data"
files, INI files, etc) are not saved within the "c:\Program
Files\" folder and sub-folders.
It may be necessary to disable UAC (User Account
However, BDE apps do NOT work when MS Office 2007 Beta-2 is installed, and
the B2TR patch has been applied (Beta-2 Technical Refresh). This is
discussed in some detail at Microsoft TechNet -
this thread includes a suggested workaround. Depending on your browser,
the thread might spread across multiple "pages", and workarounds are split
across a few posts there.
1. "There are a couple of workarounds you can try, that others have
reported helped via editing registry entries, but be cautious on later using
either Office 2007 repair or Office 2007 diagnostics as those features can
'repair' things back to the defaults:
Before modifying the registy backup the HKEY_LOCAL_MACHINE (HKLM) branch at
HKLM\Software\ODBC\ODBCINST.INI\Paradox - Replace
'Paradox' with 'Microsoft Paradox'
HKLM\Software\ODBC\ODBCINST.INI\ODBC Drivers\Paradox -
Replace 'Paradox' with 'Microsoft Paradox'
HKLM\Software\ODBC\ODBCINST.INI\dBase - Replace
'dBase' with 'Microsoft dBase'
HKLM\Software\ODBC\ODBCINST.INI\ODBC Drivers\dBase -
Replace 'dBase' with 'Microsoft dBase'
2. Two customers have reported that the following change may help the
changes from being undone by MS Office 2007 Diagnostics: For each of the
following, add 2 new string values named DLL and DLL32, and use 'blank' for
the values for each string (for each key):
3. If those DLL and DLL32 string values already exist, then it may be
helpful to check changing 'Paradox' and 'DBASE' in the main keys to
'Microsoft Paradox' and 'Microsoft DBASE', respectively.
My comment: presumably, instead of 'changing' some entries at the tails of
the Reg-keys, you could just leave the old branch unchanged, and create a
duplicate branch, with the 'Microsoft' terms added. Perhaps Block Copy/Paste
operations will do this; or you could export the old branch, change the REG
file, and hen Import the revised REG file.
BDE on a P2P arrangement:
SMB2 mist be disabled on the machine that hosts the shared databases:
add an entry named "SMB2", DWORD, value = 0
Matthew Jenkinson (www.responsive.co.nz,
and author of some very neat-looking Accounting systems)
referred me to the GartPlan website, which has excellent technical notes on some
BDE/Paradox - VISTA:
|The following message was posted by Tom Kreig
on a Paradox Forum (www.TheDBCommunity.com).
You should look it up there in it's entirety, and all responses to it:
From information so far, it seems Vista security is blocking Paradox, and
there are a number of options in Vista which *may* overcome this. In a
different thread, Bertil suggested I use the -e switch to stop Paradox
writing to the registry. Also, there are a number of places on the web which
have provided steps to try when having installation and compatibility
problems. Let me summarise what I *think* may be effective, from what others
1. Run the Paradox installer in WinXP compatibility mode, and as
2. Run the BDEAdmin and Paradox in WinXP compatibility mode.
3. Copy the BDE manifest file from the dBase website and save it to the
same directory as the BDEAdmin.exe file.
4. Create a manifest file for the Paradox exe in the same directory
(there are examples on the web).
5. *Don't* write to the registry in your applications.
6. Use the -e, -w and -p switches when starting Paradox.
7. Set all Paradox settings for your application in its startup script.
8. Turn off "save on exit" and "resume on startup".
Accept the fact that when Paradox starts, users may be asked to verify that
it's allowed to start. I don't think this would be a problem with many
users, in fact you could sell it as an extra security *feature* or your
I don't have a Vista machine to test on as I can't afford the time it would
take to set it up. But I will soon and will try Runtime on Vista first
(anyone tried it yet?). As I distribute my applications with runtime, if I
can get runtime working on Vista I don't care if full doesn't; I can keep
going with XP for at least 7 years (according to MS) for my development
I do know that the SQL Server 2005 Management Console is compatible with SQL
2000, so I can run 2000 on SBS2003 or R2 and still control it from a Vista
box. I'll be transferring all my databases to SQL2005 shortly and will see
if there are any inherent problems with Paradox (I use the MS ODBC driver so
I don't foresee many).
Also, as I don't have Paradox shared tables (the only tables I use are in
PRIV, the shared data sits in a MS SQL database accessed via pass-through
SQL and ODBC), it may be Paradox and Vista will be better behaved than if I
were using a Paradox table database. Time will tell.
Remember, there are no such things as problems. There are only solutions
waiting to be found.
BTW. I use P10/SP3.
BDE - MS App Verifier:
|I've seen references to error-messages produced
by the Microsoft Application Verifier utilities, when checking BDE-based
apps [TDatabase components using ODBC]:
TDatabase.Close emits the error: "Freeing heap block containing an
active critical section."
App Close (ie, "free" the TDatabase component) emits: "Unloading DLL
containing an active critical section."
It's suggested these errors arise in IDAPI32.dll (eg, in the
DbiCloseDatabase call), but no solutions have been identified.
PRINTING / USB:
|Old apps usually print to LPT1/2/3, or to a
File. Printing to Local USB printers, or to Network printers, or to
"Windows" printers, is challenging - especially if the app code cannot be
changed internally. Some apps were designed to write to only Epson/IBM Dot-Matrix printers, and do not have HP-LaserJet
options. There are numerous suggestions, and many utilities to assist in
this area; some free, but many are chargeable.
For extensive comments on this topic, you might visit one of the
Near the end, the issue of Mapping LPTn to a local USB printer is mentioned,
but my experience is that the suggested solution does not work for Win98SE,
and others have indicated that using NET USE is not rock-solid on later OSes.
Note that the specific name of DOSPRINT has been used by a few writers!
Also, I notice that a few products are not mentioned:
DOSPrint (NT or
later only, not Win9x).
We are currently trying to decide on a standard printing approach that
covers all Windows platforms (98 to XP). Our conclusions to-date:
Apps which can re-direct Printouts to a file, and where
licensing/utility costs may also be a factor:
For Printing to a
local LPTn printer: just "Copy Report.txt LPTn"
For Printing to a
local Win-Printer: (or, if desired, to a local USB-Printer): use DOSPRINT
For Printing to a
local USB-Printer: use "Copy Report.txt \\CompName\PrtrName" or "Copy Report.txt LPT1:" - assuming LPT1: has been
mapped to \\CompName\PrtrName. To achieve this result, the printer must be
configured as "shared":
(a) "A" network interface MUST be configured for Windows
Networking (even if it's only the MS Loopback Interface - perhaps as 192.168.1.1/24 - see procedure below)
(b) "share" the printer ('net share' will show the printer's shared-name, and the actual port)
(c) ensure that the printer properties do NOT show the printer's port (probably USB) as "pooled" with LPT1:
(d) use "Net Use" to see what mappings are active. If LPT1: is not mapped, then...
(e) use "Net Use LPT1: \\CompName\PrtrName" to map LPT1 to that Printer.
For Printing to a
LAN Printer: use "Copy Report.txt \\CompName\PrtrName" (ie, use
UNC rather than NET USE LPT...) To achieve this result, the printer must be
configured as "shared":
(a) "A" network interface MUST be configured for Windows
Networking (even if it's only the MS Loopback Interface - perhaps as
192.168.1.1/24 - see procedure below)
(b) "share" the printer ('net share' will show \\CompName\PrtrName)
(c) use "Net Use
LPT1: \\CompName\PrtrName" to map LPT1 to that Printer.
Apps which insist or writing to only LPT1/2/3:
investigated this area as thoroughly, because, fortunately, printouts from
most of our apps can be re-directed to files.
You'll need a
"spool" utility - which captures the LPT1/2/3 data, buffers it "somehow",
and then sends it to the required printer.
the options mentioned at the
Clipper websites. Ensure your selections will work with the OSes and
Printers you're using!
Davide Guolo's PrintFil. For support
on PrintFil, look here.
the DOS2USB utility,
Pz-Spooler, and DOSPrn, and
extensive notes and discussions
Some folks use commands like "Shell Notepad.exe /p Filename" to print a
I've also seen the following advice to enable printing from old DOS apps to
"Windows" printers under XP. On the "Win"
Check the box(es) next to the relevant unused LPTn
Check the "Enable printer pooling" (not Spooling!!),
Apply or Ok.
When a (DOS) print task activates on one of the selected LPTn ports, Windows
knows that the LPTn printer is unavailable, but, because it's "Pooled" with
the "Win" printer, the job is sent to the Win-printer. This process does not
translate internal printer commands - you may still need to use printers
which can handle the commands sent by the app. Also, Epson printers which
can handle Esc/P2 commands are slated to be less problematic than Esc/P
"Net Use": Depending on the OS (eg, XP), etc, you may need to have Admin
rights to use this command on LPT ports. On Netware, the "Capture" command
provides similar features. Also, where NET USE is deployed, it may be
necessary to change the Printer Properties from RAW to TEXT mode, to
facilitate printing from the DOS apps. Use "Net Use /Delete" to remove a
MS Loopback LAN Interface:
This facility simulates a LAN environment, and can be created as follows (in
Control Panel; double click Add Hardware; Next.
When the scan finishes, select "Yes, I have already
connected the hardware"; Next.
Scroll to the bottom of the list, select "Add a
new hardware device"; Next.
Select "Install the hardware that I manually select from a
list (Advanced)"; Next.
Select "Network Adapters"; Next.
Select "Microsoft" under the Manufacturer list;
then "Microsoft Loopback Adapter" in the Network Adapter list; Next; Next;
Configure the Loopback (Virtual) Adapter just like any
other NIC; perhaps assign it a Static IP such as 192.168.1.1/24.
Share the printer, assigning, pehaps, a meaningful short
Capture the printer port, using
NET USE LPT1: \\[Computer Name]\PrtrName
[ Home ] [ What's New ] [ Contact Us ] [ Referrals ] [ Feedback ] [ Products Summary ] [ DownLoads ] [ Orders ] [ Links ] [ Anti-Spyware ]