Другие языки программирования и технологии

Win API - в чем разица между ShellExecute и CreateProcess?

AM
Ashot Manykian
17 867
ShellExecute делает тоже самое, что и проводник, когда тыкаешь мышкой по файлу. Он определяет ассоциации типов (расширений) , и запускает соответствующую утилиту. Можно применить к любому файлу, например *.txt. Но будет запущен процесс notepad.exe, который откроет этот файл.

ShellExecute Function
Performs an operation on a specified file.

CreateProcess создает процесс. Применяется только к файлу формата PE (экзешник) . При этом по барабану все расширения.
Можно экзешник переименовать в *.txt, и он запуститься как ни в чем ни бывало. А если нет PE формата, то не запуститься.

CreateProcess Function
Creates a new process and its primary thread. The new process runs in the security context of the calling process.
Ерлан Тусупбаев
Ерлан Тусупбаев
21 360
Лучший ответ
наверно разница между понятиями приложения и процесса...
MB
Mara Baetov
8 290
Ashot Manykian и...?
в чем принципиальная разница? что лучше использовать?
ShellExecute может запустить приложение, ассоциированное с расширением
файла, например:
ShellExecute(Handle, 'open', 'mydoc.doc', nil, nil, SW_SHOW);
запустит Word (или другое приложение, зарегистрованное для *.doc) и откроет
файл mydoc.

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

хендл дочернего процесса может вернуть функция
ShellExecuteEx, которая занимает промежуточное положение.
Если я правильно помню, то ShellExecute "открывает" файл (разруливая ассоциации) , и если он окажется исполняемым, то это равносильно запуску. А CreateProcess - непосредственно запускает.
Серик Абилханов грубо говоря именно так)
ShellExecute исполняется на более высоком уровне, это аналог тому, как если просто кликнуть по файлу в проводнике. Там проверяется, что за файл, является ли он исполняемым или чем-то ещё, запускается.
CreateProcess - более низкоуровневая функция. Ей на вход подаётся уже конкретно исполняемый файл, после чего он запускается. ShellExecute использует CreateProcess для запуска.
Ещё уровнем ниже запускается функция Native API, под названием NtCreateProcess (иногда другая функция, RtlCreateUserProcess). Эти функции являются шлюзами к ядру системы.
Почитать, что это за функции такие можно здесь: Справочник по недокументированным функциям Windows