TCppWebBrowser 中没有默认接口

No DefaultInterface in TCppWebBrowser

我遇到了网络浏览器内存泄漏问题 - 我在这里发现了这个问题: How can I hide WebBrowser till the website complete the loading / download process?

解决方案是使用browser.DefaultInterface.Document代替browser.Document

我正在使用这个:

DelphiInterface<IHTMLDocument2> diDoc = browser->Document;

但我正在使用 TCppWebBrowser,它只有 browser->DefaultDispatch 没有 DefaultInterfaceTWebBrowser 假设 是同一件事,但我不知道如何查询 TCppWebBrowser 以获得 IHTMLDocument2 以避免内存泄漏,直到我完全切换到内存泄漏已修复的更新版本的 RAD Studio(悉尼,目前在 2010 年).

我试过这个:

DelphiInterface<IHTMLDocument2> diDoc;
browser->DefaultDispatch->QueryInterface(IID_IHTMLDocument2, &diDoc);

但这似乎不起作用。

这有效...但是...

DelphiInterface<IHTMLDocument2> diDoc = browser->DefaultDispatch;

但是生成的 diDoc 是 NULL。 (对于 browser->Document 也不是 NULL,它也是 _di_IDispatch

我想我自己解决了这个问题。而不是:

DelphiInterface<IHTMLDocument2> diDoc =
browser->Document;

我简单地使用了:

#include <SHDocVw.hpp> // required for Shdocvw::IWebBrowser2
#include "SHDocVw_OCX.h"    // TCppWebBrowser

DelphiInterface<IHTMLDocument2> diDoc =
DelphiInterface<Shdocvw::IWebBrowser2>(browser->DefaultDispatch)->Document;

这似乎也有效:

DelphiInterface<IHTMLDocument2> diDoc =
DelphiInterface<Shdocvw::IWebBrowser2>(browser->Application)->Document;

或者:

DelphiInterface<IHTMLDocument2> diDoc = ((_di_IDispatch)browser->DefaultDispatch)->Document;
DelphiInterface<IHTMLDocument2> diDoc = ((_di_IDispatch)browser->Application)->Document;

内存泄漏似乎可以解决,就像上面答案中链接的 Delphi 等价物一样。