- •Методические указания для выполнения лабораторной работы №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 в зависимости от их типа»
- •Как установить
- •Подробности реализации
- •Задания для лабораторных работ
- •Содержание отчета
Регистрация расширения
Расширение DllReg оперирует исполняемыми файлами, поэтому регистрация расширения позволит загружать его на файлах EXE, DLL, OCX. Как и в первой части мы можем сделать это с помощью RGS скрипта DllRegShlExt.rgs. Вот скрипт, необходимый для регистрации нашей DLL, как обработчика контекстного меню для файлов каждого из вышеуказанных расширений.
|
HKCR { NoRemove dllfile { NoRemove shellex { NoRemove ContextMenuHandlers { ForceRemove DLLRegSvr = s '{8AB81E72-CB2F-11D3-8D3B-AC2F34F1FA3C}' } } } NoRemove exefile { NoRemove shellex { NoRemove ContextMenuHandlers { ForceRemove DLLRegSvr = s '{8AB81E72-CB2F-11D3-8D3B-AC2F34F1FA3C}' } } } NoRemove ocxfile { NoRemove shellex { NoRemove ContextMenuHandlers { ForceRemove DLLRegSvr = s '{8AB81E72-CB2F-11D3-8D3B-AC2F34F1FA3C}' } } } } |
Если вы забыли, что имеется ввиду под ключевыми словами NoRemove и ForceRemove, обратитесь к первой части, там же дается описание формата RGS-файла.
Как и для предыдущего расширения, в Windows NT/2000 мы должны внести имя своего расширения в список "одобреных" расширений. Код, реализующий это действие, содержится в функциях DllRegisterServer() и DllUnregisterServer().
Результат
После того, как вы щелкните на одном из пунктов меню, на экране появится окно диалога и покажет результаты операций:
В списке отображается имя каждого файла с отметкой, успешно или нет завершилась операция. Если вы выделите файл, в нижней части появится более подробная информация, вплоть до описания ошибки, если функция потерпела неудачу.
Другие способы регистрации расширения
В данный момент расширение может работать только с определенными типами файлов. Однако вполне возможен вызов расширения для любых типов файлов. Для этого необходимо зарегистрировать наше расширение как обработчик контекстного меню под ключом HKCR\*:
|
HKCR { NoRemove * { NoRemove shellex { NoRemove ContextMenuHandlers { ForceRemove DLLRegSvr = s '{8AB81E72-CB2F-11D3-8D3B-AC2F34F1FA3C}' } } } } |
Ключ HKCR\*, регистрирует расширения оболочки, которые должны загружаться для любых типов файлов. В документации говорится, что расширение может загружаться для любых объектов оболочки (файлы, каталоги, виртуальные папки, объекты панели управления и т.д.). Но во время моих испытаний этот факт не подтвердился. Расширения загружались только для файлов.
В оболочке версии 4.71+ ключ называется HKCR\AllFileSystemObjects. Если регистрироваться под этим ключом, расширение будет загружаться для всех файлов и каталогов, исключая корневой каталог. (Чтобы расширение загружалось для корневого каталога, мы должны зарегистрировать его под ключом HKCR\Drive. Однако я заметил странное поведение после регистрации под этим ключом. Меню SendTo также использует этот ключ, и поэтому пункты меню DllReg и SendTo перемешались:
Вы можете написать расширение, оперирующее каталогами. Пример такого расширения вы можете найти в моей статье "A Utility to Clean Up Compiler Temp Files" ("Утилита для очистки от временных файлов компилятора").
Наконец, в версии 4.71+ расширение, обработчик контекстного меню может загружаться, когда пользователь щелкает правой кнопкой мыши на фоне окна просмотра каталогов, включая рабочий стол. Для этого расширение необходимо зарегистрировать под ключом HKCR\Directory\Background\shellex\ContextMenuHandlers. Используя этот метод вы можете добавить свои собственные пункты к контекстному меню рабочего стола или любой другой директории. Параметры, передаваемые IShellExtInit::Initialize() немного отличаются в этом случае, поэтому я еще вернусь к этой теме в следующих статьях.
