Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
После того как ваше приложение нашло объект файла, следующий шаг часто заключается в том, чтобы действовать так или иначе. Например, приложение может потребоваться запустить другое приложение, которое позволяет пользователю изменять файл данных. Если интересующий вас файл является исполняемым, ваше приложение может просто запустить его. В этом документе описывается, как использовать ShellExecute или ShellExecuteEx для выполнения этих задач.
Использование ShellExecute и ShellExecuteEx
Чтобы использовать ShellExecute или ShellExecuteEx, приложение должно указать файл или объект папки, на который будет совершено действие, и verb указать операцию. Для ShellExecuteназначьте эти значения соответствующим параметрам. Для ShellExecuteExзаполните соответствующие элементы структуры SHELLEXECUTEINFO. Существует также несколько других элементов или параметров, которые можно использовать для точной настройки поведения двух функций.
Объекты файлов и папок могут быть частью файловой системы или виртуальных объектов, и их можно определить по путям или указателям на списки идентификаторов элементов (PID).
Глаголы объектов
Команды, доступные для объекта, по сути, являются элементами, которые находятся в контекстном меню объекта. Чтобы найти доступные глаголы, ищите в реестре под
\ HKEY_CLASSES_ROOTCLSID\{object_clsid}\Shell\verb
где object_clsid — это идентификатор класса (CLSID) объекта и verb имя доступного verbобъекта. Подраздел verb\команды содержит данные, указывающие, что происходит при verb вызове.
Чтобы узнать, какие глаголы доступны для предопределенных Shell объектов, проверьте реестр в разделе
\ HKEY_CLASSES_ROOTobject_name\shell\verb
где object_name — это имя предопределенного Shell объекта. Опять же, подраздел verb\команды содержит данные, указывающие на то, что происходит при verb вызове.
К обычно доступным глаголам относятся:
Verb | Описание |
---|---|
edit | Запускает редактор и открывает документ для редактирования. |
find | Инициирует поиск, начиная с указанного каталога. |
open | Запускает приложение. Если этот файл не является исполняемым файлом, запускается связанное приложение. |
Выводит файл документа. | |
properties | Отображает свойства объекта. |
runas | Запускает приложение от имени администратора. Контроль учетных записей пользователей (UAC) предложит пользователю предоставить согласие на запуск приложения с повышенными привилегиями или ввести учетные данные учетной записи администратора, используемой для запуска приложения. |
Каждая verb из них соответствует команде, которая будет использоваться для запуска приложения из окна консоли. open verb является хорошим примером, поскольку обычно поддерживается. Для .exe файлов open просто запускает приложение. Однако чаще используется для запуска приложения, которое работает с определенным файлом. Например, .txt файлы можно открыть с помощью Microsoft WordPad. Таким образом, openverb для файла .txt будет соответствовать следующей команде:
"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"
При использовании ShellExecute или ShellExecuteEx для открытия файла .txt Wordpad.exe запускается с указанным файлом в качестве аргумента. Некоторые команды могут иметь дополнительные аргументы, такие как флаги, которые можно добавить при необходимости для правильного запуска приложения. Дополнительные сведения о контекстных меню и глаголах см. в разделе Расширение контекстных меню.
Как правило, попытка определить список доступных глаголов для определенного файла несколько сложна. Во многих случаях можно просто установить параметру lpVerb значение NULL, которое вызывает команду по умолчанию для типа файла. Эта процедура обычно эквивалентна настройке lpVerb на "open", но некоторые типы файлов могут иметь другую команду по умолчанию. Для получения дополнительной информации см. справочную документацию по расширению контекстных меню и справочную документацию по ShellExecuteEx.
Использование ShellExecuteEx для предоставления служб активации с сайта
Службы цепочки сайтов могут управлять множеством действий активации элементов. Начиная с Windows 8, можно предоставить указатель на цепочку сайтов для ShellExecuteEx, чтобы включить эти действия. Чтобы обеспечить доступ к сайту с помощью ShellExecuteEx:
- Укажите флаг SEE_MASK_FLAG_HINST_IS_SITE в элементе fMaskSHELLEXECUTEINFO.
- Укажите IUnknown в элементе hInstAppSHELLEXECUTEINFO.
Использование ShellExecute для запуска диалогового окна поиска
Когда пользователь щелкает правой кнопкой мыши значок папки в проводнике Windows, один из пунктов меню — "Поиск". Если они выбирают этот элемент, Shell запускает свою программу поиска. Эта программа отображает диалоговое окно, которое можно использовать для поиска файлов для указанной текстовой строки. Приложение может программно запустить служебную программу поиска для каталога, вызвав ShellExecute, с "find" в качестве параметра lpVerb и путь к каталогу в качестве параметра lpFile . Например, следующая строка кода запускает служебную программу поиска для каталога c:\MyPrograms.
ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);
Простой пример использования ShellExecuteEx
В следующем примере консольного приложения показано использование ShellExecuteEx. В большинстве случаев код проверки ошибок не указан для ясности.
#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>
main()
{
LPITEMIDLIST pidlWinFiles = NULL;
LPITEMIDLIST pidlItems = NULL;
IShellFolder *psfWinFiles = NULL;
IShellFolder *psfDeskTop = NULL;
LPENUMIDLIST ppenum = NULL;
STRRET strDispName;
TCHAR pszParseName[MAX_PATH];
ULONG celtFetched;
SHELLEXECUTEINFO ShExecInfo;
HRESULT hr;
BOOL fBitmap = FALSE;
hr = SHGetFolderLocation(NULL, CSIDL_WINDOWS, NULL, NULL, &pidlWinFiles);
hr = SHGetDesktopFolder(&psfDeskTop);
hr = psfDeskTop->BindToObject(pidlWinFiles, NULL, IID_IShellFolder, (LPVOID *) &psfWinFiles);
hr = psfDeskTop->Release();
hr = psfWinFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfWinFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszParseName, MAX_PATH);
CoTaskMemFree(pidlItems);
if(StrCmpI(PathFindExtension(pszParseName), TEXT( ".bmp")) == 0)
{
fBitmap = TRUE;
break;
}
}
ppenum->Release();
if(fBitmap)
{
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = pszParseName;
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_MAXIMIZE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
}
CoTaskMemFree(pidlWinFiles);
psfWinFiles->Release();
return 0;
}
Приложение сначала извлекает PIDL каталога Windows и перечисляет его содержимое, пока не обнаружит первый файл .bmp. В отличие от предыдущего примера, IShellFolder::GetDisplayNameOf используется для получения имени синтаксического анализа файла вместо отображаемого имени. Поскольку это папка файловой системы, разобранное имя представляет собой полный путь, который необходим для ShellExecuteEx.
После расположения первого .bmp файла соответствующие значения назначаются членам структуры SHELLEXECUTEINFO. Элемент lpFile устанавливается на имя файла для синтаксического анализа, а элемент lpVerb устанавливается на NULLдля начала операции по умолчанию. В этом случае операция по умолчанию является "открытой". Затем структура передается в ShellExecuteEx, который запускает обработчик по умолчанию для растровых изображений, обычно MSPaint.exe, чтобы open файл. После возврата функции PIDL'ы освобождаются, и интерфейс IShellFolder папки Windows с тегами освобождается.