Systemnahe
Programmierung

E-Books


MS-DOS Kurs


1. Shell-Schnittstelle

Nach der Behandlung der DOS-Kommandos ist es naheliegend, diese auch aus Programmen heraus aufzurufen. Da die meisten Programmiersprachen den Aufruf von externen Programmen erlauben, ist es kein Problem, OS-Kommandos, die als COM- oder als EXE-Dateien vorliegen, ausführen zu lassen. Wie aber sieht es mit den internen Befehlen aus ? Diese werden vom Kommandointerpreter zur Verfügung gestellt, der aber auch nur ein ganz normales DOS-Programm ist, das man auch mehrmals aufrufen kann. Auf diese Weise sind Befehle wie DIR, COPY oder DEL auch von Programmen aus zugänglich. In Turbo-Pascal sähe das Anzeigen des Enviroments mit dem SET-Befehl folgendermaßen aus:

{$M $4000,0,0}
USES DOS;
BEGIN
   Exec('/Command.com.','/cSet');
END.

Der entsprechende DOS-Befehl (SET) wird dem Kommandointerpreter einfach als Parameter (/c) übergeben. Der Schalter $M begrenzt den Speicher des Hauptprogramms, da sonst kein Nachladen möglich ist. Bei der Verwendung der Exec-Funktion sind noch einige Details zu beachten (explizite Angabe der Dateierweiterung notwendig, Prüfen des Rückkehrkodes wird empfohlen), aber dafür sei auf das Handbuch verwiesen.
In ähnlicher Weise lassen sich auch beliebige andere Befehle ausführen. Nun werden Ausgaben auf den Bildschirm in den meisten Fällen nicht ins Konzept passen, aber man kann ja auch unbemerkt im Hintergrund arbeiten lassen. Mit dem Befehl
Exec('/Command.com','/cCopy *.* a: > NUL');
Werden beispielsweise in einem Turbo-Pascal-Programm alle Dateien des aktuellen Verzeichnisses nach A: kopiert, und die Umlenkung der Meldung
xxx Dateien kopiert
zum Nullgerät bewirkt, daß der Bildschirmneuaufbau nicht zerstört wird. Ähnlich einfach können Dateien gelöscht oder umbenannt werden. Ein weiteres durchaus praktisches Beispiel ist die Einstellung der seriellen Schnittstelle mit Hilfe des MODE-Befehls:
Exec('/Command.com','/cMode com^:9600,n,7,1 > NUL');
Diese Einstellung mit Systemfunktionen vorzunehmen würde doch erheblich mehr Aufwand verursachen. Trotzdem ist der sinnvolle Einsatz von DOS-Kommandos in Anwendungen auf wenige Funktionen begrenzt. Auch muß man bedenken, daß als selbstverständlich vorausgesetzt wird, den Kommandointerpreter im Hauptverzeichnis zu finden. Besser müßte man erst die Umgebungsvariable COMSPEC testen - und was, wenn diese nicht gesetzt ist ? Der Aufruf von COMMAND.COM aus Programmen heraus kann also bestenfalls eine Notlösung sein.


(c) Jürgen Richter