2016-12-07 6 views
7

Mam TEmbeddedWB (https://sourceforge.net/projects/embeddedwb/) z elementem iFrame. Muszę się dowiedzieć, że konkretny znacznik HTML znajduje się w tym iFrame, czy nie. Mój obiekt iFrame to IHTMLFrameBase2, a Tag to IHTMLElement. Wiem, że iFrame.contentWindow.document (który jest IHTMLDocument2) jest taki sam jak Tag.document. Ale Tag.document jest obiektem IDispatch, dlatego dodaje daje fałszywy:Jak ustalić, czy dokument IHTMLDocument2 jest równy dokumentowi IDispatch w Delphi?

if iFrame.contentWindow.document = Tag.document then ShowMessage('In iFrame') 
else ShowMessage('Not in iFrame'); 

wiem, że dwa przedmiot jest taki sam, ponieważ lista obserwacyjna może pokazać swój adres pamięci:

Watch List

Ale nie mogę pobrać ich adresów z kodu. Co próbowałem:

Addr(iFrame.contentWindow.document) // Gives variable required error 
@iFrame.contentWindow.document  // Gives variable required error 
Pointer(iFrame.contentWindow.document) //Compiles, but gives wrong address 
Format('%p',[iFrame.contentWindow.document]) //Compiles, but gives EConvertError 

Uwaga: Jeśli uruchomić linię po linii adresy że lista obserwacyjna jest pokazujące zmiany po każdej linii kodu, bez względu na kod wpływa na WebBrowser czy nie.

Odpowiedz

10

Z rules of COM:

Wymagane jest, że każde wezwanie do QueryInterface na każdym interfejsie dla danej instancji obiektu dla konkretnego IUnknown interfejsu zawsze musi zwrócić tę samą wartość wskaźnika fizycznej. Umożliwia to wywoływanie QueryInterface (IID_IUnknown, ...) na dowolnych dwóch interfejsach i porównywanie wyników w celu określenia, czy wskazują one na to samo wystąpienie obiektu (tożsamość tego samego obiektu COM).

Zapytaj ich obu o interfejs IUnknown i porównaj.

var 
    disp: IDispatch; 
    doc: IHTMLDocument2; 
.... 
if (disp as IUnknown) = (doc as IUnknown) then 
    .... 
+1

Idealne i proste rozwiązanie. Dzięki :) – Fenistil

Powiązane problemy