Сообщений 12    Оценка 535        Оценить  
Система Orphus

WebBrowserControl

Автор: Олег Михайлик
Опубликовано: 19.12.2003
Исправлено: 10.12.2016
Версия текста: 1.0

Контрол-обёртка для Internet Explorer Web Browser ActiveX (с исходниками на C#)
Улучшения
Удобные названия событий и методов.
Удобные типы параметров.
Проблемы с обработкой событий
Свойства сгруппированы по категориям
Объекты модели MSHTML DOM
Вопросы лицензирования и исходный код
Контрол
COM-интерфейсы и классы
Финиш

Исходные тексты и демо-проект (C#)

Контрол-обёртка для Internet Explorer Web Browser ActiveX (с исходниками на C#)

Для работы с ActiveX-контролами в .NET Framework есть стандартный подход. Средствами .NET SDK или Visual Studio генерируем сборку, в которой будет создана обёртка для ActiveX-контрола, представляющая его в виде .NET контрола.

Так можно сгенерировать обёртку и для контрола Microsoft Internet Explorer Web Browser. И использовать функциональность браузера веб-страниц в своих программах.

Это всё хорошо, но не всегда автоматические конвертеры могут правильно сделать свою работу. Если хочешь, чтобы что-то было сделано как следует, сделай это сам. Я сделал обёртку над WebBrowser средствами только языка C#. Теперь, если вы хотите что-то передалать на свой лад, можно брать эти исходники, а не проделывать весь путь самостоятельно.

Или, если лень позволяет, просто брать этот подчищенный контрол и использовать его как есть.

Улучшения

Удобные названия событий и методов.

Вам не нравится идентификатор OnBeforeNavigate2? Теперь это событие называется BeforeNavigate. А как насчёт методов-двойников Navigate и Navigate2? Теперь они упорядочены и работают под псевдонимом Navigate.

Кроме того, названия делегатов для событий приведены к стандартному .NET-стилю. В стандартном контроле эти делегаты были длиной за тридцать символов. Тут нужно быть или программистом со стажем, или нещадно пользоваться Intellisense, иначе и не набрать такой бред.

Удобные типы параметров.

К примеру, в обычном контроле метод Navigate2 имеет несколько аргументов типа ref object. Зачем усложнять людям жизнь? Вот у меня аргументы Navigate причёсаны и типизированы. Потому, что нельзя.

Похожие исправления и с параметрами событий. Ненужные модификаторы выброшены, нетипизированные object приведены к соответствующему ситуации типу. Исходный код есть, если найдёте ошибку исправляйте. Можно такое исправление и мне заслать, а можно и забить.

Проблемы с обработкой событий

В стандартном контроле события NavigateComplete2 и BeforeNavigate2 не всегда срабатывают в соответствующий момент. Эти проблемы удалось решить.

ПРИМЕЧАНИЕ

В одном случае, кажется, ещё всплывала проблема с BeforeNavigate. Но пока эта информация не подтвердилась. В первые недели 2003-го года я ещё заинтересован в доведении до ума этого контрола, и буду стараться помогать решать подобные казусы.

Свойства сгруппированы по категориям

Тут нечего и добавить. Стандартно и удобно.

Объекты модели MSHTML DOM

В стандартном контроле можно получить доступ к содержимому документа (MSHTML DOM), используя свойство Document. В моём контроле я добавил свойства HtmlDocument, HtmlWindow и HtmlBody соответствующих типов.

Просто загрузите в контрол нужный url, дождитесь NavigateComplete, — и можно получить текст веб-страницы, HTML-содержимое, а также обратиться к любому элементу страницы.

Вопросы лицензирования и исходный код

С самого начала одной из целей проекта было создание контрола на «чистом C#». Это, к примеру, означает, что кроме сборки (dll) с самим контролом, програмисту не нужно будет никаких дополнительных Interop Assembly или ещё каких-нибудь файлов.

Контрол

Заготовку кода для самого контрола можно получить при помощи утилиты aximp.exe, входящей в .NET SDK (см. ключ /source). Собственно, сейчас основная часть кода — это переделанный и доработанный код такой заготовки.

COM-интерфейсы и классы

Но такая заготовка всё равно ссылается на интерфейсы и классы из так называемой COM Interop Assembly. Получить такую Interop Assembly проще простого, опять же при помощи утилиты из .NET SDK, tlbimp.exe. Но хотелось бы обойтись только исходным кодом.

Для таких целей тоже нашлись утилиты. Существует замечательная программа некоей фирмы Aurigma под названием Com2Net. Эта утилита преобразовывает COM Type Library в исходный код на C#. Аналогично tlbimp, но не в бинарной форме, а в исходном коде. Плюс, там ещё есть свои дополнительные возможности. Вот адрес: http://www.aurigma.com

Если вам не жалко потратиться, я сильно советую приобрести эту утилиту. Лично я с этого ничего иметь не буду, так что не считайте это рекламой. Мне удалось в своё время скачать beta-версию, и я с удовольствием пользовался ей. До тех пор, пока не выяснил у самих производителей, что использовать результаты работы этой бета-версии по существу никак нельзя. Лицензия не позволяет. Вообще говоря, я такого в лицензии не увидел, но мой английский не позволяет делать однозначных выводов. Да и самим авторам виднее.

В общем, я решил не использовать код, полученный из бета-версии Ауригмы. Очень ценная штука, жаль что мой начальник зажилил денежку. Пришлось самому сдублировать код необходимых интерфейсов. Чтобы никто не заподозрил меня в лицемерии, включаю в архив и проект-суррогат, при помощи которого я автоматизировал генерацию этих интерфейсов. Всё честно. Я не знаю, как устроена утилита Ауригмы, но сильно сомневаюсь, что похоже на мою самоделку.

Для сверки своих интерфейсов-импортов я использовал .NET Reflector и ILDASM.

Финиш

Итак, теперь у вас есть исходники контрола-обёртки для MSIE Web Browser. Моя собственная лицензия такова. Берите и используйте как хотите. Всё равно года через три это будет совершенно никому не нужно. Windows Longhorn is coming.


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 12    Оценка 535        Оценить