Блогът на GunSmoker Защо не трябва да използвате ShellExecute (Ex)

. когато промяната на нечий ум става толкова лесна, колкото програмирането на компютър, какво означава да си човек.

Защо не трябва да използвате ShellExecute (Ex)

Последният път научихме защо никога не трябва да използвате функцията ShellExecute .

Този път ще ви кажа защо не трябва да използвате функцията ShellExecuteEx .

Заглавията за тази и предишната публикация са внимателно подбрани. В предишната публикация се казваше, че ако пишете код през 1995 г. или по-късно, не трябва да използвате функцията ShellExecute. Тъй като сме през 2015 г., това означава, че вашият код изобщо не трябва да използва ShellExecute. В заглавието на тази публикация липсва думата "никога", което намеква, че понякога може да се използва ShellExecuteEx. В допълнение заглавието използва двойно име, обозначаващо както функцията ShellExecute, така и функцията ShellExecuteEx - това показва, че значението не е в определена функция, а в логическите действия, които те изпълняват.

Та какъв е проблема?

Много често начинаещите програмисти използват функцията ShellExecute, за да директен стартиране на програми. С други думи, те правят нещо подобно:
Добре, надявам се, че са прочели предишната статия и са започнали да правят това: (този пример на код използва функцията обвивка от предишната статия; ако не сте прочели предишната статия, помислете, че този код е еквивалентен на извикване на ShellExecuteEx с правилна обработка на грешки, COM и асинхронни операции).

Да, стана по-добре, но проблемът не изчезна. Какъв е този проблем?

Факт е, че ShellExecute (Ex) (по-нататък ще използвам комбинираното име на функции, за да обознача и двете функции) е функция на Windows Shell (Explorer), която предназначен за отваряне на файл в съответната програма - тези. в тази, зададена от потребителя за този тип файл. Имайте предвид, че тази цел е различна от „стартиране на изрично посочена програма“.

Горният код работи по простата причина, че действието по подразбиране за .exe файлове е да ги стартирате.

Разбира се, не е нужно да отваряте програмата в свързаната програма, за да я стартирате. Трябва да го стартирате изрично - и за това се използва функцията CreateProcess, а не ShellExecute (Ex).

Но защо да не използваме ShellExecute (Ex) за стартиране на програми? Ето няколко причини (някои от причините може да не са винаги приложими):

  1. Тежест. ShellExecute (Ex) е много по-тежък от CreateProcess, тъй като се нуждае от множество четения в регистъра, за да намира и разрешава асоциации, да проверява за замествания и т.н. (можете да видите колко лошо е от тази статия - вижте раздела The Nitty Gritty и по-долу). Също така ShellExecute (Ex) е функция Shell (импортирана от shell32.dll), а CreateProcess е функция на ядрото (импортирана от kernel32.dll). С други думи, в компактни и/или невизуални програми, плъзнете цялата Shell (shell32.dll) към себе си - заради само една функция, без която можете да се справите;
  2. Уязвимост. ShellExecute (Ex) приема само пълния команден ред, докато CreateProcess ви позволява да посочите изрично името на програмата и отделно командния ред.