在控制台应用程序中,我在数据模块上放置了一个THTTPRIO组件,并调用了SOAP服务-该服务可以按预期工作,但是当程序终止时,将发生无效的指针错误。
我尝试了两种方法来调用Web服务。首先使用THTTPRIO转换为肥皂服务器接口类型
HelloService := (DM.HTTPRIO1 as Hello);
Response := HelloService.sayHello('Delphi');
由于此操作因EInvalidPointer异常而终止,因此我在生成的绑定单元中尝试了GetHello方法。下面的源代码显示了第二次尝试。
该错误似乎是由双重释放引起的。如何访问Web服务并避免双重免费?
两种情况下的输出为:
服务器响应:您好,Delphi。
EInvalidPointer:无效的指针操作
数据调制单位代码为:
unit helloServiceDM;
interface
uses
helloService,
Classes, InvokeRegistry, Rio, SOAPHTTPClient;
type
TDataModule1 = class(TDataModule)
HTTPRIO1: THTTPRIO;
public
class procedure SayHello;
end;
implementation
uses
ActiveX, SysUtils;
{$R *.dfm}
{ TDataModule1 }
class procedure TDataModule1.SayHello;
var
DM: TDataModule1;
HelloService: Hello;
Response: string;
begin
ActiveX.CoInitialize(nil);
DM := TDataModule1.Create(nil);
try
HelloService := GetHello(False, '', DM.HTTPRIO1);
try
Response := HelloService.sayHello('Delphi');
WriteLn('Server response: ' + Response);
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
finally
DM.Free;
end;
ActiveX.CoUnInitialize;
end;
end.
p.s .:如果我在运行时创建和配置HTTPRIO实例,一切正常。但是,这也意味着事件处理程序的所有配置和连接都无法在对象检查器中完成。
答案 0 :(得分:1)
问题是HelloService
中对接口Hello
的引用。此引用超出范围,并在类方法的末尾释放。为接口提供THTTPIO
对象的数据模块在最后部分已经被破坏。
您必须在最后一部分之前添加HelloService := nil
。
DM := TDataModule1.Create(nil);
try
HelloService := GetHello(False, '', DM.HTTPRIO1);
try
Response := HelloService.sayHello('Delphi');
WriteLn('Server response: ' + Response);
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
HelloService := nil; // <---- Add this
finally
DM.Free;
end;