Как сравнить объекты 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.