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

Выполнение выбора пользователя

Последний метод в IContextMenu - это InvokeCommand(). Это метод вызывается, когда пользователь щелкнет на пункте меню, который мы добавили. Прототип для InvokeCommand():

HRESULT IContextMenu::InvokeCommand ( LPCMINVOKECOMMANDINFO pCmdInfo );

Структура CMINVOKECOMMANDINFO содержит целую тонну информации. Но для наших целях важно позаботиться только о lpVerb и hwnd. lpVerb имеет двойное назначение - это может быть имя "действия" (см.выше), или индекс, сообщающий нам, какой из пунктов нашего меню был отмечен щелчком. hwnd - дескриптор окна проводника, в котором пользователь вызвал наше расширение.

Поскольку у нас только один пункт меню, мы осуществим проверку lpVerb. Если это 0, мы будем знать, что это наш пункт меню был отмечен. Самая простая вещь, которую я смог придумать - это высвечивать сообщение о том, что делает этот код. Сообщение показывает имя отмеченного файла и это докажет нам, что все действительно работает.

HRESULT CSimpleShlExt::InvokeCommand ( LPCMINVOKECOMMANDINFO pCmdInfo )

{

// If lpVerb really points to a string, ignore this function call and bail out.

if ( 0 != HIWORD( pCmdInfo->lpVerb ))

return E_INVALIDARG;

// Get the command index - the only valid one is 0.

switch ( LOWORD( pCmdInfo->lpVerb ))

{

case 0:

{

TCHAR szMsg [MAX_PATH + 32];

wsprintf ( szMsg, _T("The selected file was:\n\n%s"), m_szFile );

MessageBox ( pCmdInfo->hwnd, szMsg, _T("SimpleShlExt"),

MB_ICONINFORMATION );

return S_OK;

}

break;

default:

return E_INVALIDARG;

break;

}

}

Регистрация расширения оболочки

Итак, мы осуществили все интерфейсы, но как сделать, чтобы проводник мог использовать наше расширение? ATL автоматически генерирует код, который регистрирует нашу DLL как COM сервер, но это всего лишь позволит другим приложениям использовать нашу DLL. Для того чтобы сообщить проводнику, что наше расширение существует, мы должны зарегистрировать его в секции, которая содержит информацию о TXT-файлах:

HKEY_CLASSES_ROOT\txtfile

Под этим ключом укажем ключ ShellEx , содержащий список расширений оболочки, вызываемых для TXT-файлов. Под ключом ShellEx ключ ContextMenuHandlers содержит список расширений контекстного меню. Каждое расширение создает свой субключ под ключом ContextMenuHandlers и устанавливает значение этого ключа по своему GUID. Например, для нашего простого расширения, создадим ключ:

HKEY_CLASSES_ROOT\txtfile\ShellEx\ContextMenuHandlers\SimpleShlExt

и установим его default значение согласно нашему GUID:"{5E2121EE-0300-11D4-8D3B-444553540000}".

Однако вы не должны писать любой код, чтобы это сделать. Посмотрите список файлов и найдите файл SimpleShlExt.rgs. Это текстовый файл предназначен для ATL и указывает, какие ключи регистрации добавлять, когда сервер регистрируется, и какие удалять, когда сервер разрегистрируется.

Вот как выглядят данные для регистрации:

HKCR

{

NoRemove txtfile

{

NoRemove ShellEx

{

NoRemove ContextMenuHandlers

{

ForceRemove SimpleShlExt = s '{5E2121EE-0300-11D4-8D3B-444553540000}'

}

}

}

}

Каждая строка является именем ключа реестра. HKCR - сокращение для HKEY_CLASSES_ROOT. Ключевое слово NoRemove означает, что ключ не должен быть удален, когда сервер разрегистрируется. Последняя строка немного более сложная. Ключевое слово ForceRemove означает, что если ключ существует, он будет удален прежде, чем новый ключ записан. Рассмотрим остальную часть строки. Символ s означает, что подстрока, указанная после него будет сохранена, как значение по умолчанию для ключа SimpleShlExt.

Рассмотрим подробнее этот момент. Ключ, под которым мы зарегистрировали наше расширение - это HKCR\txtfile. Однако имя "txtfile" не является постоянным или предрешенным. Если вы посмотрите в HKCR\.txt, где было сохранено имя, то убедитесь, что это значение этого ключа по умолчанию. Это имеет два побочных эффекта:

  • Мы не можем надежно использовать RGS скрипт, т.к. "txtfile" может не быть корректным именем ключа.

  • Может быть установлен другой текстовый редактор, который будет ассоциировать TXT файлы с собой. Если он изменит значение по умолчанию ключа HKCR\.txt, все существующие расширения прекратят свою работу.

Мне это кажется проектным недостатком. Я думаю, Microsoft думает также, т.к. недавно созданы расширения, подобные QueryInfo, зарегистрированные непосредственно под ключом .txt.

ОК. Конец статьи. Последняя деталь о регистрации. В Windows NT/2000 мы также должны внести наше расширение в список "одобренных" расширений. Если мы этого не сделаем, наше расширение не будет доступно пользователю, который не имеет прав администратора. Этот список находится в

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Shell

Extensions\Approved

В этом ключе мы создаем string переменную, чье имя - это наш GUID. Содержание строки может быть любым. Код, выполняющий это действие, входит в наши функции DllRegisterServer() и DllUnregisterServer() .

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