[Back to FILES SWAG index] [Back to Main SWAG index] [Original]

    {
    From: BRIAN GRAINGER               Refer#: NONE
    Subj: Multiple open files            Conf: (58) Pascal
    ---------------------------------------------------------------------------
    RL±I would like to open 20-50 silumtaneous files (in TP 6.0 or 7.0).

    Two ways that I know of. The first involves sleuthing around in the
    Program Segment Prefix prepended to the memory image of a program's .EXE
    file. This involves undocumented DOS calls, but is known to work.

    The second is to use Interrupt 21h, Function 67h, Set Handle Count.
    This is buggy in the original release of DOS 3.3, but is apparently
    reliable in later versions.
    }

    USES
      Dos;

    CONST
      LotsaHandles = 24861;

    FUNCTION SetHandleCount(Count : WORD) : WORD;
      VAR
        Regs : Registers;
      BEGIN
        SetHandleCount := 0;
        WITH Regs DO
          BEGIN
            AH := $67;
            BX := Count;
            Intr($21, Regs);
            IF Flags AND fCarry <> 0 THEN (* Error?                *)
              SetHandleCount := AX;       (* AX returns error code *)
          END;
      END;

    BEGIN
      IF SetHandleCount(LotsaHandles) <> 0 THEN
        WriteLn('Sorry. Better luck next time.')
      ELSE
        WriteLn('What do think I am, a mainframe?');
    END.

    { ASSEMBLER TO DO THE SAME THING

    (If you are not using protected mode you have to limit the use of DOS memory
    by using compiler direvtive $M in BP. DOS steals the first 5 handles for std.
    devices. This require at least DOS 3.3)
    }

    procedure SetHandleCount( wInAnt: WORD );
    var
     err            : Boolean;
    begin
    asm

            MOV     AX, $6700;
            MOV     BX, wInAnt
            INT     $21
            MOV     err, 0
            JNC     @l1
            MOV     err, 1          { Error! }
    @l1:
    end;
      if err then begin
        ClrScr;
        writeln('Not enough memory');
        halt(0);
      end;
    end;

[Back to FILES SWAG index] [Back to Main SWAG index] [Original]