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

Регистрация расширения

Расширение 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() немного отличаются в этом случае, поэтому я еще вернусь к этой теме в следующих статьях.

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