Использование командной строки и вызов внешних программ

Паскаль позволяет передавать информацию в программу при ее запуске через командную строку. Для этого служат две стандартные функции -ParamCount и ParamStr.

Function ParamCount: Word - возвращает номер последнего заданного при запуске программы параметра. Параметры разделяются в командной строке пробелами.

Function ParamStr(n:Word): String - возвращает n-й параметр или пустую строку, если n>ParamCount. Параметры нумеруются начиная с 0, причем 0-й параметр - это всегда полное имя выполняемой программы. Пусть программа была запущена из DOS командой test.exe 1 abc, тогда функция ParamCount вернет 2, ParamStr(0)='test.exe', ParamStr(1)='1', ParamStr(2)='abc', ParamStr(3)=''. При отладке программ, использующих командную строку, удобно пользоваться опциейParameters подменю Runсреды программирования Turbo Pascal. Там вы можете задать все необходимые программе параметры (имя программы задавать не нужно) и отлаживать программу, не выходя в DOS. Напишем программу, которая будет складывать или вычитать два целых числа:

 

Var

a,b : LongInt;

Code : Integer;

Plus : Boolean;

Begin

If ParamCount<>3 Then Begin

WriteLn('test.exe <число> <+/-> <число>'); Halt; End;

Val(ParamStr(1),a,Code);

If Code<>0 Then Begin

WriteLn('1-е число задано неверно'); Halt; End;

If ParamStr(2)='+' Then Plus:=True

Else

If ParamStr(2)='-' Then Plus:=False

Else Begin

WriteLn('знак задан неверно'); Halt; End;

Val(ParamStr(3),b,Code);

If Code<>0 Then Begin

WriteLn('2-е число задано неверно');

Halt;

End;

If Plus Then WriteLn(a,'+',b,'=',a+b)

Else WriteLn(a,'-',b,'=',a-b);

End.

 

Обратите внимание, что подобная программа обязательно должна сообщать, какой именно параметр был задан неверно, и, если неверно количество параметров, выводить на экран подсказку для пользователя.

В Паскаль-пpогpамме можно вызвать внешнюю пpогpамму, которая не обязательно должна быть написана на языке Паскаль. Для этого используется процедураExec из модуля DOS:

Procedure Exec(Name,CmdLine:String);

Процедура вызывает программу, которая содержится в файле Name (можно задавать полное имя). Этой программе передается командная строка CmdLine, таким образом можно передать информацию вызываемой программе. Если после вызова внешней программы основная программа будет продолжать работу, то необходимо вызвать процедуру

Procedure SwapVectors;

непосредственно до и непосредственно после процедуры Exec.Процедура SwapVectorsсохраняет состояние программы в системной области, а затем восстанавливает это состояние. Переменная

Var DosError: Integer;

возвращает код завершения внешней программы, при нормальном завершении значение переменной равно 0. Запишем несложный пример использования процедуры Exec. Пусть существует внешняя программа, которая пищит и красит экран в заданный цвет:

 

{ ТЕКСТ ВНЕШНЕЙ ПРОГРАММЫ }

Uses Crt;

Var

Color : Byte;

Code : Integer;

Begin

If ParamCount<>1 Then Color:=4

Else Begin

Val(ParamStr(1),Color,Code);

If Code<>0 Then Color:=4;

End;

Write(#7,#7,#7);

Window(1,1,80,25);

TextBackground(Color);

ClrScr;

End.

 

Откомпилируем эту программу, записав результат в файл EXT_PRG.EXE. Теперь запишем программу, которая вызовет EXT_PRG.EXE :

 

Uses DOS;

Begin

SwapVectors;

Exec('EXT_PRG.EXE','1');

SwapVectors;

If DosError=0 Then WriteLn('OK')

Else WriteLn('Ошибка номер ',DosError);

End.

 

Вполне возможно, что, запустив эту программу, мы получим сообщение “ошибка номер 8, этот код завершения означает, что внешней программе не хватает памяти. Дело в том, что процедура Exec пытается использовать память, которую уже захватила основная программа. В этом случае следует уменьшить размер стека, отводимого главной программе, опцией компилятора {$M}. Синтаксис этой опции таков: {$M размер стека,минимальный размер хипа,максимальный размер хипа}. Добавим в нашу основную программу строку {$M 1024,0,0} - хип в этой программе вообще не нужен, а размер стека в любом случае нельзя задать меньше, чем 1К. Теперь наша программа отработает успешно.