- •Методические указания для выполнения лабораторной работы №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 в зависимости от их типа»
- •Как установить
- •Подробности реализации
- •Задания для лабораторных работ
- •Содержание отчета
Регистрация расширения оболочки
Регистрация расширений QueryInfo немного отличается от регистрации расширений - обработчиков контекстного меню. Наше расширение регистрируется под ключом HKEY_CLASSES_ROOT. Имя ключа содержит расширение файла, которое мы будем обрабатывать. В нашем случае это .txt. То есть ключ HKCR\.txt. Вы вероятно считаете, что подключ ShellEx по идее должен походить на "TooltipHandlers". Ничего подобного! Ключ называется "{00021500-0000-0000-C000-000000000046}".
Я думаю, Microsoft пытается протащить некоторые расширения оболочки мимо нас! Если вы тщательно пороетесь в реестре, вы найдете и другие подключи ShellEx, именами которых являются GUID'ы. Выше указан GUID для IQueryInfo.
Итак, вот необходимый RGS скрипт для загрузки нашего расширения на TXT файлах:
|
HKCR { NoRemove .txt { NoRemove shellex { NoRemove {00021500-0000-0000-C000-000000000046} = s '{F4D78AE1-05AB-11D4-8D3B-444553540000}' } } } |
Вы легко можете сделать загрузку расширения на других типах файлов. Нужно только продублировать указанный скрипт и везде изменить .txt на расширение, которое вам необходимо. К сожалению невозможно зарегистрировать расширение QueryInfo под ключами * или AllFileSystemObjects, чтобы оно загружалось на любых файлах.
Как и для предыдущих расширений, на NT и Win2000 нужно добавить наше расширение в список "одобренных" расширений. В функциях DllRegisterServer() и DllUnregisterServer() можно найти код, выполняющий эту операцию.
Пример 4 «Обработчик перетаскивания контекстного меню»
В этой части рассмотрим другой тип расширений - обработчиков контекстного меню - обработчик перетаскивания, который добавляет пункты к контекстному меню, отображаемому, когда пользователь перетаскивает объекты с помощью правой кнопки мыши. Также будет приведено еще несколько примеров использования MFC в расширении.
Обработчик перетаскивания
Каждый продвинутый пользователь знает (да и некоторые нормальные тоже), что объекты в проводнике можно перетаскивать с помощью правой кнопки мыши. Проводник отображает пункты контекстного меню, включающие все доступные действия, которые вы можете предпринять. Обычно это перемещение, копирование и создание ярлыка:
Проводник позволяет нам добавлять пункты к этому меню, используя обработчик перетаскивания . Этот тип расширения загружается, когда выполняется какая-нибудь операция перетаскивания, и расширение может добавить пункты меню, если в этом есть необходимость. Пример обработчика перетаскивания есть в WinZip. Вот что WinZip добавляет к контекстному меню, когда вы перетаскиваете и сбрасываете сжатый файл:
Расширение WinZip загружается при любой операции перетаскивания, выполняемой правой кнопкой мыши, но пункты меню добавляются только в том случае, если перетаскивается сжатый файл.
Это расширение оболочки будет использовать новую функцию API Windows 2000, CreateHardLink(), для создания жестких связей между файлами на томах NTFS. Мы добавим пункт создания жесткой связи к контекстному меню, так что пользователь сможет создавать жесткие связи тем же путем, что и обычные ярлыки.
Запустите AppWizard и создайте новый ATL COM проект. Назовем его HardLink. Поскольку в этот раз мы собираемся использовать MFC, пометьте переключатель Support MFC, затем щелкните Finish. Чтобы добавить COM объект к DLL, перейдите в дерево просмотра классов, ClassView, щелкните правой кнопкой на пункте HardLink classes и укажите New ATL Object.
В мастере ATL объектов, на первой панели уже указан Simple Object, поэтому просто щелкните Next. Во второй панели, в поле редактирования Short Name введите краткое имя HardLinkShlExt и щелкните OK. (Остальные поля заполняются автоматически.) Мы создали класс CHardLinkShlExt, который содержит основной код для реализации объекта COM. Добавим свой код к этому классу.
