Добавление значков, предварительных просмотров и контекстных меню

Чтобы обеспечить индексирование и правильное представление данных пользователю во время поиска, необходимо реализовать хранилища данных оболочки (также известные как расширения пространства имен оболочки) и обработчики типов файлов (также известные как расширения оболочки, обработчики расширений или обработчики расширений оболочки).

В этом разделе описываются следующие интерфейсы:

Реализация обработчиков типов файлов

Эти расширения оболочки или обработчики типов файлов предоставляют пользователям следующие возможности оболочки:

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

Как и все com-объекты, обработчики типов файлов должны реализовывать интерфейс IUnknown и фабрику классов.

В Windows XP или более ранних версиях обработчики также должны реализовывать:

В Windows Vista интерфейсы IPersistFile и IShellExtInit были заменены следующими тремя интерфейсами для оболочки для инициализации обработчика:

Чтобы обеспечить разумное взаимодействие с пользователем, необходимо предоставить хранилище данных оболочки с обработчиком протокола. Это хранилище данных затем служит фабрикой для обработчиков значков, обработчиков контекстного меню, обработчиков предварительного просмотра и т. д. Интерфейс IShellFolder требует минимальных реализаций интерфейсов IPersist и IPersistFolder, а для IContextMenu и IExtractIcon требуется минимальная реализация интерфейса IShellFolder.

Примечание

Один и тот же идентификатор класса (CLSID) должен быть реализован для IPersist, IPersistFolder и IShellFolder.

 

Дополнительные сведения о создании хранилища данных оболочки для поддержки обработчика протокола см. в разделе Реализация базовых интерфейсов объектов папки.

IPersist

Интерфейс IPersist определяет единый метод GetClassID, предназначенный для предоставления CLSID объекта, который может постоянно храниться в системе.

Метод Описание
GetClassID Возвращает ИДЕНТИФИКАТОР CLSID объекта хранилища данных оболочки.

 

IPersistFolder

Интерфейс IPersistFolder используется для инициализации объектов папок оболочки. Реализация этого интерфейса, который является производным от IPersist, заключается в том, как папка определяется, где она находится в пространстве имен оболочки. Этот интерфейс не используется напрямую. Он используется реализацией метода IShellFolder::BindToObject файловой системы при инициализации объекта папки оболочки.

Метод Описание
Initialize Указывает объекту папки оболочки инициализировать себя на основе переданных сведений и возвращает S_OK

 

IShellFolder

Интерфейс IShellFolder используется для управления папками, и требуется частичная реализация, чтобы значки и контекстные интерфейсы, реализованные для обработчика протокола, правильно функционировали в пользовательском интерфейсе результатов Поиска Windows. Большая часть необходимых функций предоставляется с помощью метода GetUIObjectOf . Этот метод позволяет надстройке запрашивать интерфейсы IExtractIcon и IContextMenu .

Интерфейс IShellFolder использует PIDL вместо URL-адресов. В отличие от требований к полному хранилищу данных оболочки, надстройки могут использовать простую структуру IDL, содержащую только URL-адрес.

Необходимо реализовать следующие методы интерфейса IShellFolder . Пять из этих методов требуют минимальной реализации.

Метод Описание
BindToObject Возвращает E_NOTIMPL
BindToStorage Возвращает E_NOTIMPL
CreateViewObject Возвращает E_NOTIMPL
SetNameOf Возвращает E_NOTIMPL
ParseDisplayName Преобразует URL-адрес в структуру PIDL.
Идентификаторы сравнения Сравнивает два значения PIDL
GetDisplayNameOf Возвращает URL-адрес для PIDL.
GetUIObjectOf Этот метод аналогичен методу IUnknown::QueryInterface. При запросе значка вызывающий объект запрашивает IID_IExtractIcon; Если запрашивается контекстное меню, вызывающий запрашивает IID_IContextMenu

 

IShellFolder не используется для перечисления папок. Это означает, что отображаемое имя папки будет физическим URL-адресом. В будущем это может измениться.

IContextMenu

Когда Поиск Windows отображает результаты для пользователя, пользователь может щелкнуть правой кнопкой мыши элемент и увидеть контекстное меню, определенное в интерфейсе IContextMenu . Контекстные меню также называются контекстными меню.

Действие по умолчанию в контекстном меню — это то же действие, что и при двойном щелчке элемента. Без соответствующих интерфейсов IShellFolder или IContextMenu для элемента поведением по умолчанию для события двойного щелчка является передача URL-адреса в качестве аргумента функции ShellExecute .

Дополнительные сведения о создании обработчиков контекстного меню см. в статье Создание обработчиков контекстного меню и Пример расширения оболочки для обработчиков протоколов для примера кода.

IExtractIcon

IExtractIcon получает значок пользовательского интерфейса Windows Search на основе URL-адреса в PIDL, предоставленном обработчиком протокола.

Дополнительные сведения о создании обработчиков значков см. в статье Создание обработчиков значков и Пример расширений оболочки для обработчиков протоколов для примера кода.

IPreviewHandler

IPreviewHandler отображает расширенный предварительный просмотр выбранного элемента в Windows Обозреватель. Предварительные версии доступны в Windows Search 4.0 или Windows Vista с Windows Desktop Search 3.x.

Чтобы создать настраиваемый обработчик предварительного просмотра, выполните приведенные далее действия.

  1. Реализуйте IPreviewHandler , который принимает IStream, следуя рекомендациям, приведенным в разделе Предварительные обработчики.

  2. Зарегистрируйте обработчик предварительного просмотра:

    HKEY_CLASSES_ROOT\<Your_Object_Type>
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}
       @ = {<Your_PreviewHandler_GUID>}
    
  3. Выполните следующие два шага, чтобы реализовать папку оболочки для URL-адреса:

    1. В методе IShellFolder::GetUIObjectOf обработайте IQueryAssociations и верните связь для элементов оболочки, как показано в следующем примере кода.

      CComPtr<IQueryAssociations> spqa;
      AssocCreate(CLSID_QueryAssociations, __uuidof(IQueryAssociations), &spqa);
      spqa->Init(0, L"Your_Object_Type", NULL, NULL);
      spqa->QueryInterface(riid, ppvReturn);
      
    2. После того как оболочка запросит к папке Shell поток данных для инициализации обработчика предварительного просмотра, перейдите к методу IShellFolder::BindToObject Method , обработайте IID_IStream и верните IStream в URL-адрес.

Чтобы повторно использовать существующий обработчик предварительной версии для вашего типа файла, выполните следующие два действия.

  1. Зарегистрируйте обработчик предварительного просмотра для своего типа файла, используя CLSID существующего обработчика предварительного <просмотра вместо Your_PreviewHandler_GUID>.
  2. Реализуйте папку оболочки.

Дополнительные сведения о создании обработчиков предварительного просмотра см. в разделе IPreviewHandler и обработчики предварительного просмотра.

Дополнительные ресурсы

Основные понятия

Разработка обработчиков протоколов

Основные сведения об обработчиках протоколов

Уведомление индекса об изменениях

Пример кода. Расширения оболочки для обработчиков протоколов

Установка и регистрация обработчиков протоколов

Создание соединителя поиска для обработчика протокола

Обработчики протоколов отладки