Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何释放IHTMLDocument使用的内存?_Delphi_Winapi_Memory_Com_Twebbrowser - Fatal编程技术网

Delphi 如何释放IHTMLDocument使用的内存?

Delphi 如何释放IHTMLDocument使用的内存?,delphi,winapi,memory,com,twebbrowser,Delphi,Winapi,Memory,Com,Twebbrowser,使用IHTMLDocument(IHTMLDocument2)后,有没有释放内存的方法 目前我正在使用函数,但我觉得这不是一个好方法 EmptyWorkingSet(GetCurrentProcess); 即使是释放特威伯犬也无济于事;问题似乎出现在IHTMLDocument COM类中,该类未从内存中释放。有没有一个明确的方法来释放它;类似于但可用于Delphi的东西 与运行JavaScript相比,它可以以更少的内存损失进行复制,但仍然可以。如果您在表单顶部放置两个按钮并尝试以下代码 us

使用IHTMLDocument(IHTMLDocument2)后,有没有释放内存的方法

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

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,但它并没有发布所有内容。谢谢