
- •1. Понятие процесса.
- •2. Типы приложений под Windows
- •3.Описатель экземпляра процесса
- •4.Описатель предыдущего экземпляра процесса
- •5.Командная строка процесса
- •6.Переменные окружения
- •7.Текущие диск и каталог для процесса
- •8.Текущие каталоги для процесса
- •9.Создание процесса - функция CreateProcess
- •9.1. Параметры pszApplicationName и pszCommandLine
- •9.2. Параметры psaProcess, psaThread и blnheritHandles
- •9.3. Параметр fdwCreate
- •9.4. Параметр pvEnvironment
- •9.5. Параметр pszCurDir
- •9.6. Параметр psiStartlnfo
- •9.7. Параметр ppiProclnfo
- •10. Завершение процесса
- •10.1. Возврат управления входной функцией первичного потока
- •10.2. Функция ExitProcess
- •10.3. Функция TerminateProcess
- •10.4.Завершение всех процессов потока
- •11. Порядок завершения процесса
- •14. Дочерние процессы
- •15. Запуск обособленных дочерних процессов
- •16. Порядок выполнения работы
- •17. Контрольные вопросы
5.Командная строка процесса
При создании новому процессу передается командная строка, которая почти никогда не бывает пустой — как минимум, она содержит имя исполняемого файла, использованного при создании этого процесса. Однако, возможны случаи, когда процесс получает командную строку, состоящую из единственного символа — нуля, завершающего строку. В момент запуска приложения стартовый код из библиотеки С/С++ считывает командную строку процесса, пропускает имя исполняемого файла и заносит в параметр pszCmdLine функции (w)WinMain указатель на оставшуюся часть командной строки.
Параметр pszCmdLine всегда указывает на ANSI-строку. Но, заменив WinMain на wWinMain, можно получить доступ к Unicode-версии командной строки для своего процесса.
Указатель на полную командную строку процесса можно получить и вызовом функции GetCommandLine.
PTSTR GetCommandLine();
Она возвращает указатель на буфер, содержащий полную командную строку, включая полное имя (вместе с путем) исполняемого файла.
6.Переменные окружения
С любым процессом связан блок переменных окружения — область памяти, выделенная в адресном пространстве процесса. Каждый блок содержит группу строк такого вида:
VarName1=VarValue1\0 VarName2=VarValue2\0 VarName3=VarValue3\0 ... VarNameX=VarValueX\0
\0
Первая часть каждой строки — имя переменной окружения. Зa ним следует знак равенства и значение, присваиваемое переменной. Строки в блоке переменных окружения должны быть отсортированы в алфавитном порядке по именам переменных.
Знак равенства разделяет имя переменной и ее значение, так что его нельзя использовать как символ в имени переменной. Важную роль играют и пробелы. Например, объявив две переменные.
XYZ= Windows (обратите внимание на пробел за знаком равенства) ABC=Windows
и сравнив значения переменных ХУZ и АВС, нетрудно заметить, что система их различает, — она учитывает любой пробел, поставленный перед знаком равенства или после него.
Вот что будет, если записать, скажем, так
XYZ =Home (обратите внимание на пробел перед знаком равенства) XYZ=Work
Первую переменная будет с именем "XYZ", содержать строку "Home", а вторая переменная "XYZ ", содержать строку "Work".
Конец блока переменных окружения помечается дополнительным нулевым сим волом
Замечание:
Чтобы создать исходный набор переменных окружения для Windows 98, надо модифицировать файл Autoexec bat, поместив в него группу строк SET в виде
SET VarName=VarValue
При перезагрузке система учтет новое содержимое файла Autoexec.bat, и тогда любые заданные Вами переменные окружения станут доступны всем процессам, инициируемым в сеансе работы с Windows 98.
При регистрации пользователя на входе в Windows 2000 система создает процесс-оболочку, связывая с ним группу строк — переменных окружения. Система получает начальные значения этих строк, анализируя два раздела в реестре. В первом:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment содержится список переменных окружения, относящихся к системе, а во втором: HKEY_CURRENT_USER\Environment находится список переменных окружения, относящихся к пользователю, который в настоящее время зарегистрирован в системе.
Пользователь может добавлять, удалять или изменять любые переменные через апплет System из Control Panel. B этом апплете надо открыть вкладку Advanced и щелкнуть кнопку Environment Variables — тогда на экране появится следующее диалоговое окно.
Рис. 6.1 Диалоговое окно переменных окружения
Модифицировать переменные из списка System Variables разрешается только пользователю с правами администратора.
Переменные окружения обычно применяются для тонкой настройки приложения. Пользователь создает и инициализирует переменную окружения, затем запускает приложение, и оно, обнаружив эту переменную, проверяет ее значение и соответствующим образом настраивается.
Функции для манипулирования переменными окружения.
GetEnvironment Variable позволяет выявлять присутствие той или иной переменной окружения и определять ее значение:
DWORD GetEnvironmentVariable( PCTSTR pszName, PTSTR pszValue, DWORD cchValue);
При вызове GetEnvironmentVariable параметр pszName должен указывать на имя переменной, pszValue — на буфер, в который будет помещено значение переменной, а в cchValue следует сообщить размер буфера в символах. Функция возвращает либо количество символов, скопированных в буфер, либо 0, если ей не удалось обнаружить переменную окружения с таким именем.
Кстати, в реестре многие строки содержат подставляемые части, например.
%USERPROFILE%\My Documents
Часть, заключенная в знаки процента, является подставляемой. В данном случае в строку должно быть подставлено значение переменной окружения USERPROFILE. Например, эта переменная может выглядеть так:
C:\Documents and Settings\Administrator
После подстановки переменной в строку реестра получим
C:\Documents and Settings\Admimstrator\My Documents
Поскольку такие подстановки делаются очень часто, в Windows есть функция ExpandEnvironmentStrings.
DWORD ExpandEnvironmentStrings( PCTSTR pszSrc, PTSTR pszDst, DWORD nSize);
Параметр pszSrc принимает адрес строки, содержащей подставляемые части, а параметр pszDsf — адрес буфера, в который записывается развернутая строка. Параметр nSize определяет максимальный размер буфера в символах.
Наконец, функция SetEnvironmentVariable позволяет добавлять, удалять и модифицировать значение переменной.
DWORD SetEnvironmentVariable( PCTSTR pszName, PCTSTR pszValue);
Она устанавливает ту переменную, на чье имя указывает параметр pszName, и присваивает ей значение, заданное параметром pszValue. Если такая переменная уже существует, функция модифицирует ее значение. Если же spszValue содержится NULL, переменная удаляется из блока.
Для манипуляций с блоком переменных окружения всегда используйте именно эти функции. Строки в блоке переменных нужно отсортировать в алфавитном порядке по именам переменных (тогда GetEnvironmentVariable быстрее находит нужные переменные), a SetEnvironmentVariable как раз и следит за порядком расположения переменных.