home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 03 / tricks / execdemo.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-12-10  |  5.2 KB  |  128 lines

  1. (* ------------------------------------------------------ *)
  2. (*                   EXECDEMO.PAS                         *)
  3. (*           (c) 1991 Gerd Cebulla & TOOLBOX              *)
  4. (*       Turbo-Pascal ab Version 4.0 oder Quick-Pascal    *)
  5. (* ------------------------------------------------------ *)
  6. PROGRAM ExecDemo;
  7.  
  8. USES Dos;
  9.  
  10.   PROCEDURE Execute(Name : PathStr; Params : ComStr);
  11.  
  12.     { Die folgende Prozedur bringt die Fragmentliste der   }
  13.     { Turbo-Pascal-Heapverwaltung in Sicherheit, gibt den  }
  14.     { unbenutzten Teil des Heap frei und ruft anschließend }
  15.     { das Programm "Name" mit den Kommandozeilenparametern }
  16.     { "Params" auf.                                        }
  17.     { "Name" kann optional einen Laufwerksbezeichner       }
  18.     { und/oder einen Suchpfad enthalten. Nach erfolgtem    }
  19.     { Programmaufruf wird die Speicherbelegung auf die     }
  20.     { Originalwerte zurückgesetzt. Der Fehlerstatus läßt   }
  21.     { sich wie üblich der Systemvariablen DosError ent-    }
  22.     { nehmen, die folgende Werte enthalten kann:           }
  23.     {   0 = alles o.k.                                     }
  24.     {   2 = Datei nicht gefunden                           }
  25.     {   3 = Verzeichnis nicht gefunden                     }
  26.     {   8 = nicht genug Hauptspeicher                      }
  27.   VAR
  28.     Regs      : Registers;
  29.     FragLen,
  30.     FragParas,
  31.     ParasAlt,
  32.     ParasNeu  : WORD;
  33.   BEGIN
  34.     IF Ofs(FreePtr^) = 0 THEN
  35.       FragLen := 0         { keine Fragmentliste vorhanden }
  36.     ELSE BEGIN
  37.       FragLen := $10000 - Ofs(FreePtr^);
  38.                { Länge der Fragmentliste in Byte berechnen }
  39.       Move(FreePtr^, HeapPtr^, FragLen);
  40.       { Fragmentliste an Anfang des freien Heap kopieren   }
  41.     END;
  42.     FragParas := Succ(FragLen DIV 16);
  43.                   { Länge der Fragmentliste in Paragraphen }
  44.     ParasAlt := Seg(FreePtr^) + $1000 - PrefixSeg;
  45.                   { derzeit vom Programm belegter Speicher }
  46.     ParasNeu := Succ(Seg(HeapPtr^) + FragParas - PrefixSeg);
  47.                          { tatsächlich benötigter Speicher }
  48.     Regs.AH := $4A;      { Speichergröße ändern            }
  49.     Regs.BX := ParasNeu;   { BX = Speichergröße/Paragraphs }
  50.     Regs.ES := PrefixSeg;  { ES zeigt auf Programmanfang   }
  51.     MsDos (Regs);    { nicht benötigten Speicher freigeben }
  52.  
  53.     {$IFNDEF VER40 (SwapVectors erst ab Turbo 5.0 definiert}
  54.     SwapVectors;             { DOS-Vektoren reinstallieren }
  55.     {$ENDIF}
  56.     Exec(Name, Params);            { Kindprogramm aufrufen }
  57.     {$IFNDEF VER40 }
  58.     SwapVectors;                   { Turbo-Vektoren zurück }
  59.     {$ENDIF}
  60.  
  61.     Regs.AH := $4A;                { Speichergröße ändern  }
  62.     Regs.BX := ParasAlt;
  63.     Regs.ES := PrefixSeg;
  64.     MsDos(Regs);      { freigegebenen Speicher zurückholen }
  65.     IF Regs.Flags AND FCarry <> 0 THEN BEGIN
  66.                         { Carry gesetzt => Speicher konnte }
  67.                         {           nicht zugeteilt werden }
  68.       WriteLn('Fraktaler FEHLER: Das aufgerufene Programm '+
  69.                'hat die Speicherorganisation verändert!');
  70.       Halt (1);                          { Programmabbruch }
  71.     END;
  72.     IF FragLen > 0 THEN
  73.       Move(HeapPtr^, FreePtr^, FragLen);
  74.                             { Fragmentliste zurückkopieren }
  75.   END;
  76.  
  77.  
  78. (* ------------------------------------------------------ *)
  79. (* Das folgende Programm demonstriert die Verwendung der  *)
  80. (* Prozedur "Execute" anhand des Aufrufs einer DOS-Shell  *)
  81. (* und veranschaulicht, daß trotzdem noch der volle Heap  *)
  82. (* verfügbar ist.                                         *)
  83. (* Achtung: Da dieses Programm die Speicherorganisation   *)
  84. (* manipuliert, sollte es *NICHT* von der integrierten    *)
  85. (* Entwicklungsumgebung aus gestartet werden!             *)
  86.  
  87. TYPE
  88.   BigArray    = ARRAY [1..60000] OF BYTE;
  89.   BigArrayPtr = ^BigArray;
  90. VAR
  91.   Big   : ARRAY [1..10] OF BigArrayPtr;
  92.   Index : BYTE;
  93. BEGIN
  94.   WriteLn('MemAvail = ', MemAvail, ' Byte');
  95.   Index := 0;
  96.   WHILE MaxAvail > SizeOf (BigArray) DO BEGIN
  97.     Inc(Index);
  98.     New(Big[Index]);
  99.     WriteLn(Index, '. dynamische Variable erzeugt; ',
  100.                    'MemAvail = ', MemAvail);
  101.   END;
  102.   FOR Index := Index DOWNTO 1 DO BEGIN
  103.     Dispose(Big[Index]);
  104.     WriteLn(Index, '. dynamische Variable freigegeben; ',
  105.                    'MemAvail = ', MemAvail);
  106.   END;
  107.   WriteLn;
  108.   WriteLn('Wie man sieht, lassen sich beliebige ',
  109.           'Operationen auf dem Heap durchführen.');
  110.   Write  ('Trotzdem ist es noch möglich, ein anderes ',
  111.           'Programm aufzurufen. Zur Demonstration');
  112.   Write  ('wird jetzt der DOS-Kommandointerpreter ',
  113.           'geladen. Geben Sie beliebige Befehle ein,');
  114.   WriteLn('und verlassen Sie ihn mit EXIT ...');
  115.  
  116.   {$IFNDEF VER40 - GetEnv erst ab Turbo 5.0 implementiert }
  117.   Execute(GetEnv('COMSPEC'), '');
  118.   {$ELSE (V4.0: annehmen, daß sich COMMAND.COM im         }
  119.   {             Suchpfad befindet).                       }
  120.   Execute('COMMAND.COM', '');
  121.   {$ENDIF}
  122.   WriteLn('Zurück in ExecDemo ...');
  123.   WriteLn('DosError = ', DosError);
  124. END.
  125. (* ------------------------------------------------------ *)
  126. (*                 Ende von EXECDEMO.PAS                  *)
  127.  
  128.