878_____________________________________________Глава 14

Memol->Lines->LoadFromFile("al.txt") ;

DeleteFile("al.txt");

}

запускают архиватор arj, извлекающий из архива doc.arj файл al.txt. Приложе-
ние ждет, пока программа arj закончит работу, затем загружает разархивирован-
ный файл в окно редактирования Memol и удаляет этот файл с диска.

В приведенном примере все аргументы, передаваемые в порождаемый про-
цесс, объединены в одной строке. Тот же самый результат получился бы, если пе-
редать их все в отдельности:

if(spawnip(P_WAIT,"arj","arj","e","doc.arj","al.txt", NULL))

Операции, подобные рассмотренным выше, невозможно было бы выполнить
функциями ехес..., поскольку они не обеспечивают возвращения в исходное при-
ложение. Нельзя было бы выполнить эти операции и функциями spawn... при ре-
жиме, отличном от P_WAIT, поскольку в этом случае оператор загрузки файла в
окно редактирования выполнялся бы раньше, чем успевал распаковываться ар-
хив. Впрочем, можно было бы использовать и режим P_NOWAIT, но с добавлени-
ем функций cwait или wait:

int ID = spawnlp(P NOWAIT,"arj","arj","e doc.arj al.txt",NULL);

if(ID == -1)

ShowMessage("Программа arj не выполнена");

else
{

if(wait(NULL) != ID)

ShowMessage("Ошибка разархивации") ;

else
(

Memol->Clear();

Memol->Lines->LoadFromFile("al.txt") ;

DeleteFile("al.txt") ;

)
}

В этом коде функция spawnip выполняется в режиме Р_ NOWAIT, не обеспе-
чивающем ожидание конца порожденного процесса. Но затем вызывается функ-
ция wait, которая обеспечивает ожидание. Если эта функция вернет значение, от-
личное от идентификатора порожденного процесса, значит при выполнении по-
рожденного процесса произошло его аварийное завершение.

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

@echo off
arj.exe e doc %1
exit

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

if(spawnip(P_WAIT,"arj.bat","arj.bat","al.txt", NULL))

Обращение к пакетному файлу arj.bat позволяет порожденному процессу ав-
томатически, без вмешательств пользователя вернуться в родительский процесс.