我正在使用Delphi XE。我遇到了使用Delphi Soap的内存泄漏问题。事实证明是由于QC 91160中描述的TWSDLLookup.Destroy
中缺少.Free调用所致
我遇到的问题是所描述的解决方法,这只是将FLookup.Free
添加到TWSDLLookup.Destroy
方法中。
我不想更改Delphi源代码,因此我尝试将单元复制到我的项目文件夹中,进行更改并重新编译,如Tom答案中的here所述。这种技术的问题在于,它显然仅在您还重新编译所有从属单元的情况下才有效。我尝试仅将WSDLLookup.pas
复制到我的项目目录中,但出现Stackoverflow错误。我不熟悉Web服务/SOAP,所以我不知道如果使用此技术还应该复制其他什么单元。
罗伯·肯尼迪(Rob Kennedy)在同一页面上的答案描述了涉及代码 Hook 的另一种技术-但这似乎不适用于对象方法。我按照他的建议完成了工作,并下载了TNT Unicode控件的免费代码并找到了相关过程,但是我一直无法找到有关如何挂接对象方法的信息-如果确实可行的话。如果可以这样做,则将钩住TWSDLLookup.Destroy
并添加FLookup.Free
调用。
任何有关如何解决此问题的想法将不胜感激。我是一个新手程序员,所以我希望我错过了一些明显的东西?
最佳答案
实际上,您要尝试执行的操作正常。我自己测试了一下。这是我使用的项目文件:
program WSDLLookupTest;
{$APPTYPE CONSOLE}
uses
WSDLLookup in 'WSDLLookup.pas';
var
intf: IInterface;
begin
intf := GetWSDLLookup as IInterface;
end.
我制作了
WSDLLookup.pas
文件的副本,并将其放置在与.dpr文件相同的目录中。然后,在副本而非原始副本中,我修改了TWSDLLookup.Destroy
。destructor TWSDLLookup.Destroy;
begin
Beep;
ClearWSDLLookup;
FLookup.Free;
inherited;
end;
我添加了
Beep
向我证明该代码确实正在执行。在您的位置上,我肯定会使用此解决方案,而不是尝试使用代码 Hook 。当然,另一个简单的解决方案是升级到更高的Delphi版本。
要注意的一件事是,在升级时,请记住要删除已修改的单元。该漏洞已在XE2中修复。
关于TWSDLLookup.Destroy方法中的Delphi XE内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13155964/