Russian Belarusian English German Japanese Ukrainian

CreateProcess

CuBook45

Более современной, чем WinExec, является функция API Windows CreateProcess, которая и рекомендуется для 32-разрядных приложений.
Функция порождает новый дочерний процесс и его первый поток (нить). В рамках этого процесса выполняется указанный файл IpApplicationName с командной строкой lpCommandLine. Впрочем, параметр IpApplicationName может быть равен NULL, а имя выполняемого модуля в этом случае должно быть первым элементом командной строки, задаваемой параметром lpCommandLine. Сам выполняемый модуль может быть любого вида: 32-разрядным приложением Windows, приложением MS-DOS, OS/2 и т.п. Однако если из приложения Windows создается процесс MS-DOS, то параметр IpApplicationName должен быть равен NULL, а имя файла и его командная строка включаются в lpCommandLine. Так что, как правило, чтобы не ошибиться, проще всегда задавать IpApplicationName = NULL и помещать всю информацию в lpCommandLine.
 
Если имя файла не содержит расширения, то предполагается расширение .exe. Но если имя кончается символом точки или если файл задан вместе с путем, то расширение .exe к имени не добавляется. Если путь к файлу не задан, то файл ищется в тех же каталогах и в той же последовательности, как и в функции WinExec.
 
Множество параметров функции позволяют определить условия выполнения и управлять дочерним процессом. Параметры lpProcessAttributes, lpThreadAttributes, IpEnvironment, blnheritHandles определяют наследование дочерним процессом свойств родительского процесса. Если не вдаваться в подробности наследования, то можно первые три из этих параметров задавать равными NULL, а последний false. Параметр lpCurrentDirectory указывает на строку, определяющую текущий каталог и диск дочернего процесса. Это используется в приложениях оболочках, выполняющих различные приложения с различными рабочими каталогами. Если параметр равен NULL, текущий каталог совпадает с родительским.
 
Параметр dwCreationFlags определяет флаги, задающие характеристики создаваемого процесса. Эти флаги определяют тип процесса (например, CREATE_NEW_CONSOLE - создание нового консольного приложения), характер взаимоотношения с родительским процессом и класс приоритета нового процесса:
Значение Описание
HIGH_PRIORITY_CLASS Указывает на процесс как на критическую задачу, которая должна выполняться немедленно.
IDLE_PRIORITY_CLASS Все потоки процесса выполняются только во время простоя системы. Пример, хранители экрана. Все наследники такого процесса будут иметь тот же класс приоритета.
NORMAL_PRIORITY_CLASS Нормальный приоритет процесса.
REALTIME_PRIORITY_CLASS Высокий приоритет, превышающий приоритеты других процессов, включая приоритеты процессов операционной системы.
Параметр IpStartupInfo указывает на структуру типа TStartupInfo, определяющую основное окно дочернего процесса. Из всех полей этой структуры обязательным для заполнения является только cb - размер в байтах данной структуры. Остальные можно не заполнять, что обеспечит вид окна по умолчанию.
 
Параметр lpProcessInformation указывает на структуру TProcessInformation, из которой родительское приложение может получать информацию о выполнении нового процесса. Ее поля обозначают следующее:
Значение Описание
hProcess Возвращает дескриптор созданного процесса. Используется во всех функциях, осуществляющих операции с объектом процесса.
hThread Возвращает дескриптор первого потока (нити) созданного процесса. Используется во всех функциях, осуществляющих операции с объектом потока.
dwProcessId Возвращает глобальный идентификатор процесса. Значение доступно с момента создания процесса и до момента его завершения.
dwThreadld Возвращает глобальный идентификатор потока. Значение доступно с момента создания потока и до момента его завершения.
Если функция CreateProcess успешно выполнена, она возвращает ненулевое значение, т.е. true. Если произошла ошибка, то возвращается 0, т.е. false. Тогда информацию об ошибке можно получить, вызвав функцию GetLastError.
 
Функция CreateProcess возвращается, не ожидая окончания инициализации порождаемого процесса. Если родительский процесс должен ждать окончания инициализации, чтобы взаимодействовать с порожденным, то ожидание его инициализации можно организовать с помощью функции WaitForlnputldle.
 
Параметр hProcess - дескриптор дочернего процесса, тот самый дескриптор, который в родительском процессе хранится в поле hProcess структуры lpProcessInformation.
Параметр dwMilliseconds - время ожидания в миллисекундах.
 
Функция возвращается, если истекло время ожидания, или когда порожденный процесс инициирован и ждет ввода со стороны пользователя. Возвращаемое функцией значение может быть следующим:
Значение Описание
0 Порожденный процесс инициирован и ждет ввода со стороны пользователя.
WAITJTIMEOUT Заданный интервал ожидания истек.
OxFFFFFFFF Произошла ошибка. Информацию о ней можно получить с помощью функции GetLastError.
В некоторых случаях выполнение родительского процесса должно быть приостановлено до завершения порожденного процесса. Это необходимо, например, если родительский процесс должен использовать какие-то результаты, полученные порожденным процессом. Для ожидание завершения порожденного процесса можно использовать функцию WaitForSingleObject.
 
Параметр hHandle - дескриптор дочернего процесса, тот самый дескриптор, который в родительском процессе хранится в поле hProcess структуры lpProcessInformation.
Параметр dwMilliseconds - время ожидания в миллисекундах.
 
При нормальном завершении функция возвращает значение, указывающее на событие, которое вызвало возврат:
Значение Описание
WAIT_OBJECT_0 Дочерний процесс закончился.
WAIT_TIMEOUT Заданный интервал ожидания истек, но никаких сигналов от процесса не получено, т.е. он не закончился.
Порожденный процесс остается в памяти системы, пока не завершатся все его потоки (нити) и пока все его дескрипторы не закроются вызовом CloseHandle. Если эти дескрипторы не нужны, лучше всего закрыть их сразу после инициализации процесса. Чтобы досрочно прекратить выполнение дочернего процесса лучше всего использовать функцию ExitProcess.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


Защитный код Обновить