Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа по процессам full.doc
Скачиваний:
7
Добавлен:
19.12.2018
Размер:
375.3 Кб
Скачать

9.4. Параметр pvEnvironment

Параметр pvEnvironment указывает на блок памяти, хранящий строки переменных окружения, которыми будет пользоваться новый процесс. Обычно вместо этого параметра передается NULL, в результате чего дочерний процесс наследует строки переменных окружения от родительского процесса. В качестве альтернативы можно вызвать функцию GetEnvironmentStrings:

PVOID GetEnvironmentStrings();

Она позволяет узнать адрес блока памяти со строками переменных окружения, используемых вызывающим процессом. Полученный адрес можно занести в параметр pvEnvironment функции CreateProcess. (Именно это и делает CreateProcess, если при передаче ей NULL вместо pvEnvironment.) Освободить этот блок памяти можно, вызнав функцию FreeEnvironmentStrings:

BOOL FreeEnvironmentStrings(PTSTR pszEnvLronmenLBlock);

9.5.Параметр pszCurDir

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

9.6. Параметр psiStartlnfo

Этот параметр указывает на структуру STARTUPINFO:

typedef struct _STARTUPINFO { DWORD cb; PSTH lpReserved; PSTR lpDesktop; PSTR lpTitle; DWORD dwX; DWORD dwY;

DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindOw; WORD cbReserved2; PBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFO, *LPSTARTUPINFO;

Элементы структуры STARTUPINFO используются Windows-функциями при создании нового процесса. Большинство приложений порождает процессы с атрибутами по умолчанию, но и в этом случае необходима инициализация элементов структуры STARTUPINFO хотя бы нулевыми значениями, а в элемент сb — заносить размер этой структуры:

STARTUPINFO si = { sizeof(si) }; CreateProcess(.. , &si, ...};

Если понадобится изменить какие-то элементы структуры, необходимо сделать это перед вызовом CreateProcess. Все элементы этой структуры подробно рассматриваются в таблице (см.ниже). Но заметьте, что некоторые элементы имеют смысл, только если дочернее приложение создает перекрываемое (overlapped) окно, а другие — если это приложение осуществляет ввод-вывод на консоль.

Таблица 9.2. Элементы структуры STARTUPINFO

Элемент

Окно или консоль

Описание

cb

То и другое

Содержит количество байтов, занимаемых структурой STARTUPINFO. Служит для контроля версий — на тот случай, если Microsoft расширит эту структуру в будущем Программа должна инициализировать cb как sizeof(STARTUPINFO).

lpReserved

То и другое

Зарезервирован. Инициализируйте как NULL.

lpDesktop

То и другое

Идентифицирует имя рабочего стола, на котором за пускается приложение Если указанный рабочий стол существует, новый процесс сразу же связывается с ним. В ином случае система сначала создает рабочий стол с атрибутами по умолчанию, присваивает ему имя, указанное в данном элементе структуры, и свя зываем его с новым процессом. Если lpDesktop равен NULL (что чаще всего и бывает), процесс связывается с текущим рабочим столом.

lpTitle

Консоль

Определяет заголовок консольного окна. Если lpTitle — NULL, в заголовок выводится имя исполняе мого файла.

dwX

dwY

То и другое

Указывают х- и y-координаты (в пикселах) окна приложения Эти координаты используются, только если дочерний процесс создаст свое первое перекры ваемое окно с идентификатором CW_USEDEFAULT в параметре х функции CreateWindow. В приложениях, создающих консольные окна, данные элементы опре деляют верхний левый угол консольною окна.

dwXSize dwYSize

То и другое

Определяют ширину и высоту (в пикселах) окна приложения. Эти значения используются, только если дочерний процесс создает свое первое перекрывае мое окно с идентификатором CW_USEDEFAULT в параметре nWidth функции CreateWindow В приложениях, создающих консольные окна, данные элементы определяют ширину и высоту консольного окна.

dwXCountChars dwYCountChars

Консоль

Определяют ширину и высоту (в символах) консольных окон дочернего процесса

dwFillAttnbute

Консоль

Задает цвет текста и фона в консольных окнах дочернего процесса.

dwFlags

То и другое

См. ниже следующую таблицу.

wSbowWtndow

Окно

Определяет, как именно должно выглядеть первое перекрываемое окно дочернего процесса, если приложение при первом вызове функции ShowWindow передает в параметре nCmdSbow идентификаюр SW_SHOWDEFAULT. В этот элеменn можно записать любой из идентификаторов типа SW_*, обычно используемых при вызове SbowWindow.

cbReserved2

То и другое

Зарезервирован Инициализируйте как 0.

lpReserved2

То и другое

Зарезервирован. Инициализируйте как NULL.

hStdlnput hStdOutlput bStdError

Консоль

Определяют описатели буферов для консольного ввода-вывода. По умолчанию hStdlnput идентифицирует буфер клавиатуры, a bStdOutput и bStdError — буфер консольного окна.

Рассмотрим элемент структуры dwFlags. Оп содержит набор флагов, позволяющих управлять созданием дочернего процесса. Большая часть флагов просто сообщает функции CreateProcess, содержат ли прочие элементы структуры STARTUPINFO полезную информацию или некоторые из них можно игнорировать. Список допустимых флагов приведен в следующей таблице.

Таблица 9.3. Список допустимых фалагов dwFlags

Флаг

Описание

STARTF_USESIZE

Заставляет использовать элементы divSize и dwYSize

STARTF_USESHOWWINDOW

Заставляет использовать элемент wShowWindow

STARTF_USEPOSITION

Заставляет использовать элементы dwX и dwY

STARTF_USECOTUNTCHARS

Заставляет использовать элементы dwXCountChars и dwYCountCbars

STARTF_USEFILLATTRIBUTE

Заставляет использовать элемент dwFillAttnbute

STARTF_USESTDHANDLES

Заставляет использовать элементы hStdlnput, hStdOutput и bStdError

STARTF_RUN_FULLSCREEN

Приводит к тому, что консольное приложение на компью тере с процессором типа х86 запускается в полноэкран ном режиме

Два дополнительных флага — STARTF_FORCEONFEEDBACK и STARTF_FORCEOFFFEEDBACK — позволяют контролировать форму курсора мыши в момент запуска но вого процесса. Поскольку Windows поддерживает истинную вытесняющую многозадачность, можно запустить одно приложение и, пока оно инициализируется, поработать с другой программой. Для визуальной обратной связи с пользователем функция CreateProcess временно изменяет форму системного курсора мыши:

Курсор такой формы подсказывает: можно либо подождать чего-нибудь, что вот вот случится, либо продолжить работу в системе. При установленном флаге STARTF_FORCEOFFFEEDBACK, CreateProcess не станет добавлять "песочные часы" к стандарт ной стрелке.

Флаг STARTF_FORCEONFEEDBACK заставляет CreateProcess отслеживать инициализацию нового процесса и в зависимости от результата проверки изменять форму курсора. Когда функция CreateProcess вызывается с этим флагом, курсор преобразуется в «песочные часы». Если спустя две секунды от нового процесса не поступает GUI-вызов, она восстанавливает исходную форму курсора.

Если же в течение двух секунд процесс все же делает GUI-вызов, CreateProcess ждет, когда приложение откроет свое окно. Это должно произойти в течение пяти секунд после GUI-вызова Если окно не появилось, CreateProcess восстанавливает курсор, а появилось — сохраняет его в виде «песочных часов» еще на пять секунд Как только приложение вызовет функцию GetMessage, сообщая тeм самым, что оно закончило инициализацию, CreateProcess немедленно сменит курсор на стандартный и прекратит мониторинг нового процесса.

В заключение раздела — несколько слов об элементе wShowWindow структуры STARTUPINFO. Этот элемент инициализируется значением, которое передается в (w)WinMain через ее последний параметр, nCmdShow. Он позволяет указать, в каком виде должно появиться главное окно приложения. В качестве значения используется один из идентификаторов, обычно передаваемых в ShowWindow (чаще всего SW_SHOWNORMAL или SW_SHOWMINNOACTIVE, но иногда и SW_SHOWDEFAULT).

После запуска программы из Explorer ее функция (w)WinMain вызывается с SW_SHOWNORMAL в параметре nCmdShow. При создании для нее ярлыка можно указать в его свойствах, в каком виде должно появляться ее главное окно. На рис. см. ниже показано окно свойств для ярлыка Notepad. Обратите внимание на список Run, в котором выбирается начальное состояние окна Notepad.

При активизации этого ярлыка из Explorer, последний создает и инициали зирует структуру STARTUPINFO, a затем вызывает CreateProcess. Это приводит к запуску Notepad, а его функция (w)WinMain получает SW_SHOWMINNOACTIVE в параметре nCmdShow. Таким образом, пользователь может легко выбирать, в каком окне запускать про грамму — нормальном, свернутом или развернутом.

Рисунок 9.1 Свойства ярлыка приложения Notepad

Наконец, чтобы получить копию структуры STARTUPINFO, инициализированной родительским процессом, приложение может вызвать:

VOID GetStartupInfo(PSTARTUPINFO pStartupInfo);

Анализируя эту структуру, дочерний процесс может изменять свое поведение в зависимости oт значений ее элементов.

Замечание: Хотя в документации на Windows об этом четко не сказано, перед вызовом GetStartupInfo нужно инициализировать элемент cb структуры STARTUPINFO:

STARTUPINFO si = { sizeof(si)} ;

GetStartupInfo(&si) ;