- •Методические указания для выполнения лабораторной работы №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 в зависимости от их типа»
- •Как установить
- •Подробности реализации
- •Задания для лабораторных работ
- •Содержание отчета
Министерство образования Республики Беларусь
ПОЛОЦКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Кафедра вычислительных систем и сетей
Методические указания для выполнения лабораторной работы №2.6 по курсу «Операционные системы и системное программирование»
«Написание расширений оболочки в MS Windows»
Полоцк, 2011
Цель работы
Научиться расширять элементы управления в ОС Windows.
Теоретические сведения
Расширение оболочки (shell extension) - это COM объект, который добавляет некоторый вид функциональности к оболочке Windows - проводнику (Explorer). Все типы расширений присутствуют в оболочке, однако слишком мало сопровождающей информации о том, что они из себя представляют и как написать свои собственные расширения. Я рекомендую отличную книгу Dino Esposito "Visual C++ Windows Shell Programming", если вы хотите получить обзор многих аспектов оболочки Windows. Для тех, у кого нет книги или кого интересуют только конкретные расширения, я написал это руководство. Оно поразит вас или по крайней мере обеспечит хорошее понимание того, как писать собственные расширения. Это руководство предполагает, что вы знакомы с основами COM и ATL.
Расширение оболочки в себя две части: оболочка и расширение. Оболочка (Shell) - это проводник Windows (Explorer), а расширение (extension) - код, который вы пишете, чтобы получить управление проводником в определенный момент (например, при щелчке правой кнопкой мышки на doc-файле). Таким образом, расширение оболочки - это COM объект, который добавляет некоторые особености к проводнику.
Расширение оболочки является внутризадачным (in-process) сервером, который реализует несколько интерфейсов, обрабатывающих связи с проводником. ATL - легчайший путь быстро создать расширение и запустить его, без нее вам пришлось бы много раз вставлять код QueryInterface() и AddRef(). С помощью ATL намного легче отлаживать код расширения в Windows NT и 2000. Как именно это делается, я объясню позже.
Существует много типов расширений оболочки. Каждый тип загружается при наступлении конкретного события. Вот несколько наиболее общих типов и ситуаций, при которых они загружаются
|
Типы |
Когда загружаются |
Что делают |
|
Обработчик контекстного меню |
Правый щелчок на файле или папке. В версиях оболочки 4.71+ также правый щелчок на фоне окна, отображающего каталог. |
Добавляет пункты к контекстному меню. |
|
Обработчик страниц свойств |
При отображении свойств файлов |
Добавляет страницы свойств |
|
Обработчик перетаскивания |
Пользователь перетаскивает файлы правой кнопкой мыши в окно каталога или на рабочий стол |
Добавляет пункты к контекстному меню, появляющемуся при отпускании кнопки. |
|
Обработчик сбрасывания |
Пользователь перетаскивает и сбрасывает объекты на файл |
Любое желаемое действие |
|
Всплывающие описания |
Указатель мыши находится над файлом или другим объектом |
Возвращает строку, которая отображается во всплывающей подсказке. |
Теперь вам наверно интересно, как выглядят расширения в проводнике. Если у вас есть инсталлированный WinZip (а у кого его нет?), вы можете увидеть много типов расширений. Одно из них - обработчик контекстного меню. Вот что WinZip 8 добавляет к контекстному меню для сжатых файлов:
WinZip содержит код, который добавляет пункты в меню, обеспечивает подсказку (текст, который появляется в строке состояния проводника), и выполняет нужные действия, когда пользователь выбирает одну из команд WinZip. WinZip также содержит обработчик перетаскивания. Этот тип расширения очень похож на расширение контекстного меню, но он загружается, когда пользователь перетаскивает файл, используя правую кнопку мыши. Вот что этот обработчик добавляет к контекстному меню:
Существует много других типов и Microsoft продолжает добавлять их в каждой новой версии Windows. Сейчас мы рассмотрим расширения контекстного меню, поскольку они легко и просто пишутся и в результате красиво смотрятся (одно удовольствие!).
Прежде чем начать кодирование, несколько указаний, которые облегчат нам работу. После загрузки расширение остается на некоторе время в памяти, что делает невозможным повторную загрузку. Чтобы иметь возможность часто перегружать расширение в оболочке, создадим ключ в реестре:
|
HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\AlwaysUnloadDLL |
и установим начальное значение = 1. В Windows 9x это самый лучший выход.
В Windows NT/2000 откроем раздел:
|
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer |
создадим параметр типа DWORD, назовем его DesktopProcess и установим значение = 1.
При этом рабочий стол и панель задач запустятся в одном процессе и последующие окна проводника запускаются каждое в своем собственном процессе. Это позволит вам делать отладку в одном окне проводника, и когда вы его закроете, ваша DLL автоматически выгрузится, и вы избегните проблем с использованным файлом. Вам необходимо сделать перерегистрацию в Windows, чтобы эти изменения вступили в силу.
