Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 2. Конспекты (02_04_19).rtf
Скачиваний:
65
Добавлен:
10.09.2019
Размер:
363.46 Кб
Скачать

Функция создания дочернего процесса

BOOL CreateProcess(

PCTSTR pszApplicationName,

PTSTR pszCommandLine,

PSECURITY_ATTRIBUTES psProcessAttr,

PSECURITY_ATTRIBUTES psThreadAttr,

BOOL bInheritHandles,

DWORD fdwCreate,

PVOID pvEnvironment,

PCTSTR pszCurDir,

PSTARTUPINFO psiStartInfo,

PPROCESS_INFORMATION ppiProcInfo

);

Функция завершения дочернего процесса из самого дочернего процесса

void ExitProcess(

IN UINT uExitCode /// Код возврата

);

Функция завершения дочернего процесса из процесса родителя

Функция обычно вызывается в процессе-родителе, который создал дочерний процесс.

BOOL TerminateProcess(

IN HANDLE hProcess, /// Handle

IN UINT uExitCode /// Код возврата

); /// TRUE, если успешно, иначе FALSE

Краткое описание.

При вызове CreateProcess система создает объект ядра «процесс» с начальным значением счетчика числа его пользователей, равным 1. Затем система создает для нового процесса виртуальное адресное пространство и загружает в это пространство код и данные как для исполняемого файла, так и для любых DLL (если таковые требуются).

Далее система формирует объект ядра «поток» (со счетчиком, равным 1) для первичного потока нового процесса. Как и в первом случае, объект ядра «поток» — это компактная структура данных, через которую система управляет потоком. Первичный поток начинает выполнение стартового кода из библиотеки C/C++, который в конечном счете вызывает функцию WinMain, wWinMain, main или wmain в Вашей программе. Если системе удастся создать новый процесс и его первичный поток, CreateProcess вернет TRUE.

Параметры и описание:

(1) pszApplicationName определяет имя исполняемого файла.

(2) pszCommandLine определяет командную строку, передаваемую этому процессу.

(3) psProcessAttr определяет атрибуты защиты для объекта «процесс». Если передается NULL, то значение по умолчанию (в этом случае дескриптор не может быть унаследован).

(4) psThreadAttr определяет атрибуты защиты для объекта «поток». Если передается NULL, то значение по умолчанию (в этом случае дескриптор не может быть унаследован).

(5) bInheritHandles определяет наследование дескрипторов. Если этот параметр равен TRUE, каждый наследуемый дескриптор в вызывающем процессе наследуется новым процессом. Если параметр FALSE, дескрипторы не наследуются. Обратите внимание, что унаследованные дескрипторы имеют то же значение и права доступа, что и исходные дескрипторы.

(6) fdwCreate определяет флаги, управляющие классом приоритета (6 шт.) и созданием процесса (13 шт.). Однако это необязательно и даже, как правило, не рекомендуется.

(7) pvEnvironment указывает на блок памяти, хранящий строки переменных окружения, которыми будет пользоваться новый процесс. Обычно вместо этого параметра передается NULL, в результате чего дочерний процесс наследует строки переменных окружения от родительского процесса.

(8) pszCurDir позволяет родительскому процессу установить текущие диск и каталог для дочернего процесса. Если его значение равно NULL, рабочий каталог нового процесса будет тем же, что и у приложения, его породившего.

(9) psiStartInfo указывает на структуру STARTUPINFO с 18-тью параметрами (разработчику данную структуру нужно создать и инициализировать перед вызовом функции).

(10) ppiProcInfo указывает на структуру PROCESS_INFORMATION, которую необходимо предварительно создать (разработчику нужно создать структуру, а инициализацией займется сама функция CreateProcess).

Возвращаемое значение.

Если функция завершается успешно, возвращаемое значение отлично от нуля (bool: true), иначе возвращаемое значение равно нулю (bool: false).

Пример (C++).

Программа открывает программу «Блокнот», ждёт 4 секунды, затем закрывает блокнот и завершается.

#include <iostream>

#include <windows.h>

using namespace std;

int main() {

STARTUPINFO cif;

/// Заполняет блок памяти нулями

ZeroMemory(&cif, sizeof(STARTUPINFO));

PROCESS_INFORMATION pi;

if (CreateProcess("C:\\Windows\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &cif, &pi)) { /// Блокнот

/// Выводим Handle окна

cout << "Process handle " << pi.hProcess << endl;

Sleep(4000); /// Ждем 4 секунды

TerminateProcess(pi.hProcess, NO_ERROR); /// Закрываем блокнот

}

return 0;

}