TWebBrowser内存泄漏和访问冲突

时间:2014-07-24 13:21:57

标签: c++builder twebbrowser

我的C ++ Builder应用程序(RAD Studio XE4)正在泄漏内存。在进行一些调试时,我将原因跟踪到创建和销毁的表单上的TWebBrowser组件;显然,TWebBrowser或它创建的一个对象是泄漏内存。

我似乎也有一些奇怪的访问冲突:如果创建了这个带有TWebBrowser的表单,并且当前模式对话框已打开,则组策略刷新(无论是来自Windows的定期后台更新还是来自调用{ {1}})导致访问冲突。据推测,未完全删除的TWebBrowser正在尝试重新应用某些Internet Explorer设置并追逐指向已删除对象的指针。

1 个答案:

答案 0 :(得分:3)

这是C ++ Builder及其DelphiInterface属性处理中的错误。我在XE4和XE6中观察到了这一点;其他版本未经测试。

显然这与QC#106829所描述的问题相同; Delphi对IDispatch属性的处理在没有正确调用AddRef的情况下调用Release

解决方法是避免使用IDispatch Document属性,而是使用受保护的getter来获取文档:

_di_IDispatch GetDocument(TWebBrowser *browser)
{
  // Hack to change access modifiers on TWebBrowser.  Since accessing the public
  // property doesn't work, we'll access the protected getter.
  class TWebBrowserHack : public TWebBrowser
  {
  public:
    _di_IDispatch GetDocument() { return Get_Document(); }
  };

  return static_cast<TWebBrowserHack*>(browser)->GetDocument();
}