Каковы основные различия между ними? Я хочу запустить только другой EXE-файл из моего (C++) приложения. Существуют ли какие-либо различия при наследовании сред, функций безопасности и т. д.?
Отличия CreateProcess и ShellExecute
Ответы (3)
Основное различие между CreateProcess
и ShellExecute
заключается в следующем: CreateProcess
больше ориентирован на низкий уровень, а ShellExec
на высокий уровень пользователя, который видит пользователя в проводнике.
Например, используя CreateProcess
, можно использовать командную строку, длина которой больше MAX_PATH
. Он имеет ограничение в 32 768 символов. Вы также можете использовать CreateProcess
для запуска программы (если у вас достаточно прав) на другом рабочем столе Windows, например, на экране входа в систему.
Другой пример. Вы можете использовать ShellExecute
, чтобы запустить панель управления или открыть любую программу, которая существовала на компьютере, например, для редактирования файла JPG. Таким образом, вы работаете с ShellExecute
рядом с соответствующими действиями в проводнике Windows.
lpApplicationName
, так и lpCommandLine
для указания программы с параметрами. Максимальная длина lpCommandLine
ограничена 32 768 символами. Вы можете прочитать в документацию что если lpApplicationName имеет значение NULL, часть имени модуля в lpCommandLine ограничена символами MAX_PATH. Используя как не NULL lpApplicationName
, так и lpCommandLine
, можно указать часть модуля, длина которой больше, чем MAX_PATH. Я думаю, что нужно использовать префикс \\?\ в пути
- person Oleg; 29.12.2016
"\\?\"
, и получить более короткое имя, которое вы можете использовать вместо него. Это не то же самое, что я писал раньше, но полезно уменьшить более короткие пути к файлам.
- person Oleg; 29.12.2016
lpCommandLine
, чтобы уменьшить ненужное обсуждение. Если вам нужно создать процесс с программой с длинным путем, то я бы рекомендовал вам использовать RtlCreateUserProcess
с RtlCreateProcessParameters
. Возможно, вам потребуется дополнительно использовать NtResumeThread
, NtWaitForSingleObject
, RtlDestroyProcessParameters
, RtlInitUnicodeString
(и RtlDosPathNameToNtPathName_U
тоже будет полезно).
- person Oleg; 31.12.2016
Основное отличие заключается в гибкости. ShellExecute
проще в использовании, но не обладает большой гибкостью. CreateProcess
неудобно использовать, но позволяет делать все что угодно.
Например, с помощью CreateProcess
вы можете указать дескрипторы (каналы или файлы), которые будут использоваться для стандартных потоков ввода/вывода/ошибок в дочернем элементе. ShellExecute
не дает вам возможности сделать это.
Вероятно, также стоит отметить, что, хотя ShellExecute
может использоваться для непосредственного запуска исполняемого файла, его основное назначение — «выполнить» файлы документов — например, сказать ему «выполнить» «независимо от.html». ", и он запускает веб-браузер по умолчанию и загружает в него указанный HTML-файл. Вы также можете сделать это, используя CreateProcess
, но для этого вы (обычно) начинаете с вызова FindExecutable
, чтобы найти программу, связанную с рассматриваемым файлом данных, а затем выполняете ее, передавая файл данных в качестве параметра.
CreateProcess
возвращает дескриптор и идентификатор запущенного процесса и его основного потока в структуре PROCESS_INFORMATION