Kvrsoft - використання функціональності ie або замітки про webbrowser

Де шукати інформацію?

Кілька слів про реалізацію простого веб-броузера і не тільки.

Отже, маленький ліричний відступ в сторону COM

І знову про WebBrowser

Досить часто сучасного програміста припадає вирішувати питання, які пов'язані з відображенням або обробкою інформації, представленої у вигляді html-ресурсів. Наприклад, на деякому сайті наводяться щоденні котирування акцій і Вам потрібно збирати і обробляти статистку за певний період часу. Або потрібно створити сторожа, який «спостерігає» за он-лайн прайс-листом конкурента і який повинен «попереджати» про зміни ціни на певні позиції. Або потрібно написати «павука», який повинен пробігати по деякому сайту в пошуках певного тексту, причому в процесі пробіжки йому потрібно заповнити кілька реєстраційних форм, а фрагменти тексту, які він знайшов - виділити певним кольором. Можна назвати нескінченно багато подібних прикладів, але суть їх зводиться до одного - отримання веб-сторінки, витяг з неї певної частини HTML-коду програмними засобами (парсинг), і, можливо, програмне вплив на цю частину коду.

Можна, звичайно, використовуючи WinInet.dll, отримати доступ до необхідного веб-ресурсу, а потім за допомогою численних строкових функцій отримати цікаву для нас її частина. Ця технологія цілком працює, але досить трудомістка і, в більшості випадків далека від елегантності. Інший шлях - використання функціональності Microsoft Internet Explorer.

Де в Delphi живе WebBrowser?

Для будь-якого зареєстрованого в палітрі ActivX-контрола Delphi при імпорті створює клас-оболонку, яка успадковується від TOleControl. Для початку не станемо заглиблюватися в особливості TOleControl і похідних від неї оболонок - бо це справа спочатку може не так прояснити, як заплутати ситуацію. Відзначимо тільки, що оболонка і сам ActiveX є дещо різні речі. Власне TOleControl і похідні від нього оболонки є не більше, ніж засіб, яке забезпечують можливість роботи з ActiveX, як з «рідними» VCL-компонентами. Для WebBrowser від IE такою оболонкою є TWebBrowser. Якщо Ви використовуєте Delphi5, то відповідний компонент можна відшукати на закладці "Internet" палітри компонентів. Якщо Ви працюєте з Delphi4, то Вам потрібно провести імпорт відповідного ActiveX-контрола. Для цього слід скористатися меню «Import ActiveX Control» і в списку ActiveX вибрати «Microsoft Internet Controls» (зрозуміло, у Вас повинен бути встановлений IE). Компонент-оболонка за замовчуванням встановлюється на з

акладка «ActiveX» палітри компонентів. Якщо Вам потрібен не тільки компонент для відображення Web-сторінок, а Ви ще збираєтеся проводити парсинг завантажених сторінок, то Вам також слід провести імпорт mshtml.dll. Це можна зробити за допомогою меню Import Type Library, вибравши в списку рядок Microsoft HTML Object Library.

Навіть якщо Ви використовуєте Delphi5, в певних випадках є сенс виключити встановлений компонент TWebBrowser і провести імпорт відповідних компонентів самостійно. Це може бути необхідним у випадку, якщо Ви бажаєте написати додаток, сумісний з IE4, а в Delphi5 модулі mshtml.pas і shdocvw.pas розраховані на використання IE5. І як наслідок, значна частина інтерфейсів, які декларуються у відповідних модулях, що не будуть підтримуватися IE4 (наприклад, той же IHTMLDocument3). Або навпаки, Вас, можливо, зацікавила якась особливість нової версії IE, декларація якої відсутній в mshtml.pas (або shdocvw.pas) c поставки Delphi.

Якщо Ви вирішите для Delphi5 проводити самостійний імпорт mshtml.dll через Import Type Library - приберіть галочку з «Generate Component Wrapper» - в іншому випадку Delphi створить нікому не потрібні класи-оболонки для інтерфейсів і роздує результуючий файл (mshtml_tbl.pas) до неймовірних розмірів .

Зрозуміло, що якщо Ви провели імпорт, то в Delphi5 Вам замість

uses mshtml, shdocvw;

uses mshtml_tbl, shdocvw_tbl;

Якщо Ви проведете імпорт, то Ви напевно зверніть увагу на те, що крім згадуваного TWebBrowser поряд буде TWebBrowser_V1. Що це за звір? Відповідь досить проста - це сумісний з IE3 контрол. В IE4 він введений для сумісності з тими прикладними програмами, які розроблялися в розрахунку на IE3.

І закінчуючи тему експорту - в бібліотеці типів від IE досить часто використовуються імена, які є зарезервірованимі для Delphi. У більшості випадків Delphi справляється з цим завданням (наприклад перейменовуючи метод type якогось інтерфейсу в type_). Але для mshtml.dll від IE5 є один неприємний момент - там декларується константа

І якщо Ви робите імпорт в Delphi4 - то ніякого перейменування не відбувається. B як наслідок в якомусь необразливому місці на зразок нижченаведеного

function IsOk: boolean;