【问题标题】:TWebBrowser memory leaks and access violationsTWebBrowser 内存泄漏和访问冲突
【发布时间】:2014-09-16 01:56:37
【问题描述】:

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

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

【问题讨论】:

    标签: c++builder twebbrowser


    【解决方案1】:

    这是 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 2012-05-22
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      相关资源
      最近更新 更多