数据模块上的Delphi THTTPRIO组件导致EInvalidPointer

时间:2019-01-28 12:19:52

标签: delphi soap free delphi-2009

在控制台应用程序中,我在数据模块上放置了一个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实例,一切正常。但是,这也意味着事件处理程序的所有配置和连接都无法在对象检查器中完成。

1 个答案:

答案 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;