Delphi 如何释放IHTMLDocument使用的内存?
使用IHTMLDocument(IHTMLDocument2)后,有没有释放内存的方法 目前我正在使用函数,但我觉得这不是一个好方法Delphi 如何释放IHTMLDocument使用的内存?,delphi,winapi,memory,com,twebbrowser,Delphi,Winapi,Memory,Com,Twebbrowser,使用IHTMLDocument(IHTMLDocument2)后,有没有释放内存的方法 目前我正在使用函数,但我觉得这不是一个好方法 EmptyWorkingSet(GetCurrentProcess); 即使是释放特威伯犬也无济于事;问题似乎出现在IHTMLDocument COM类中,该类未从内存中释放。有没有一个明确的方法来释放它;类似于但可用于Delphi的东西 与运行JavaScript相比,它可以以更少的内存损失进行复制,但仍然可以。如果您在表单顶部放置两个按钮并尝试以下代码 us
EmptyWorkingSet(GetCurrentProcess);
即使是释放特威伯犬也无济于事;问题似乎出现在IHTMLDocument COM类中,该类未从内存中释放。有没有一个明确的方法来释放它;类似于但可用于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时,它甚至超过300KB,大约1MB,如果我运行这么多次,这可能会导致内存泄漏
非常感谢当您释放对COM类的所有引用时,COM类通常应该被释放。通常,这可以通过将nil分配给所有持有其接口引用的变量来实现
> COM DLL使用的内存立即释放,您可以使用.< /P> < P> >我不知道Delphi,但我和IHTMLDocument在C++中合作过。我相信您需要调用Release()方法。我还知道它用于字符串,所以这可能是另一个查找未释放内存的地方。
您是否尝试过导航('about:blank');在释放之前?这应该已经释放了一些内存。我还认为WebBrower的内部结构(与Internet Explorer的内部结构大致相同)在内存中保存了很多东西,只是为了将历史记录和缓存提供给任何其他TWebBrowser(或者更具体地说是IWebBrowser2),这些可执行文件可能存在于这个会话中,甚至在(不久的)将来如果运气好的话(如果您使用的是Navigate或Navigate2),您可以在与他人或其他人通话时更改此设置。此问题困扰TWebbrowser用户多年,目前尚无解决方案;释放TWebbrowser使用的内存的唯一方法是关闭应用程序并再次打开它。
EmptyWorkingSet
实际上不会释放任何内存。它只是将活动内存分页到磁盘。您的进程仍然拥有该内存;访问它会将其分页回RAM。您是如何衡量进程的内存消耗的,是什么让您认为您有问题需要解决?顺序是否重要?尝试先将nil
分配给HTMLDocument
,然后释放WebBrowser
。另一件(可能不相关的)事情是,WebBrowser.Document
可能不包含有效的IHtmlDocument2
,但在导航之后(页面可能仍在加载)。您可能应该使用类似于OnDocumentComplete
的事件。只是一个想法:在释放之前,甚至可以尝试Navigate('about:blank')
。还有一个想法:我记得有一个进程外COM类的类似问题,并解决了它。谢谢,我很高兴能提供帮助:-)Delphi在接口指针上自动调用Release
。不要手动调用它。(这有点像ATL中的CComPtr
)同样,BSTR在Delphi中由WideString
类型表示,RTL自动管理它们的生命周期,就像任何其他字符串一样。这是我尝试过的,但没有帮助。也许我只是需要一个更好的记忆表。我知道的唯一一件事是,当我调用EmptyWorkingSet
时,内存会减少(如Rob所述,通过分页到我的磁盘),但300 MB部分会消失。我认为要么你没有释放所有引用,要么你发现了一个bug(在IE控件本身或Delphi/COM层中)。首先检查您自己的代码。我已经搜索了很长时间的原因,但还没有找到任何合理的解决方案。我的脚本中有很多实例使用Google的StreetView,内存增加到了提到的300MB,即使我将HTMLDocuments指向nil,我也无法恢复它。我不能在这里给出这个脚本,但即使您尝试我粘贴的代码,每个实例也会损失大约300KB+答案是1:)+1;看起来也很有希望;我来看看。我最大的问题是解决了CofreeuniusedLibrarieSex,但它并没有发布所有内容。谢谢