如何查找IHTMLDocument2是否等于Delphi中的IDispatch文档?

Fen*_*til 7 delphi iframe

我有一个带有iFrame 的TEmbeddedWB(https://sourceforge.net/projects/embeddedwb/).我必须找出特定的HTML标签是否在iFrame内部.我的iFrame对象是a IHTMLFrameBase2,而Tag是a IHTMLElement.我知道iFrame.contentWindow.document(这是一个IHTMLDocument2)是一样的Tag.document.但是它Tag.document是一个IDispatch对象,因此下面给出了一个错误:

if iFrame.contentWindow.document = Tag.document then ShowMessage('In iFrame')
else ShowMessage('Not in iFrame');
Run Code Online (Sandbox Code Playgroud)

我知道这两个对象是一样的,因为Watch List可以显示它们的内存地址:

观察名单

但我无法从代码中获取他们的地址.我尝试过的:

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
Run Code Online (Sandbox Code Playgroud)

注意:如果我逐行运行监视列表显示的地址在每行代码后都会发生变化,无论代码是否影响WebBrowser.

Dav*_*nan 10

根据COM规则:

要求在特定接口IUnknown的给定对象实例的任何接口上对QueryInterface的任何调用都必须始终返回相同的物理指针值.这样可以在任意两个接口上调用QueryInterface(IID_IUnknown,...)并比较结果以确定它们是否指向对象的同一实例(相同的COM对象标识).

所以,问他们两个人的IUnknown界面,并进行比较.

var
  disp: IDispatch;
  doc: IHTMLDocument2;
....
if (disp as IUnknown) = (doc as IUnknown) then
  ....
Run Code Online (Sandbox Code Playgroud)