- •Методические указания для выполнения лабораторной работы №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 в зависимости от их типа»
- •Как установить
- •Подробности реализации
- •Задания для лабораторных работ
- •Содержание отчета
Использование AppWizard
Запустите AppWizard и создайте новый ATL COM проект. Назовем его SendToClone. Пометьте переключатель Support MFC и щелкните Finish. Чтобы добавить COM объект к DLL, перейдите в дерево просмотра классов, ClassView, щелкните правой кнопкой на пункте SendToClone classes и укажите New ATL Object.
В мастере ATL объектов, на первой панели уже указан Simple Object, поэтому просто щелкните Next. Во второй панели, в поле редактирования Short Name введите краткое имя SendToShlExt и щелкните OK. (Остальные поля заполняются автоматически.) Мы создали класс CSendToShlExt, который содержит основной код для реализации объекта COM. Добавим свой код к этому классу.
Интерфейс инициализации
Т.к. обработчик сбрасывания загружается на цели сбрасывания (файле, на который осуществляется сбрасывание), инициализация осуществляется посредством интерфейса IPersistFile. Вспомните, что этот интерфейс используется для расширений, оперирующих только одиночными файлами. IPersistFile имеет много методов, но расширению необходимо реализовать только один метод - Load().
Нам необходимо добавить IPersistFile в список интерфейсов, которые реализует CSendToShlExt. Откройте SendToShlExt.h и добавьте выделенные строки:
|
#include <comdef.h> #include <shlobj.h>
class ATL_NO_VTABLE CSendToShlExt : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CSendToShlExt, &CLSID_SendToShlExt>, public IDispatchImpl<ISendToShlExt, &IID_ISendToShlExt, &LIBID_SENDTOCLONELib>, public IPersistFile { BEGIN_COM_MAP(CSendToShlExt) COM_INTERFACE_ENTRY(ISendToShlExt) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IPersistFile) END_COM_MAP()
public: // IPersistFile STDMETHOD(GetClassID)(LPCLSID) { return E_NOTIMPL; } STDMETHOD(IsDirty)() { return E_NOTIMPL; } STDMETHOD(Load)(LPCOLESTR, DWORD) { return S_OK; } STDMETHOD(Save)(LPCOLESTR, BOOL) { return E_NOTIMPL; } STDMETHOD(SaveCompleted)(LPCOLESTR) { return E_NOTIMPL; } STDMETHOD(GetCurFile)(LPOLESTR*) { return E_NOTIMPL; } |
Заметьте, что Load() не делает ничего, кроме возврата S_OK. Load() получает имя файла, который является целью для сбрасывания, но для нашего расширения нет необходимости заботиться об этом имени, поэтому мы его игнорируем.
Участвуем в операции drag and drop
Чтобы выполнить свою работу, наше расширение должно связываться с источником сбрасывания, которым является проводник. Наше расширение получает список перетаскиваемых файлов, и проводник сообщает его, независимо от того, будут ли приняты эти файлы, если пользователь надумает их сбросить. Эта связь осуществляется, естественно, через интерфейс: IDropTarget. Методы IDropTarget:
DragEnter(): Метод вызывается, когда пользователь заносит файл над целью. Этот метод сообщает проводнику, примет ли расширение файлы, если они будут сброшены.
DragOver(): Не вызывается для расширений оболочки.
DragLeave(): Вызывается, когда файл утаскивают от цели без сбрасывания.
Drop(): Вызывается, когда пользователь сбрасывает на целевой файл. Вот где расширение выполняет свою работу.
Чтобы добавить IDropTarget к CSendToShlExt, откройте SendToShlExt.h и добавьте выделенные строки:
|
class ATL_NO_VTABLE CSendToShlExt : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CSendToShlExt, &CLSID_SendToShlExt>, public IDispatchImpl<ISendToShlExt, &IID_ISendToShlExt, &LIBID_SENDTOCLONELib>, public IPersistFile, public IDropTarget { BEGIN_COM_MAP(CSendToShlExt) COM_INTERFACE_ENTRY(ISendToShlExt) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IPersistFile) COM_INTERFACE_ENTRY(IDropTarget) END_COM_MAP()
protected: // ISendToShlExt CStringList m_lsDroppedFiles;
public: // IDropTarget STDMETHOD(DragEnter)(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
STDMETHOD(DragOver)(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect) { return E_NOTIMPL; }
STDMETHOD(DragLeave)();
STDMETHOD(Drop)(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect); } |
Как и в предыдущих расширениях, нам понадобится строковый список, чтобы хранить имена перетаскиваемых файлов. Метод DragOver() не нуждается в реализации, т.к. он не вызывается. Далее я приведу оставшиеся три метода.
