Что такое IHTMLElemen и IHTMLDocument2?

Гобелен - кликните для возврата на главную

Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.

Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Жладимира Вольфовича Жириновского.

Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.

Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.

Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!

104 549 руб.

Описание товара

В контексте TWebBrowser в C++ Builder 6 и других COM-объектах, связанных с Internet Explorer, IHTMLElement и IHTMLDocument2 — это интерфейсы COM, предоставляющие доступ к HTML-документу и его элементам. Они являются частью MSHTML (движка IE) и позволяют управлять содержимым страницы программно. Ниже приведены ключевые особенности.

IHTMLDocument2 — интерфейс документа

Это основной интерфейс для работы с HTML-документом, загруженным в TWebBrowser. Он предоставляет методы для:

  • Доступа к DOM (Document Object Model).
  • Изменения содержимого страницы.
  • Управления элементами (формами, ссылками, скриптами).

Основные методы:

МетодОписание
get_bodyПолучает указатель на документа (IHTMLElement*)
getElementByIdНаходит элемент по его id
writeЗаписывает HTML-код в документ (перезаписывает содержимое)
createElementСоздает новый HTML-элемент
get_URLВозвращает URL текущего документа

Пример использования:

C++
    
// Получаем интерфейс документа
IHTMLDocument2* doc = (IHTMLDocument2*)WebBrowser1->Document;
if (doc != NULL) {
    // Записываем новый HTML
    doc->write(L"<h1>Hello from C++!</h1>");
    doc->close();
    doc->Release(); // Важно освободить COM-объект!
}

  

IHTMLElement — интерфейс элемента

Этот интерфейс представляет любой HTML-элемент на странице (например, <div>, <p>, <input>). С его помощью можно:

  • изменять атрибуты элемента (id, class, style и т.д.);
  • модифицировать содержимое элемента;
  • управлять позицией элемента в DOM.

Основные методы

МетодОписание
get_innerHTML / put_innerHTMLПолучает или устанавливает HTML-содержимое элемента
get_innerText / put_innerTextРаботает с текстовым содержимым
insertAdjacentHTMLВставляет HTML в указанную позицию (например, beforeEnd)
setAttributeУстанавливает атрибут элемента (например, class или style)
get_parentElementПолучает родительский элемент

Пример использования:

C++
    
// Получаем элемент по id
IHTMLElement* element = NULL;
doc->getElementById(L"myDiv", &element);
if (element != NULL) {
    // Меняем текст
    element->put_innerText(L"Новый текст");
    // Добавляем HTML
    element->insertAdjacentHTML(L"beforeEnd", L"<span>Дополнительно</span>");
    element->Release(); // Освобождаем COM-объект
}

  

Как они связаны?

IHTMLDocument2 — это «входная точка» для работы с документом. Через него вы получаете доступ к элементам (IHTMLElement).

IHTMLElement — конкретный элемент на странице, который можно модифицировать.

Пример взаимодействия

C++
    
// 1. Получаем документ
IHTMLDocument2* doc = (IHTMLDocument2*)WebBrowser1->Document;
if (doc != NULL) {
    // 2. Получаем элемент body
    IHTMLElement* body = NULL;
    doc->get_body(&body);
    
    if (body != NULL) {
        // 3. Добавляем новый div в body
        body->insertAdjacentHTML(L"beforeEnd", 
            L"<div id='msg'>Сообщение из C++</div>");
        body->Release();
    }
    doc->Release();
}

  

Важные нюансы для C++ Builder 6

COM-объекты и память:

  • Всегда вызывайте Release() для интерфейсов, чтобы избежать утечек памяти.
  • Используйте WideString (Unicode) для строк, так как IE6 работает с UTF-16.

Безопасность:

Проверяйте указатели (doc != NULL, element != NULL) перед использованием.

Поддержка IE6:

Некоторые современные методы DOM могут отсутствовать. Используйте базовые функции, как в примерах выше.

Отладка:

Если что-то не работает, проверьте:

  • Загружен ли документ (WebBrowser1->Document != NULL).
  • Корректность ID элементов (getElementById может вернуть NULL).

Практический пример: добавление сообщения в чат

C++
    
void AddChatMessage(TWebBrowser* browser, const WideString& user, const WideString& text) {
    IHTMLDocument2* doc = (IHTMLDocument2*)browser->Document;
    if (doc != NULL) {
        IHTMLElement* chatContainer = NULL;
        doc->getElementById(L"chat-container", &chatContainer);
        
        if (chatContainer != NULL) {
            // Создаем HTML для нового сообщения
            WideString html = 
                L"<div class='message'><span class='user'>" + user + 
                L":</span> " + text + L"</div>";
                
            // Добавляем в конец контейнера
            chatContainer->insertAdjacentHTML(L"beforeEnd", html.c_bstr());
            chatContainer->Release();
        }
        doc->Release();
    }
}

  

Итог

IHTMLDocument2 — интерфейс для работы с документом (аналог document в JavaScript).

IHTMLElement — интерфейс для управления конкретными элементами (аналог element в JS).

Используйте их для динамического обновления содержимого TWebBrowser без временных файлов.

Эти интерфейсы — основа для взаимодействия C++-кода с HTML в компоненте TWebBrowser. Они дают полный контроль над страницей, но требуют аккуратной работы с COM-памятью.

Другие товары

Вы так же можете прочитать следующие статьи: