- •Методические указания для выполнения лабораторной работы №2.6 по курсу «Операционные системы и системное программирование»
- •Цель работы
- •Теоретические сведения
- •Пример 1 «Добавление пунктов в контекстное меню для отдельных расширений файлов»
- •Использование AppWizard.
- •Интерфейс инициализации
- •Интерфейс взаимодействия с контекстным меню
- •Модификация контекстного меню
- •Отображение подсказки в строке состояния
- •Выполнение выбора пользователя
- •Регистрация расширения оболочки
- •Отладка расширения оболочки
- •Результат
- •Пример 2 «Добавление пунктов в контекстное меню для всех файлов не зависимо от расширения»
- •Дополнительные функции расширения, добавляющего пункты к контекстному меню оболочки.
- •Использование AppWizard
- •Интерфейс инициализации
- •Добавление пунктов к меню
- •Подсказка в строке состояния и "действие"
- •Выполнение выбора пользователя
- •Регистрация расширения
- •Результат
- •Другие способы регистрации расширения
- •Пример 3 «Использование разделяемой с оболочкой памяти»
- •Расширение QueryInfo
- •Использование AppWizard
- •Интерфейс инициализации
- •Создание текста для тултипа
- •Регистрация расширения оболочки
- •Пример 4 «Обработчик перетаскивания контекстного меню»
- •Обработчик перетаскивания
- •Интерфейс инициализации
- •Модификация контекстного меню
- •Создание связи
- •Обеспечение подсказки в строке состояния
- •Создание связи
- •Регистрация расширения
- •Пример 5 «Добавления новых страниц в набор свойств файлов»
- •Обработчик набора свойств
- •Использование AppWizard
- •Интерфейс инициализации
- •Добавление страниц свойств
- •Неприятная ситуация с периодом жизни объектов
- •Функции обратного вызова страницы свойств
- •Обработчики сообщений страницы свойств
- •Регистрация расширения
- •Пример 6 «Обработчик сбрасывания в меню Send To»
- •Обработчик сбрасывания
- •Использование AppWizard
- •Интерфейс инициализации
- •Участвуем в операции drag and drop
- •DragEnter()
- •DragLeave()
- •Регистрация расширения
- •Пример 7 «Owner-drawn меню в расширениях контекстных меню и по созданию расширения контекстного меню, которое отзывается на правый щелчок на фоне окна каталога» Расширение 1 - Пункты меню owner-drawn.
- •Использование AppWizard
- •Интерфейс инициализации.
- •Взаимодействие с контекстным меню
- •Модифицирование контекстного меню.
- •Отображение всплывающей подсказки в строке состояния.
- •Выполнение выбора пользователя.
- •Рисование пункта меню.
- •Обработка wm_measureitem
- •Обработка wm_drawitem
- •Регистрация расширения оболочки
- •Расширение 2 - Обработка щелчка правой кнопкой мыши на фоне окна каталога.
- •Отличия в iShellExtInit::Initialize()
- •Отличия в регистрации.
- •Пример 8 «Добавление колонки в окно детального просмотра Проводника» Детальный просмотр в Windows 2000
- •Использование AppWizard
- •Интерфейс расширения
- •Инициализация
- •Перечисление новых столбцов
- •Отображение данных в столбцах
- •Небольшое отступление - обработка тэгов id3
- •Как это все выглядит?
- •Регистрация расширения оболочки
- •Еще одна полезная штучка - InfoTips
- •Пример 9 «Настройка иконок, отображаемых для файлов заданного типа» Файловые иконки в Проводнике
- •Использование AppWizard
- •Интерфейс расширения
- •Интерфейс инициализации
- •Интерфейс iExtractIcon
- •Извлечение методом 1
- •Извлечение методом 2
- •Регистрация расширения
- •Пример 10 «Расширение оболочки для изменения иконок у dll в зависимости от их типа»
- •Как установить
- •Подробности реализации
- •Задания для лабораторных работ
- •Содержание отчета
Пример 8 «Добавление колонки в окно детального просмотра Проводника» Детальный просмотр в Windows 2000
Windows 2000 добавляет много настроечных опций к детальному просмотру в Проводнике. Возможны 37 различных столбцов. Вы можете включать и исключать столбцы двумя путями. Во-первых, в контекстном меню выводятся 8 столбцов, если вы щелкаете правой кнопкой мыши на заголовке столбца:
Если вы выбираете More..., Проводник отображает диалог, где вы можете выбирать уже из всех доступных столбцов:
Проводник позволяет нам добавить столбцы к списку в этом диалоге с помощью специального расширения. Однако расширения не могут добавлять столбцы к списку в контекстном меню.
Демонстрационный проект для этой статьи - расширение, добавляющее для MP3 файлов столбцы, отображающие различные поля из тэгов ID3 (версии 1), которые могут быть сохранены в файлах MP3.
Использование AppWizard
Запустите AppWizard и создайте новый ATL COM проект. Назовем его MP3TagViewer. Щелкните ОК, чтобы перейти к первому (и единственному) диалогу мастера. Сохраните все установки по умолчанию и щелкните Finish. Теперь у нас есть пустой ATL проект, который построит DLL, но нам необходимо еще добавить наш COM объект-расширение. В дереве ClassView щелкните правой кнопкой мыши на пункте MP3TagViewer classes и укажите New ATL Object.
В мастере ATL Object на первой панели уже выбран Simple Object, поэтому просто щелкните Next. На второй панели в поле редактирования Short Name введите MP3ColExt и щелкните ОК (остальные поля заполнятся автоматически). Эти действия создадут класс CMP3ColExt, который содержит основной код для реализации COM объектов. Мы добавим наш код в этот класс.
Интерфейс расширения
Наше расширение для добавления столбцов реализует только один интерфейс, IColumnProvider. Нет отдельной инициализации через IShellExtInit или IPersistFile, как в других расширениях, т.к. это расширение для папки, которое никак не использует текущий выбранный элемент. Оба интерфейса, IShellExtInit и IPersistFile связаны с понятием чего-то выбранного. В нашем случае инициализация выполняется через метод интерфейса IColumnProvider.
Чтобы добавить поддержку IColumnProvider к нашему COM-объекту, откройте MP3ColExt.h и добавьте выделенные строки:
|
#include <comdef.h> #include <shlobj.h> #include <shlguid.h>
struct __declspec(uuid("E8025004-1C42-11d2-BE2C-00A0C9A83DA1")) IColumnProvider;
///////////////////////////////////////////////////////////////////////////// // CMP3ColExt
class ATL_NO_VTABLE CMP3ColExt : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CMP3ColExt, &CLSID_MP3ColExt>, public IMP3ColExt, public IColumnProvider { BEGIN_COM_MAP(CMP3ColExt) COM_INTERFACE_ENTRY(IMP3ColExt) COM_INTERFACE_ENTRY(IColumnProvider) END_COM_MAP()
public: // IColumnProvider STDMETHOD (Initialize)(LPCSHCOLUMNINIT psci) { return S_OK; } STDMETHOD (GetColumnInfo)(DWORD dwIndex, SHCOLUMNINFO* psci); STDMETHOD (GetItemData)(LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, VARIANT* pvarData); }; |
Обратите внимание, что объявление IColumnProvider находится перед объявлением класса. Этот порядок необходим для работы макроса COM_INTERFACE_ENTRY. Кто-то в Microsoft забыл определить UUID для IColumnProvider в comdef.h, поэтому нам необходимо сделать это объявление самим. В ATL есть макрос COM_INTERFACE_ENTRY_IID для использования в такой ситуации, когда для символа нет UUID, назначенного посредством __declspec(uuid()), однако, когда я использовал этот макрос, все заканчивалось передачей проводником недействительного указателя в IDispatch::GetTypeInfo(), и, в результате, аварией расширения.
Нам также необходимо сделать некоторые изменения в stdafx.h. Поскольку мы используем новые возможности Win 2000, мы должны определить несколько макросов, чтобы получить доступ к декларациям и прототипам, связанным с этими возможностями:
|
#define WINVER 0x0500 // W2K/98 #define _WIN32_WINNT 0x0500 // W2K #define _WIN32_IE 0x0500 // IE 5+ |
