Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППП, СОМ, ОLE.doc
Скачиваний:
7
Добавлен:
22.11.2019
Размер:
345.6 Кб
Скачать

Способы динамического запуска вычислительных процессов

Каждый простой (не вызывающий других) процесс характеризуется своим адресным пространством, виртуальной памятью, исполняемым кодом и данными. Запуск же из одной программы другой называется порождением дочернего процесса.

И так, запуск внешней программы из приложений, написанных, например, на Паскале и C++ можно сделать несколькими способами.

1) Функция execlp, которая определена, например, в файле process.h среды программирования С++Builder, как:

int execlp(char *path, char *arg0,*argl,...,*argn,NULL),

позволяет выполнить из своего приложения любое указанное приложение, передав ему управление (рис. 2.18). При этом вызванная программа (например, Пр3) замещает в памяти вызвавшее ее приложение (Пр1). Таким образом, родительское приложение завершается и начинается новое.

. Рис. 2.18. Запуск внешней программы с замещением родительского процесса

Параметр path определяет имя и путь к приложению, которое требуется выполнить. Если в path указан путь и имя файла с расширением, то функция ищет именно этот файл. Если же расширение файла не задано, то сначала ищется файл такой, который задан. Если он не находится, к имени добавляется расширение *.ехе и поиск повторяется. Если файл опять не находится, к имени добавляется paсширение *.com и поиск повторяется. Если в path не задан путь, то сначала поиск файла производится в текущем каталоге. Если в нем требуемый файл не найден, то поиск продолжается в каталогах, указанных в переменной окружения PATH.

Аргументы функции arg0 — argn являются параметрами, передаваемым в запускаемую на выполнение программу через командную строку. Функция должна передать в запускаемое приложение хотя бы один аргумент arg0. По умолчанию этот аргумент — копия path.

Функция execlp возвращает 0 при успешной загрузке нового приложения, а при ошибке возвращает -1.

Например, оператор

If (execlp("f1.Ехе","Fl.Exe", null)) ShowMessage ("Программа Fl.Exe не выполнена");

завершает выполнение вашего приложения и передает управление программе с выполняемым файлом Fl.exe. Она вернет -1 и будет выдано сообщение функцией ShowMessage. Аналогичное сообщение будет выдано, если, например, для загрузки F1.exe не хватает оперативной памяти.

Семейство подобных функций может найти достаточно ограниченное применение, так как они обеспечивают безвозвратную передачу управления из вызвавшего приложения в новое. И для возврата в исходное приложение надо принимать специальные меры: например, вызванное приложение в конце своей работы должно аналогичной функцией execlp вызвать первоначальное приложение. Зато у этих функций есть и большое преимущество: оверлэйная загрузка приложений — новое приложение загружается в оперативную память на место вызвавшего его приложения. Соответственно сокращаются затраты памяти, так как не требуется держать в ней оба приложения. Таким образом, сферой применения функции execlp является:

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

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

2) Функция spawnlp, определенная там же, как:

int spawnlp(int mode, char *path, char *arg0,argl,..., argn,NULL),

отличается от execlp наличием параметра mode, задающего режим выполнения приложения, запускаемого на выполнение. Например, операторы:

if(spawnlp(P__WAIT,"arj","arj","e doc.arj al.txt",NULL)) ShowMessage("Программа arj не выполнена"); else { Memol->Clear (); Memol->Lines->LoadFromFile("al.txt"); DeleteFile ("al.txt"); }

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

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

Рис. 2.19. Идея динамического обмена данными между отдельными процессами

4) CreateProcess 5)ShellExecute 6) FindWindow