Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как сравнить объекты в Delphi: IHTMLDocument2 и IDispatch для определения элементов внутри фрейма

Delphi , Программа и Интерфейс , Диалоги и Фреймы

Как сравнить объекты IHTMLDocument2 и IDispatch в Delphi для определения элементов внутри фрейма

При работе с встроенным веб-браузером TEmbeddedWB и фреймами в Delphi может возникнуть задача проверки наличия определенного HTML-элемента внутри фрейма. В таких случаях объект фрейма представлен интерфейсом IHTMLFrameBase2, а элемент - интерфейсом IHTMLElement. Документ фрейма (iFrame.contentWindow.document) и документ элемента (Tag.document) могут быть представлены в виде IHTMLDocument2 и IDispatch соответственно, что затрудняет их прямое сравнение.

Проблема

Прямое сравнение объектов IHTMLDocument2 и IDispatch не дает ожидаемого результата, так как они не являются идентичными типами в Delphi. Однако, известно, что оба объекта ссылаются на один и тот же экземпляр, что подтверждается отображением одинаковых адресов памяти в Watch List.

Решение

Согласно правилам COM, для определения, указывают ли два интерфейса на один и тот же объект, необходимо запросить у каждого интерфейса интерфейс IUnknown и сравнить их. В Delphi это можно сделать следующим образом:

var
  disp: IDispatch;
  doc: IHTMLDocument2;
begin
  if (disp as IUnknown) = (doc as IUnknown) then
    // Элементы принадлежат одному и тому же документу
end;

Пример кода

procedure TForm1.CheckFrameElement(const AFramedoc: IDispatch; const AElement: IHTMLElement);
var
  FrameUnknown, ElementUnknown: IUnknown;
begin
  // Получаем указатели на IUnknown для документов
  if SUCCEEDED(AFramedoc.QueryInterface(IID_IUnknown, FrameUnknown)) and
    SUCCEEDED(AElement.Document.QueryInterface(IID_IUnknown, ElementUnknown)) then
  begin
    // Сравниваем указатели
    if FrameUnknown = ElementUnknown then
      ShowMessage('Элемент находится внутри фрейма')
    else
      ShowMessage('Элемент не находится внутри фрейма');
  end;
  // Освобождаем интерфейсы
  FrameUnknown := nil;
  ElementUnknown := nil;
end;

Важно

При сравнении указателей на интерфейс IUnknown важно не забывать освобождать интерфейсы, чтобы избежать утечек памяти.

Выводы

Используя COM-интерфейс IUnknown, можно определить, указывают ли два интерфейса на один и тот же объект. Это решение позволяет корректно сравнивать объекты IHTMLDocument2 и IDispatch в Delphi для определения принадлежности HTML-элементов к документу фрейма.

Создано по материалам из источника по ссылке.

Вопрос касается сравнения объектов `IHTMLDocument2` и `IDispatch` в Delphi для определения принадлежности HTML-элементов к документу внутри фрейма при работе с встроенным веб-браузером `TEmbeddedWB`.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Диалоги и Фреймы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 15:49:40/0.0036702156066895/0