5

我正在使用德尔福 XE。我在使用 Delphi Soap 时遇到了内存泄漏问题。结果是由于缺少 .Free call in TWSDLLookup.Destroy,如QC 91160中所述

我遇到的问题是所描述的解决方法,它只是添加FLookup.FreeTWSDLLookup.Destroy方法中。
我不想更改 Delphi 源,所以我尝试将单元复制到我的项目文件夹,进行更改并重新编译,如Tom's answer 中所述这种技术的问题在于,它显然只有在您还重新编译所有相关单元时才有效。我尝试仅复制WSDLLookup.pas到我的项目目录,但出现 Stackoverflow 错误。我不熟悉 Web 服务/SOAP,所以我不知道如果我使用这种技术我应该复制哪些其他单元。

Rob Kennedy 在同一页上的回答描述了一种涉及代码挂钩的不同技术——但它似乎不适用于对象方法。我已按照他的建议完成并下载了 TNT Unicode 控件的免费代码并找到了相关程序,但我一直无法找到有关如何挂钩对象方法的信息——如果这确实可行的话。如果我能做到这一点,我会挂接TWSDLLookup.Destroy并添加FLookup.Free呼叫。

任何有关如何解决此问题的想法将不胜感激。我是一个新手程序员,所以我希望我错过了一些明显的东西?

4

1 回答 1

3

您正在尝试做的事情实际上可以正常工作。我自己测试了一下。这是我使用的项目文件:

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以向自己证明这段代码确实正在执行。

在您的位置上,我肯定会使用此解决方案,而不是尝试使用代码挂钩。当然,另一个简单的解决方案是升级到更高的 Delphi 版本。

需要注意的一件事是在升级时记得移除修改后的单元。XE2 中修复了泄漏。

于 2012-10-31T10:49:12.960 回答