我正在使用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/

10-10 23:40