在我们的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对象。
答案 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超出范围时,它将被释放。 代码当然没有经过测试,因为我没有你的代码。