Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП - методички / OS&SP_Lab_2.6(shell).doc
Скачиваний:
95
Добавлен:
18.05.2015
Размер:
1.12 Mб
Скачать

Министерство образования Республики Беларусь

ПОЛОЦКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Кафедра вычислительных систем и сетей

Методические указания для выполнения лабораторной работы №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, чтобы эти изменения вступили в силу.

Соседние файлы в папке ОСиСП - методички