378______________________________________________Глава <

предназначенная для DOS. Поэтому при ее выполнении вызывается сеанс DOS, и.
после его окончания пользователь видит окно DOS, которое ему надо закрыть, что-
бы продолжить работу. Это, конечно, очень неудобно. Устранить этот недостаток
легко, например, написанием пакетного файла arj.bat вида:

@echo off

arj.exe e doc %1

exit

В нем помимо команда разархивации предусмотрена команда exit — оконча-
ние сеанса работы с окном DOS. Тогда обращение к разархивации в приложении
может быть даже короче, чем раньше:

if(spawnlp(P WAIT,"arj.bat","arj.bat","al.txt", NULL))

Обращение к пакетному файлу arj.bat позволяет порожденному процессу ав-
томатически, без вмешательства пользователя вернуться в родительский процесс.
Но остается еще один недостаток рассмотренного примера — на время выполнения
разархивации получаются неприятные изменения экрана, связанные с выходом в
DOS. Этот недостаток может быть снят только функциями, рассмотренными в по-
следующих разделах.

Приведем еще один пример использования функции spawnlp. Пусть вы разра-
ботали пользовательский интерфейс, в котором хотите предоставить пользователю
возможность запускать различные приложения. Ваш интерфейс достаточно боль-
шой и поэтому желательно запускать из него внешние приложения в оверлэйног
режиме. Эту задачу можно решить следующим образом.

Пусть имя вашего приложения POverlay. Создайте еще одно приложение, на-
званное, например, OMenage. Это приложение будет управлять запуском требуе-
мых программ. Оно может быть очень маленьким, не содержать ни одной формы и
располагаться в оперативной памяти одновременно с запускаемыми программами.
Весь текст его файла следующий:

#include <vcl.h>

ttpragma hdrstop

ftinclude <process.h>

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR IpCmdLine, int)

(

spawnlp(P_WAIT,IpCmdLine,IpCmdLine, NULL);

spawnlp(P_OVERLAY,"POverlay.exe","POverlay.exe", NULL) ;

return 0;

)

Первый вызов функции spawnlp обеспечивает запуск в режиме ожидания того
приложения, имя которого передано через командную строку IpCmdLine. Второй
вызов spawnlp обеспечивает оверлэйный вызов вашего основного приложения РО-
verlay.exe.

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

if(spawnlp(P_OVERLAY,"OMenage.exe","OMenage.exe",Editl->Text,NULL))
ShowMessage("Программа " + Editl->Text + " не выполнена;"+"
нет файла OMenage.exe");

Этот оператор прервет выполнение приложения POverlay и загрузит на его
место в памяти короткую (примерно 10 К) программу OMenage.exe, передав в нее
как параметр имя запускаемого приложения. Программа OMenage.exe вызовет в
режиме ожидания эту программу, а по окончании ее работы удалится из памяти и
опять вызовет основное приложение POverlay. Таким образом, во время выполне-