[Back to DOS SWAG index] [Back to Main SWAG index] [Original]
{
RL> I would like to open 20-50 silumtaneous files (in TP 6.0 or 7.0).
RL> Does anyone know how to accomplish this?
I use the unit below for BP7 (protected mode or real mode).
}
Unit Extend;
{-----------------------------------------------------------------------}
{ Author : Michael John Phillips }
{ Address : 5/5 Waddell Place }
{ Curtin ACT 2605 }
{ Tel : (06) 2811980h }
{ FidoNet : 3:620/243.70 }
{-----------------------------------------------------------------------}
{
$lgb$
v1.0 22 Apr 93 - Initial version works in REAL-MODE or DPMI mode BP7
$lge$
$nokeywords$
}
{-----------------------------------------------------------------------}
{ This unit contains routines to extend the number of files that }
{ can simultaneously be open by a program under DOS. }
{ }
{ The NON-DPMI routine was downloaded from the Borland BBS and then }
{ modified to work with TP7 and BP7. }
{ }
{ The DPMI routine was captured in the Z3_PASCAL FidoNet echo. }
{ }
{ To use these routines, make sure that your CONFIG.SYS files }
{ contains the lines FILES=255. If you use the DOS SHARE command }
{ then make sure that you have enough memory allocated for SHARE }
{ (eg SHARE /F:7168), having SHARE too low can result in a "hardware }
{ failure" (IOResult=162) when trying to open a file. }
{-----------------------------------------------------------------------}
{ These routines extend the max. number of files that can be OPEN }
{ simultaneously from 20 to 255. Files in DOS 2.0 or later are }
{ controlled by FILE handles. The number of FILE handles available }
{ to application programs is controlled by the FILES environment }
{ variable stored in a CONFIG.SYS FILE. If no FILES variable is }
{ established in a CONFIG.SYS FILE, then only 8 FILE handles are }
{ available. However, DOS requires 5 FILE handles for its own use }
{ (controlling devices such as CON, AUX, PRN, etc). This leaves }
{ only 3 handles for use by application programs. }
{ }
{ By specifying a value for the FILES environment variable, you can }
{ increase the number of possible FILE handles from 8 up to 20. }
{ Since DOS still requires 5, 15 are left for application programs. }
{ But you cannot normally increase the number of handles beyond 20. }
{ }
{ With DOS version 3.0, a new DOS function was added to increase }
{ the number of FILE handles available. However, the function must }
{ be called from application programs that have previously reserved }
{ space for the new FILE handles. }
{-----------------------------------------------------------------------}
{$IFNDEF VER70 }
Should be compiled using Turbo Pascal v7.0 or Borland Pascal v7.0
{$ENDIF }
Interface
Const
MAX_FILE_HANDLES = 255;
Function ExtendHandles(Handles : Byte) : Word;
Implementation
{$IFDEF MSDOS }
Uses
Dos; { Dos routines - BORLAND }
{$ENDIF }
{$IFDEF DPMI }
Uses
Dos, { Dos routines - BORLAND }
WinAPI; { Windows API routines - BORLAND }
{$ENDIF }
Const
NO_ERROR = $00;
ERROR_NOT_ENOUGH_MEMORY = $08;
ERROR_HARDWARE_FAILURE = $A2;
Var
Result : Word;
Regs : Registers;
{$IFDEF MSDOS }
Function ExtendHandles(Handles : Byte) : Word;
{---------------------------------------------------------------------}
{ This routine resizes the amount of allocated memory for a Turbo }
{ Pascal program to allow space for new FILE handles. In doing so, }
{ it also resizes the heap by adjusting the value of FreePtr, the }
{ pointer used in FreeList management. Since the FreeList is being }
{ manipulated, the heap must be empty when the extend unit is }
{ initialized. This can be guaranteed by including extend as one }
{ of the first units in your program's USES statement. If any heap }
{ has been allocated when extend initializes, the program will halt }
{ with an error message. }
{---------------------------------------------------------------------}
begin { of ExtendHandles }
ExtendHandles := NO_ERROR;
{-------------------------------------------------------------------}
{ Check that the number of file handles to extend to is greater }
{ than the default number of file handles (20). }
{-------------------------------------------------------------------}
if Handles <= 20 then
Exit;
{-------------------------------------------------------------------}
{ Check that the heap used by Turbo Pascal is currently empty. }
{-------------------------------------------------------------------}
if (HeapOrg <> HeapPtr) then
begin
Writeln('Heap must be empty before Extend unit initializes');
Halt(1);
end;
{-------------------------------------------------------------------}
{ Reduce the heap space used by Turbo Pascal. }
{-------------------------------------------------------------------}
HeapEnd:=ptr(Seg(HeapEnd^)-(Handles div 8 +1), Ofs(HeapEnd^));
{-------------------------------------------------------------------}
{ Determine how much memory is allocated to the program. BX }
{ returns the number of paragraphs (16 bytes) used. }
{-------------------------------------------------------------------}
with Regs do
begin
AH := $4A;
ES := PrefixSeg;
BX := $FFFF;
MsDos(Regs);
end; { of with Regs }
{-------------------------------------------------------------------}
{ Set the program size to the allow for new handles. }
{-------------------------------------------------------------------}
with Regs do
begin
AH := $4A;
ES := PrefixSeg;
BX := BX - (Handles div 8 + 1);
MsDos(Regs);
end; { of with Regs }
END;
{$ENDIF}
END.
[Back to DOS SWAG index] [Back to Main SWAG index] [Original]