Системное программное обеспечение персональных ЭВМ

Запуск программы из программы


11.4. Запуск программы из программы

Пользовательская программа может в ходе своего выполнения запустить другую программу из COM- или EXE-файла. Эта возможность обеспечивается функцией DOS 0x4B.

Подфункция 1 этой функции выполняет загрузку и запуск другой программы. Для загружаемой (порожденной) программы DOS выделяет память из своего ресурса, следовательно, программа-родитель должна обеспечить наличие свободной памяти в системе (в первую очередь это относится к COM-родителям, так как при их загрузке весь ресурс памяти DOS отдается им) средствами, рассмотренными в следующей главе. Для запуска программа-родитель должна сформировать строку вызова, содержащую имя файла вызываемой программы (с полным маршрутом, если файл находится не в текущем каталоге) и построить EPB (Exec Parameters Block - Блок Параметров Выполнения) - см. struct EPB в примере 11.5. EPB содержит сегментный адрес окружения, которое копируется в сегмент окружения создаваемый для порожденной программы (если этот адрес 0, то в него копируется окружение родителя) и адреса строки параметров и двух блоков FCB, помещаемых в PSP порожденной программы. При обращении к функции 0x4B в регистр AL записывается 1 - код подфункции, в регистры DS:DX - адрес строки вызова, а в ES:BX - адрес EPB.

Наш пример 11.5 состоит из двух программных файлов: 11_5.C и 11_5_A.C, каждому из которых должен соответствовать свой EXEфайл. Программа-родитель 11_5 находит свою строку вызова и заменяет в ней свое имя на имя порождаемой программы (предполагается, что обе программы будут размещены в одном каталоге). Далее родитель получает у DOS блок памяти, в который заносит формируемое для порождаемой программы окружение (признак '$' в конце текста окружения нужен только для программы-родителя как признак конца окружения, он не копируется в окружение). Родитель запрашивает у оператора строку вызова, формирует EPB и обращается к функции 0x4B. Это обращение вызывает загрузку порождаемой программы и передачу ей управления. Порожденная программа получает свой PID и сообщает оператору его и PID родителя, из PSP находит свой сегмент окружения и выводит на экран окружение и строку вызова, а также строку параметров из PSP. Перед завершением порожденная программа запрашивает у оператора код завершения и завершается по функции DOS 0x4C, передавая ей полученный код завершения. Программа-родитель, когда к ней возвращается управление, получает этот код завершения при помощи функции 0x4D.



Содержание раздела