OpToSoapDomComv.TRefCache.FNodes包含对不存在的XMLNode的引用

时间:2011-01-10 12:50:27

标签: delphi soap webservice-client

在我们的D2007应用程序中,我们使用的是Web服务,可以使用THTTPRIO对象访问。 当包含THTTPRIO对象的TDatamodule被销毁时,会发生访问冲突。

当释放TSoapDOMConvert时会引发此AV,然后执行:

TRefCache(RefMap[0].Instance).Free

调用

destructor TRefCache.Destroy;
begin
  FHREFs.Free;
  FMHREFs.Free;
  FNodes := nil; //Causes AV
end;

FNodes是一个TInterfaceList,包含对IXMLNodes的一个引用,但该对象似乎在所有这些之前被释放。

有谁知道这个问题?怎么解决?

[编辑]有关RIO对象用法的更多信息 THTTPRIO对象仅用于以下对Web服务的调用:

 LIResult.Assign((Rio as IWSLicenseIntf).CheckLicense(FLicenseInfo)); 

稍后将释放LIResult对象。

1 个答案:

答案 0 :(得分:2)

THTTPRIO有两种不同的终身管理方案。一个作为组件,一个作为接口。混合它们是一个坏主意。这可能是你的问题。

Jean-Marie Babet在这里评论了这一点。 http://www.delphigroups.info/2/11/344722.html

从WSDL生成的源文件应该有一个名为GetIWSLicenseIntf(或类似)的函数。尝试使用它而不是Rio组件。 将(Rio as IWSLicenseIntf)更改为GetIWSLicenseIntf()并根据需要添加参数UseWSDL和URL。

另一种选择是这样的

var
  WSLic: IWSLicenseIntf;
  RIO: THTTPRIO;
begin
  RIO := THTTPRIO.Create(nil);
  RIO.URL := 'www.whatever.com';
  WSLic := RIO as IWSLicenseIntf;
  LIResult.Assign((WSLic).CheckLicense(FLicenseInfo)); 
end;

Delphi中的接口是引用计数的,因此您不应该释放WSLic而不是释放RIO。当WSLic超出范围时,它将被释放。 代码当然没有经过测试,因为我没有你的代码。