else prgCmds[0].cmdf = OLECMDF_SUPPORTED;
return S_OK;
}
В начале необходимо удостовериться в корректности переданных данных. Затем мы просто запрашиваем текущий URL и, если его последние символы .htm или .html, делаем кнопку и пункт меню доступными, или недоступными в противном случае. Следует заметить, что в этот метод всегда должен передаваться только один элемент в массиве prgCmds, т.к. мы отвечаем только за одну кнопку и пункт меню.
Теперь мы вплотную подошли к реализации основной функции нашего плагина. В ней мы будем искать содержащиеся на странице ссылки и сохранять их в файл. Код этой функции я не буду приводить здесь, т.к. он прост и не имеет прямого отношения к написанию плагинов. С ним Вы можете ознакомиться в исходном тексте демонстрационного приложения.
Как это подключить?
Теперь остался последний штрих – регистрация нашего компонента в реестре. В первую очередь, необходимо корректно зарегистрировать наш плагин как COM-сервер. Я не буду описывать эту процедуру здесь, поскольку это лежит за рамками моей статьи, да и информации на эту тему немало. Остановимся подробнее на регистрации нашей DLL в качестве плагина для Internet Explorer.
Для этого необходимо создать следующий ключ в реестре:
\Software\Microsoft\Internet Explorer\Extensions\<���ваш GUID>
В качестве может выступать либо HKEY_CURRENT_USER (в этом случае плагин будет доступен только текущему пользователю), либо HKEY_LOCAL_MACHINE (плагин будет доступен всем пользователям).
Теперь в нём необходимо создать следующие параметры:
ButtonText |
Текст всплывающей подсказки для кнопки. Значение может быть как текстом, так и строкой следующего формата @dll_path,-ID, где dll_path путь к DLL плагина, ID – идентификатор строки в string table. |
CLSID |
Всегда {1FBA04EE-3024-11d2-8F1F-0000F87ABD16} |
Default Visible |
Будет ли кнопка, сразу после регистрации плагина, находиться на панели ('yes') или пользователь должен будет добавить её на панель самостоятельно ('no' или если параметр отсутствует). |
ClsidExtension |
GUID плагина, как COM-сервера (из раздела HKCR\CLSID). |
HotIcon |
Путь к иконке, соответствующей активному состоянию кнопки (когда на неё наведена мышь). Если путь указывает на .dll или .exe файл, то после него, через запятую, указывается идентификатор ресурса. |
Icon |
Путь к иконке, соответствующей обычному состоянию кнопки. |
MenuText |
Текст пункта в меню сервис. |
MenuStatusBar |
Текст подсказки, появляющейся в строке состояния, когда пункт меню активен (формат аналогичен параметру ButtonText). |
Файл, на который указывает параметр HotIcon, должен содержать следующие цветные значки:
• 16×16 16 цветов
• 20×20 16 цветов (не обязательно)
• 20×20 256 цветов
Второй файл (соответствующий параметру Icon) должен содержать значки в оттенках серого. Параметры этих значков следующие:
• 16×16 16 оттенков серого
• 20×20 16 оттенков серого (не обязательно)
• 20×20 256 оттенков серого
Вообще-то и эти значки могут быть цветными, но в таком случае они не будут соответствовать общему стилю оформления панелей инструментов Internet Explorer. Подробнее о стиле, в котором должны быть решены эти кнопки можно прочитать здесь).
Выполнение операций по добавлению информации в реестр логично возложить на функцию DllRegisterServer, экспортируемую нашей DLL. Именно так сделано в примере к этой статье. Также в демонстрационном приложении реализована функция DllUnregidterServer, удаляющая всю информацию о плагине из реестра.
Что в итоге?
Теперь, если вы следовали приведённым выше действиям, на панели инструментов Internet Explorer должна появиться кнопка, а в меню 'Сервис' строка меню, запускающая наш плагин.
Надеюсь, что написание плагинов для самого популярного в мире браузера не показалось вам трудным. Если так, то у вас наверняка появилось желание поэкспериментировать с компонентами, расширяющими функциональность браузера. В этом случае я могу считать, что цель, к которой я стремился при написании этой статьи, достигнута.
How do you create an edit control that echoes '#' for any character the user types?
1. Super-class the edit control, override the WM_CHAR message, and also override the WM_PAINT message to echo the '#' char.
2. Send the edit control a WM_PASSWORD message and then send a WM_SETPASSWORDHAR message to specify the '#' char.
3. Send the edit control an EM_PASSWORD message and then send an EM_SETPASSWORDHAR message to specify the '#' char.
4. Use the ES_PASSWORD style and then send an EM_SETPASSWORDCHAR message to specify the '#' char.
5. Sub-class the edit control, override the WM_CHAR message, and also override the WM_PAINT message to echo the '#' char.
Вариант 1 неверен, т.к. действие "super-class the edit control" не имеет смысла. Варианты 2 и 3 также неверны, потому что сообщений WM_PASSWORD, WM_SETPASSWORDCHAR и EM_PASSWORD не существует. Вариант 5 неверен, т.к. существует стандартный и более простой способ. Правильный ответ — вариант 4, существует и стиль ES_PASSWORD, и сообщение EM_SETPASSWORDCHAR, которые предназначены как раз для решения этой проблемы.
Читать дальше