Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответ - Екзаменаційні питання з курсу ОС.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

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

Если функция завершается успешно, величина возвращаемого значения - не ноль.

Если функция завершается с ошибкой, величина возвращаемого значения - ноль. Чтобы получить дополнительные данные об ошибках, вызовите GetLastError.

Замечания

Процессу присваивается идентификатор. Идентификатор является правильным до тех пор, пока процесс не завершит работу. Он может быть использован, чтобы идентифицировать процесс, или открыть определяемый в функции OpenProcess дескриптор процесса. Начальный поток в процессе также получает свой идентификатор. Идентификатор правильный до тех пор, пока поток закончит свою работу и может быть использован, чтобы уникально идентифицировать поток в пределах системы. Эти идентификаторы возвращаются в структуре PROCESS_INFORMATION.

Вызывающий поток может использовать функцию WaitForInputIdle, чтобы ждать до тех пор, пока новый процесс не завершит свою инициализацию и станет ждать от пользователя ввода данных без задержки ввода. Этот прием может быть полезным для синхронизации родительского и дочернего процессов, поскольку функция CreateProcess возвращает значение не ожидая, когда новый процесс закончит свою инициализацию. Например, создающий процесс должен использовать функцию WaitForInputIdle перед попыткой найти окно, связанное с новым процессом.

Предпочтительным способом выключить процесс является использование функции ExitProcess, потому что эта функция уведомляет все динамически подключаемые библиотеки (DLL), связанные с процессом о приближающемся завершении работы. Другой способ завершения процесса не уведомляет связанные DLL.

Обратите внимание! на то, что когда поток вызывает ExitProcess, другие потоки процесса, завершают работу без возможности выполнить какой-либо дополнительный код (включая код завершения потока связанных DLL). За дополнительной информацией обратитесь к статье Завершение работы процесса.

Если приложение предусматривает блок конфигурации, информация текущего каталога системных дисков автоматически не передается новому процессу. Например, имеется переменная окружения, с названием =C:, значение которой - текущий каталог на диске C. Приложение должно позаботиться, чтобы передать новому процессу информацию о текущем каталоге. Поступая таким образом, приложение должно явно создать эти строки переменной окружения, отсортировывать их в алфавитном порядке (потому что система использует отсортированные переменные) и поместить их в блок конфигурации. Как правило, они пойдут в начале блока конфигурации благодаря порядку установленному сортировкой блока конфигурации.

Один из способов получить переменную текущего каталога для диска X состоит в том, чтобы вызвать GetFullPathName (" X: ",..). Это освобождает прикладную программу от необходимости сканировать блок конфигурации. Если полный возвращенный путь является X:\, нет нужды передавать это значение как данные конфигурации, так как корневой директорией является заданный по умолчанию текущий каталог для диска X нового процесса.

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

Windows NT/2000/XP: Когда процесс создается с установленным флажком CREATE_NEW_PROCESS_GROUP, неявный вызов функции SetConsoleCtrlHandler (NULL, TRUE) делается от имени нового процесса; это означает то, что новый процесс имеет заблокированным сочетание клавиш CTRL+C. Это позволяет оболочкам обрабатывать CTRL+C непосредственно и выборочно передавать этот сигнал подпроцессам. Сочетание клавиш CTRL+BREAK не блокируется и может быть использовано для прерывания процесса / группы процессов.

Windows 95/98/Me: Функция CreateProcessW поддерживается подпрограммой Microsoft Layer for Unicode. Чтобы использовать ее, Вы должны добавить некоторые файлы к вашему приложению, как изложено в требованиях этой подпрограммы для систем Windows 95/98/Me.

Замечания по безопасности

Первый параметр, lpApplicationName, может иметь значение ПУСТО (NULL), в этом случае имя исполняемой программы должно быть первое незаполненное пространство разграничивающее строку в параметре lpCommandLine. Если имя пути или исполняемой программы имеют пробел, имеется риск того, что может быть запущена другая исполняемая программа из-за способа, которым функция подробно анализирует пробелы. Нижеследующий пример демонстрирует эту опасность, потому что функция вместо "MyApp.exe" будет пытаться запустить "Program.exe", если таковая существует.

CreateProcess(NULL, "C:\\Program Files\\MyApp", ...)

Если неграмотный пользователь создаст в системе прикладную программу, называемую "Program.exe", любая программа, которая неправильно вызывает функцию CreateProcess, используя каталог Program Files, будет запускать это приложение вместо заданной программы.

Чтобы избежать этой проблемы, не передавайте значение ПУСТО (NULL) для параметра lpApplicationName. Если Вы передаете это значение ПУСТО (NULL) для lpApplicationName, используйте кавычки вокруг пути к исполняемой программе в параметре lpCommandLine, как показано в примере ниже.

CreateProcess(NULL, "\"C:\\Program Files\\MyApp.exe\" -L -S", ...)

Windows API (англ. application programming interfaces) — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Microsoft Windows корпорации «Майкрософт» и совместимой с ними свободной бесплатной операционной системы ReactOS. Является самым прямым способом взаимодействия приложений с Windows и ReactOS. Для создания программ, использующих Windows API, «Майкрософт» выпускает комплект разработчика программного обеспечения, который называется Platform SDK, и содержит документацию, наборбиблиотек, утилит и других инструментальных средств для разработки.