Сообщений 12 Оценка 535 Оценить |
Исходные тексты и демо-проект (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), используя свойство Document. В моём контроле я добавил свойства HtmlDocument, HtmlWindow и HtmlBody соответствующих типов.
Просто загрузите в контрол нужный url, дождитесь NavigateComplete, — и можно получить текст веб-страницы, HTML-содержимое, а также обратиться к любому элементу страницы.
С самого начала одной из целей проекта было создание контрола на «чистом C#». Это, к примеру, означает, что кроме сборки (dll) с самим контролом, програмисту не нужно будет никаких дополнительных Interop Assembly или ещё каких-нибудь файлов.
Заготовку кода для самого контрола можно получить при помощи утилиты aximp.exe, входящей в .NET SDK (см. ключ /source). Собственно, сейчас основная часть кода — это переделанный и доработанный код такой заготовки.
Но такая заготовка всё равно ссылается на интерфейсы и классы из так называемой 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 Оценить |