Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Функция CreateProcess ⇐ ПредыдущаяСтр 2 из 2
Основной функцией для создания процесса является CreateProcess. Данная функция создает новый процесс с единственным первичным потоком. Десять параметров функции позволяют указать основные параметры создаваемого процесса. BOOL CreateProcess( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); При вызове CreateProcess, система создает объект ядра «процесс» (структуру данных, через которую операционная система управляет процессом). Затем система создает для нового процесса виртуальное адресное пространство и загружает в него код и данные исполняемого файла и необходимых библиотек (DLL). Далее система формирует объект ядра «поток» для первичного потока (primary) нового процесса. Первичный поток отвечает за инициализацию процесса, обработку системных сигналов и событий. Этот поток “живет” до того момента, когда управление не будет возвращено операционной системе для завершения процесса. Первичный поток начинает с исполнения стартового кода программы (для C/C++ это функции WinMain, wWinMain, main или wmain). Рассмотрим параметры и возвращаемое значение функции CreateProcess. Параметры lpApplicationName и lpCommandLine используются вместе для указания исполняемой программы и аргументов командной строки. Если файл с указанным именем не найден, Windows приступает к поиску заданного файла и делает это в следующем порядке: 1. Каталог, содержащий ЕХЕ-файл вызывающего процесса. 2. Текущий каталог вызывающего процесса. 3. Системный каталог Windows. 4. Основной каталог Windows. 5. Каталоги, перечисленные в переменной окружения PATH. lpProcessAttributes и lpThreadAttributes указатели на структуры атрибутов защиты процесса и потока. Значениям NULL соответствует использование атрибутов защиты, заданных по умолчанию. Флаг bInheritHandles показывает, наследует ли новый процесс открытый дескрипторы (файлов, файлов отображенных на память и т.д.) из вызывающего (родительского) процесса производящего запуск. Унаследованные дескрипторы имеют те же значения и права доступа, что и оригиналы. Параметр dwCreationFlags задает параметры создания процесса и его приоритет. Некоторые возможные значения данного флага перечислены ниже.
lpEnvironment казывает на блок переменных окружения нового процесса. Если передаваемое значение будет NULL, то будет использован блок родительского процесса. Блок среды это список строк с нулевым окончанием типа «имя=значение». Использование переменных окружения наиболее простой способ передачи информации в порождаемый процесс. lpCurrentDirectory – указатель но строку, содержащую путь к текущему каталогу нового процесса. Если значение не задано, то в качестве текущего каталога будет использоваться каталог родительского (порождающего) процесса. lpStartupInfo указатель на структуру STARTUPINFO, которая описывает внешний вид основного окна создаваемого процесса и содержит дескрипторы основных устройств нового процесса. Большинство приложений порождает процессы с атрибутами по умолчанию, в этом случае должны быть инициализировать все элементы структуры STARTUPINFO нулевыми значениями. lpProcessInformation – указатель на структуру PROCESS_INFORMATION, в которую Windows будут помещены, возвращаемые функцией значения дескрипторов и уникальные идентификаторы созданного процесса и его главного потока. Как видно из описания функции CreateProcess, возвращаемое ей значение не является дескриптором созданного объекта типа HANDLE, как это происходит в большинстве функций. Если системе удастся создать новый процесс и его первичный поток, тогда CreateProcess вернет ненулевое значение, иначе будет возвращено нулевое значение.
#include " stdafx.h" #include " windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { STARTUPINFO cif; ZeroMemory(& cif, sizeof(STARTUPINFO)); PROCESS_INFORMATION pi; if (CreateProcess(" c: \\windows\\notepad.exe", NULL, NULL, NULL, FALSE, NULL, NULL, NULL, & cif, & pi)) { cout < < " Process ID: " < < pi.dwProcessId < < endl; cout < < " Process handle: " < < pi.hProcess < < endl; Sleep(5000); // задержка на 5 секунд TerminateProcess(pi.hProcess, NO_ERROR); // завершение } //процесса }
|