2012-05-25 6 views
6

В чем основные отличия между ними? Я готов запустить только другой EXE из моего (C++) приложения. Существуют ли какие-либо различия при наследовании сред, функций безопасности и т. Д.?Различия CreateProcess и ShellExecute

+1

код [MSDN документы] (http://msdn.microsoft.com) дать вам эту информацию. Этот вопрос слишком расплывчатый и неспецифический для SO. Есть десятки вопросов, которые обсуждают оба вопроса, и вы абсолютно не пытались исследовать это самостоятельно. (В качестве подсказки: только один позволяет вам указать что-либо об окружающей среде, наследовать ручки и другую информацию. Я оставлю это для ваших исследовательских способностей, чтобы выяснить, какой из них.) –

ответ

11

Основное различие между CreateProcess и ShellExecute заключается в следующем: CreateProcess больше ориентирован на низком уровне и ShellExec на рычаге высокого пользователя, который видим пользователя в проводнике.

Например, используя CreateProcess, можно использовать командную строку, длина которой больше, чем MAX_PATH. Он имеет ограничение 32 768 символов. Вы также можете использовать CreateProcess для запуска программы (если у вас достаточно разрешений) на другом рабочем столе Windows, например, на экране входа в систему.

Другой пример. Вы можете использовать ShellExecute, чтобы запустить Панель управления или открыть любую программу, которая существовала на компьютере для редактирования, например, JPG. Таким образом, вы работаете с ShellExecute рядом с соответствующими действиями в проводнике Windows.

+0

CreateProcess не может запускать процесс, если путь к программа превышает MAX_PATH. Он может передавать длинные аргументы программе, которая может быть запущена, но это другое. В принципе, сейчас нет способа запустить программу, расположенную глубже MAX_PATH (если нет короткого 8.3 эквивалента) – nikos

+0

@nikos: Можно использовать как 'lpApplicationName', так и' lpCommandLine', чтобы указать программу с параметрами. Максимальная длина 'lpCommandLine' ограничена 32 768 символами. Вы можете прочитать [документацию] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v = vs.85) .aspx): «Если lpApplicationName имеет значение NULL, имя модуля часть lpCommandLine ограничена символами MAX_PATH. ". Используя оба параметра: NULL 'lpApplicationName' и' lpCommandLine', вы должны указать часть модуля, длина которой больше MAX_PATH. Я думаю, что нужно использовать префикс «\\? \» В пути – Oleg

+0

@nikos: Кроме того, начиная с Windows 10, версии 1607 ограничения MAX_PATH были удалены из обычных функций файла и каталога Win32 (см. [Начальное объявление] (https : //mspoweruser.com/ntfs-260-character-windows-10/) и [документация] (https: // msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath)). – Oleg

4

Главное отличие в гибкости. ShellExecute проще в использовании, но не имеет большой гибкости. CreateProcess - это боль в использовании, но позволяет делать что-либо.

Только, например, с помощью CreateProcess вы можете указать ручки (трубы или файлы), которые будут использоваться для стандартных потоков ввода/вывода/ошибок в дочернем элементе. ShellExecute не дает вам желаемого способа сделать это.

Это, вероятно, также стоит отметить, что, хотя ShellExecuteможет использоваться для запуска исполняемого файла непосредственно, его основной целью является «выполнить» файлы документов - например, скажи «выполнить» в «whatever.html» , и он запускает ваш веб-браузер по умолчанию и загружает в него указанный HTML-файл. Вы можете сделать это, используя CreateProcess, но для этого вы (обычно) начинаете с вызова FindExecutable, чтобы найти программу, связанную с данным файлом данных, а затем выполните, передав файл данных в качестве параметра.

2

CreateProcess возвращает дескриптор и идентификатор для запущенного процесса и его основной поток в PROCESS_INFORMATION структуре