Параметр pvEnvironment

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

PVOID GetEnvironmentStrings();

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

BOOL FreeEnvironmentStrings(PTSTR pszEnvLronmenLBlock);

Параметр pszCurDir

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

Параметр 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. В приложениях, создающих консольные окна, данные элементы опре деляют верхний левый угол консольною окна.
dwXSizedwYSize То и другое Определяют ширину и высоту (в пикселах) окна приложения. Эти значения используются, только если дочерний процесс создает свое первое перекрывае мое окно с идентификатором CW_USEDEFAULT в параметре nWidth функции CreateWindow В приложениях, создающих консольные окна, данные элементы определяют ширину и высоту консольного окна.
dwXCountChars dwYCountChars Консоль Определяют ширину и высоту (в символах) консольных окон дочернего процесса
dwFillAttnbute Консоль Задает цвет текста и фона в консольных окнах дочернего процесса.
dwFlags То и другое См. ниже следующую таблицу.
wSbowWtndow Окно Определяет, как именно должно выглядеть первое перекрываемое окно дочернего процесса, если приложение при первом вызове функции ShowWindow передает в параметре nCmdSbow идентификаюр SW_SHOWDEFAULT. В этот элеменn можно записать любой из идентификаторов типа SW_*, обычно используемых при вызове SbowWindow.
cbReserved2 То и другое Зарезервирован Инициализируйте как 0.
lpReserved2 То и другое Зарезервирован. Инициализируйте как NULL.
hStdlnputhStdOutlputbStdError Консоль Определяют описатели буферов для консольного ввода-вывода. По умолчанию hStdlnput идентифицирует буфер клавиатуры, a bStdOutput и bStdError — буфер консольного окна.
         

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

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

Флаг Описание
STARTF_USESIZE Заставляет использовать элементы divSize и dwYSize
STARTF_USESHOWWINDOW Заставляет использовать элемент w ShowWindow
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);


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: