Взаимодействие приложения с внешними программами______________377

• построение входного интерфейса к какому-то приложению, работающего толь-
ко перед запуском этого приложения

• создание оверлэйных приложений, загружаемых в память по частям

6.1.2 Запуск внешней программы функцией spawnip

Функция spawnip подобна рассмотренной выше функции execlp, но обладает
более широкими возможностями. Она и используемые в ней константы описаны в
файлах process.h и stdio.h. Объявление функции:

int spawnip(int mode, char *path, char *arg0, argi, ..., argn, NULL)

Функция spawnip отличается от execlp наличием параметра mode, задающего
режим выполнения приложения, запускаемого на выполнение. Этот параметр мо-
жет, в частности, принимать следующие значения (полный их список см. в главе
14 в разделе 14.14.2):

P_WAIT           Родительское приложение ждет завершения вызванного
приложения, после чего продолжается его выполнение

P_NOWAIT        Родительское приложение продолжает выполняться пока
выполняется вызванное приложение. Этот режим недосту-
пен в 16-разрядных Windows и DOS

P_DETACH        Идентичен P_NOWAIT, но вызванное приложение выпол-
няется в фоновом режиме, так что не имеет доступа к
клавиатуре и дисплею

P_OVERLAY       Вызванное приложение замещает в памяти родительское.
То же, что вызов функции execlp

Приведем пример. Операторы

if(spawnip(P_WAIT,"arj","arj","e doc.arj al.txt", NULL))
ShowMessage("Программа arj не выполнена");

else
(
Memol->Clear();

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

DeleteFile("al.txt") ;

t

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

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

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

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

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