【发布时间】:2021-05-14 08:07:37
【问题描述】:
我正在使用 StackOverflow (How can I get HTML source code from TWebBrowser) 中的这段代码从网页获取完整响应:
function TMain.GetWebBrowserHTML(const WebBrowser: TWebBrowser): String;
var
LStream: TStringStream;
Stream: IStream;
LPersistStreamInit: IPersistStreamInit;
begin
if not Assigned(WebBrowser.Document) then
Exit;
LStream := TStringStream.Create('');
try
LPersistStreamInit := WebBrowser.Document as
IPersistStreamInit;
Stream := TStreamAdapter.Create(LStream, soReference);
LPersistStreamInit.Save(Stream, True);
Result := LStream.DataString;
finally
LStream.Free();
end;
end;
在对一些大型网页的例程调用了几百次之后,我的内存不足。
显然组件的Document 属性存在已知问题,但将WebBrowser.Document 替换为WebBrowser.DefaultInterface.Document 的建议没有帮助。我真的不想尝试修复 VCL,如果我知道在哪里以及如何做的话,调用Release 的其他建议可能会起作用。泄漏可能完全是另一回事。此代码高于我的工资等级。
我不能使用TIdHTTP,因为必须编写一些脚本,而且我还是需要视觉效果。
【问题讨论】:
-
你知道究竟是什么泄漏吗?如果是,那是什么?如果没有,请使用 madExcept 之类的工具,它会告诉您已分配的内容和位置,但未释放。这有助于了解这些信息。
-
有趣的是,这些年来我与
TWebBrowser合作过很多次,但从未意识到这个泄漏。 “用WebBrowser.DefaultInterface.Document替换WebBrowser.Document的建议没有帮助” - 为什么不呢? -
@DelphiCoder
TStreamAdapter实现了IStream接口,并被分配给IStream变量。所以普通的接口引用计数会处理释放它。 -
@KevinDavidson 您声称遇到的
TOleControl问题实际上已在西雅图 10.0 中修复,因此您不应该在 10.3 中看到它,除非这是回归或全新泄漏。
标签: delphi memory-leaks delphi-10.3-rio twebbrowser