Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 126

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 120 121 122 123 124 125 < 126 > 127 128 129 130 131 132 .. 173 >> Следующая

Например, модуль платежной ведомости для пакета бухгалтерских программ может быть разработан и размещен в отдельном исполняемом файле и выполняться, как отдельный процесс.
Когда приложение состоит из отдельных процессов, один из них (обычно, главный модуль программы) может запускать один или несколько дополнительных. Следовательно, нужно запустить только главный исполняемый файл программы, а управлять запуском исполняемого файла для каждого дополнительного процесса не нужно. Например, если в бухгалтерском приложении с несколькими процессами выбрать команду платежной ведомости, то программа может запустить исполняемый файл модуля платежной ведомости.
Для запуска такого файла (и запуска нового процесса) в программе можно вызвать функцию \Vin32 АР1 : : СгеасеРгосезэ следующим образом.
BOOL CreateProcess (LPCTSTR IpszImageName,
LPTSTR IpszCommandLine, LPSECURITY_ATTRIBUTES IpsaProcess, LPSECURITY_ATTRIBUTES IpsaThread, BOOL fInheritHandles,
DWORD fdwCreate, LPVOID lpvEnvironment,
LPCTSTR IpszCurDir,
LPSTARTUPINFO lpsiStartlnfo,
LPPROCESS_INFORMATION lppiProcInfo);
// путь доступа к
// исполняемому файлу;
// командная строка;
// атрибуты защиты процесса;
// атрибуты защиты потока;
// наследует ли новый процесс
// дескрипторы?
// флаги создания процесса;
// блок окружения нового
// процесса;
// текущий каталог
// процесса;
// описывает функции окна // процесса;
// получает информацию о // новом процессе
Процесс, вызывающий функцию .- .-CreateProcess, называют родительским, а вновь запускаемый — дочерним. Функция ::CreateProcess используется для выполнения программ любого типа, поддерживаемого операционной системой, например, 32-битовой программы с графическим интерфейсом, консольной программы Windows, 16-битовой программы Windows 3.1 или 16-битовой программы MS-DOS.
Например, следующий вызов запускает программу Payroll.exe как отдельный процесс.
STARTUPINFO Startuplnfo;
memset (SStartupInfo, 0, // использует стандартные
sizeof (STARTUPINFO)); // компоненты окна;
Startuplnfo.cb = sizeof (STARTUPINFO); // это поле должно
// быть заполнено
PROCESS INFORMATION Processlnfo;
:CreateProcess
("PAYROLL.EXE", // запускает исполняемый файл "PAYROLL.EXE";
NULL, // командная строка не задана;
NULL, // стандартные атрибуты защиты процесса
NULL,
FALSE,
0,
NULL, NULL,
SStartupInfo, SProcessInfo) ;
// стандартные атрибуты защиты потока;
// процесс не наследует дескрипторы;
// флажки не создаются (используются стандартные),
// использует среду вызывающего процесса;
// тот же текущий каталог, что и у
// вызывающего процесса*
// описывает компоненты окна процесса;
// получает информацию от процесса
Поскольку в приведенном примере первый параметр содержит только простое имя исполняемого файла, то этот файл должен быть расположен в текущем каталоге. Кроме того, так как второму параметру присвоено значение NULL, то командная строка, передаваемая в дочерний процесс, состоит только из имени исполняемого файла PAYROLL.EXE. Второй параметр можно использовать для передачи аргументов командной строки в дочерний процесс. Последний получает доступ к полной командной строке с помощью вызова функции Win32 API : : GetCommandLine либо с помощью параметра lpCmdLine, передаваемого в функцию WinMain. Для параметров с третьего по девятый в нашем примере передаются стандартные значения. Десятый (последний) параметр задает адрес неинициализированной структуры Processlnfo типа process_information. Функция : :CreateProcess присваивает этой структуре дескриптор, а также идентификаторы дочернего процесса и его первичного потока.
Совет
После того как родительский процесс вызовет функцию : :CreateProcess для запуска дочернего процесса, он может вызвать функцию Win32 API : :WaitForinputldle для ожидания завершения инициализации этого процесса (например, создания окна программы) и не задерживать сообщения. Например, если родительскому процессу нужно передать сообщение в окно дочернего процесса, то вышеуказанную функцию можно вызвать, чтобы подождать завершения создания окна дочерним процессом.
Функция ::CreateProcess возвращает управление. С этого момента дочерний и родительский процессы выполняются одновременно. Как и любой процесс, дочерний завершается при выходе из вызывающей его функции (WinMain для программы с графическим интерфейсом) или при вызове функции Win32 API -. :ExitProcess. Значение, которое дочерний процесс возвращает или присваивает функции :: ExitProcess, называется кодом возврата. Родительский или любой другой процесс, имеющий корректный дескриптор для дочернего процесса (см. ниже), может получить этот код, вызвав функцию Win32 API : : GetExitCodeProcess, как в следующем примере.
DWORD ExitCode;
;:GetExitCodeProcess
(Processlnfo.hProcess, // дескриптор процесса, предоставленный
// функцией CreateProcess; SExitCode); // адрес переменной DWORD,
// принимающей код возврата if (ExitCode == STILL_ACTIVE)
// процесс продолжает выполняться ...
// процесс завершен и ExitCode содержит его код возврата
Предыдущая << 1 .. 120 121 122 123 124 125 < 126 > 127 128 129 130 131 132 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100