C++builder TWebBrowser内存泄漏和访问冲突

C++builder TWebBrowser内存泄漏和访问冲突,c++builder,twebbrowser,C++builder,Twebbrowser,我的C++Builder应用程序(RAD Studio XE4)正在泄漏内存。在进行一些调试时,我找到了创建和销毁表单上TWebBrowser组件的原因;显然,TWebBrowser或它创建的对象之一正在泄漏内存 我还发现了一些奇怪的访问冲突:如果这个表单及其TWebBrowser已经创建,并且当前打开了一个模式对话框,那么组策略刷新(无论是来自Windows的定期后台更新还是来自调用gpupdate)都会导致访问冲突。据推测,未完全删除的TWebBrowser正在尝试重新应用某些Interne

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


我还发现了一些奇怪的访问冲突:如果这个表单及其TWebBrowser已经创建,并且当前打开了一个模式对话框,那么组策略刷新(无论是来自Windows的定期后台更新还是来自调用
gpupdate
)都会导致访问冲突。据推测,未完全删除的TWebBrowser正在尝试重新应用某些Internet Explorer设置,并跟踪指向已删除对象的指针。

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

显然,这与第页描述的问题相同;Delphi处理IDispatch属性调用
AddRef
,而没有正确调用
Release

解决方法是避免IDispatch
文档
属性,而是使用受保护的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();
}
\u di_IDispatch GetDocument(TWebBrowser*浏览器)
{
//黑客更改TWebBrowser上的访问修饰符。自从访问公众
//属性不起作用,我们将访问受保护的getter。
TWebBrowserHack类:公共TWebBrowser
{
公众:
_di_IDispatch GetDocument(){return Get_Document();}
};
返回static_cast(浏览器)->GetDocument();
}

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

显然,这与第页描述的问题相同;Delphi处理IDispatch属性调用
AddRef
,而没有正确调用
Release

解决方法是避免IDispatch
文档
属性,而是使用受保护的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();
}
\u di_IDispatch GetDocument(TWebBrowser*浏览器)
{
//黑客更改TWebBrowser上的访问修饰符。自从访问公众
//属性不起作用,我们将访问受保护的getter。
TWebBrowserHack类:公共TWebBrowser
{
公众:
_di_IDispatch GetDocument(){return Get_Document();}
};
返回static_cast(浏览器)->GetDocument();
}

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

显然,这与第页描述的问题相同;Delphi处理IDispatch属性调用
AddRef
,而没有正确调用
Release

解决方法是避免IDispatch
文档
属性,而是使用受保护的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();
}
\u di_IDispatch GetDocument(TWebBrowser*浏览器)
{
//黑客更改TWebBrowser上的访问修饰符。自从访问公众
//属性不起作用,我们将访问受保护的getter。
TWebBrowserHack类:公共TWebBrowser
{
公众:
_di_IDispatch GetDocument(){return Get_Document();}
};
返回static_cast(浏览器)->GetDocument();
}

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

显然,这与第页描述的问题相同;Delphi处理IDispatch属性调用
AddRef
,而没有正确调用
Release

解决方法是避免IDispatch
文档
属性,而是使用受保护的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();
}
\u di_IDispatch GetDocument(TWebBrowser*浏览器)
{
//黑客更改TWebBrowser上的访问修饰符。自从访问公众
//属性不起作用,我们将访问受保护的getter。
TWebBrowserHack类:公共TWebBrowser
{
公众:
_di_IDispatch GetDocument(){return Get_Document();}
};
返回static_cast(浏览器)->GetDocument();
}