首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何释放IHTMLDocument占用的内存?

如何释放IHTMLDocument占用的内存?
EN

Stack Overflow用户
提问于 2011-05-19 05:49:36
回答 4查看 4.9K关注 0票数 4

有没有办法在使用IHTMLDocument (IHTMLDocument2)后释放内存?

目前我正在使用EmptyWorkingSet函数,但我觉得这不是一个好方法

代码语言:javascript
复制
EmptyWorkingSet(GetCurrentProcess);

即使释放TWebBrowser也无济于事;问题似乎出在没有从内存中释放的IHTMLDocument COM类中。有没有一种明确的方法来发布它;像Marshal.ReleaseComObject这样的东西,但在Delphi上是可用的?

与运行JavaScript相比,它是可重现的,内存损失更少,但仍然如此。如果您将两个按钮放在窗体的顶部,并尝试执行以下代码...

代码语言:javascript
复制
uses MSHTML, SHDocVw;

type
  TForm1 = class(TForm)
  private
    WebBrowser: TWebBrowser;
    HTMLDocument: IHTMLDocument2;
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser := TWebBrowser.Create(nil);
  TWinControl(WebBrowser).Parent := Self;
  WebBrowser.SetBounds(8, 39, ClientWidth-16, ClientHeight-47);
  WebBrowser.Navigate('http://maps.google.com/');
  HTMLDocument := WebBrowser.Document as IHTMLDocument2;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  WebBrowser.Free;
  HTMLDocument := nil;
end;

每次释放WebBrowser后,您都会看到内存丢失。当我运行我的JavaSrcipt时,它甚至超过300MB,大约1MB,这可能会导致内存泄漏,如果我运行这么多次的话。

非常感谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-19 06:10:13

通常,当您释放对COM类的所有引用时,它们应该被释放。通常,这可以通过将nil赋值给所有持有对其接口的引用的变量来实现。

要立即释放COM DLL使用的内存,可以使用CoFreeUnusedLibrariesEx

票数 3
EN

Stack Overflow用户

发布于 2011-05-19 06:16:09

我不知道Delphi,但我在C++中使用过IHTMLDocument。我认为您需要调用Release()方法。我还知道它将BSTR用于字符串,因此这可能是另一个查找未被释放的内存的地方。

票数 0
EN

Stack Overflow用户

发布于 2011-05-20 01:25:03

在释放之前,您是否尝试过导航(‘about:blank’)?这应该已经释放了一些内存。我还认为WebBrower的内部结构(与Internet Explorer的内部结构大致相同)在内存中保留了许多内容,只是为了将历史记录和缓存提供给这个可执行文件会话中可能存在的任何其他TWebBrowser (或者更具体地说,IWebBrowser2 ),即使在(不久的)将来也是如此。

如果幸运的话(如果您使用的是导航或Navigate2),如果您使用flags like navNoHistory, navNoWriteToCache或其他方法调用,则可以更改这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6051437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档