Posted By: Keson (Keson) on 'CZprogram'
Title:     Re: vic jak 15 souboru....
Date:      Mon Dec  2 20:15:16 1996

Ahoj,
> Po 15 otevrenem souboru vam to hodis stejne jako me :"Too many open files" i

Od M$-DOSu verze asi tak 3.3 je dostupna funkce  67H: Set File Handle Count

Expects  AH     67H   
         BX     desired maximum number of handles (up to ffffH)
----------------------------------------------------------------
Returns  AX     error code if CF is set to CY

No a tak kdyz ji zavolas, tak se ti (dal li Panbu) vytvori pozadovanej
pocet fajl-handlu (rek bych ze maximalne 255) a muzes otevrit vic souboru.

V Pascalu muze nastat problem s pameti. DOS totiz pri volani fce 67H 
potrebuje alokovat patricnou pamet pro sebe a pukud Pas.program vyuziva
vsechnu pro sebe, tak to krachne.
Da se to resit tak, ze bud nevyuzijes vsechnu pamet {$M 4096,0,1024}
nebo pomoci dos. fce 4aH zmencis blok pameti vyuzivany packalem.
V tom pripade musis zmensit i HeapEnd ukazujici na konec Heapu.


                                                  Keson

Priklad: Pozor !!! psal jsem to ted' a dost narychlo
a urcite tam bude mooooooooooooooooc CHYB.

<---------------------------------------------------------------->
UNIT FHndls;       {Sets number of file-handles to HANDLES_COUNT
                    Freeware     by T. Jirka 1996
                    NO WARANTY !!!}

INTERFACE
IMPLEMENTATION

CONST
  HANDLES_COUNT = 40;
  MEM_NEEDED = ((HANDLES_COUNT * 2 - 1) Div 16) + 1; {in paragraphs}


TYPE
  MCB_T  = Record  {Memory Control Block}
    MCB_Type : Char;
    Owner    : Word;
    Size     : Word;
    IDN      : Array[1..$B] Of Char;  {Process name (I think)}
  End;

VAR
  pMcb : ^MCB_T;

    PROCEDURE Error;
    BEGIN
      WriteLn(#7'Chyba v unitu FHndls');
      Halt(1);
    END; {Error}


    PROCEDURE Inc_Handles;
    VAR
      My_MCB_Size : Word;

    BEGIN {Inc_Handles}
                {Test Heap}
      If (HeapPtr <> HeapOrg) Or (Ofs(HeapOrg^) <> 0) Or
        (Ofs(HeapEnd^) <> 0) Then Error;
      If Seg(HeapEnd^) - Seg(HeapOrg^)  < MEM_NEEDED Then Error;
                 {Shrink Heap}
      HeapEnd := Ptr(Seg(HeapEnd^) - MEM_NEEDED, 0);

      pMCB := Ptr(PrefixSeg-1,0);
      My_MCB_Size := pMCB^.Size - MEM_NEEDED;
      Asm
        mov AH,4ah            {** Shrink MCB **}
        mov ES,PrefixSeg
        mov BX,My_MCB_Size
        int 21h
        jnc @GoOn
        Call Error;

      @GoOn:
        mov AH,67h            {** Create new File handles **}
        mov BX,HANDLES_COUNT
        int 21h
        jnc @Konec
        Call Error;
      @Konec:
      End;
    END; {Inc_Handles}




BEGIN   {Main}
  asm
        mov AH,67h              {** Create new File handles **}
        mov BX,HANDLES_COUNT
        int 21h

        jnc @Konec              {No Error}
        cmp AX,8                {Error - insufficient memory}
        je @FreeMem
        Call Error;
    @FreeMem:
        Call Inc_Handles;       {Free some bytes from heap}
    @Konec:
  end;

END.
<------------------------------------------------------------------------>

Search the boards