有没有办法在使用IHTMLDocument (IHTMLDocument2)后释放内存?
目前我正在使用EmptyWorkingSet函数,但我觉得这不是一个好方法
EmptyWorkingSet(GetCurrentProcess);即使释放TWebBrowser也无济于事;问题似乎出在没有从内存中释放的IHTMLDocument COM类中。有没有一种明确的方法来发布它;像Marshal.ReleaseComObject这样的东西,但在Delphi上是可用的?
与运行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,这可能会导致内存泄漏,如果我运行这么多次的话。
非常感谢
发布于 2011-05-19 06:10:13
通常,当您释放对COM类的所有引用时,它们应该被释放。通常,这可以通过将nil赋值给所有持有对其接口的引用的变量来实现。
要立即释放COM DLL使用的内存,可以使用CoFreeUnusedLibrariesEx。
发布于 2011-05-19 06:16:09
我不知道Delphi,但我在C++中使用过IHTMLDocument。我认为您需要调用Release()方法。我还知道它将BSTR用于字符串,因此这可能是另一个查找未被释放的内存的地方。
发布于 2011-05-20 01:25:03
在释放之前,您是否尝试过导航(‘about:blank’)?这应该已经释放了一些内存。我还认为WebBrower的内部结构(与Internet Explorer的内部结构大致相同)在内存中保留了许多内容,只是为了将历史记录和缓存提供给这个可执行文件会话中可能存在的任何其他TWebBrowser (或者更具体地说,IWebBrowser2 ),即使在(不久的)将来也是如此。
如果幸运的话(如果您使用的是导航或Navigate2),如果您使用flags like navNoHistory, navNoWriteToCache或其他方法调用,则可以更改这一点。
https://stackoverflow.com/questions/6051437
复制相似问题