不知WebService中是否可以按引用传递参数,按理来说应该是不可以的,把一个引用传递到远程客户端能读出实际的值吗?不过我做了个小例子却是可以的,比如:
WebService 中:
function GetMsg(var msg: string): string; 
begin
  msg:= 'You enter is ' + msg;
  Result:= msg;
end;客户端调用:
var
  Intf: Iaa;  //WebService 中的接口
  msg: string;
begin
  HTTPRIO1.URL:= 'http://192.168.3.185:1240/soap/Iaa';WebService 地址
  Intf:= HTTPRIO1 as Iaa;
  msg:= 'msg aa';
  ShowMessage(Intf.GetStr(msg));  //显示为 You enter is msg aa
  ShowMessage(msg);               //显示为 You enter is msg aa
end;这样看的话还是能够按引用传递参数的,只是我不明白其中的原理,期待高手指点一下。

解决方案 »

  1.   

    这种问题如果自己做一下截包试验的话,一切都很好解释。
    WS是基于HTTP协议的,在传参时会把对象或数据转成XML而后传递。在WS使用普通参数与变参传递的根本区别是在服务器响应事件后,会多发一条信息来更新本地的变参变量。
    如:
    函数中有变参,服务器response后的stream应该是这样      <return xsi:type="xsd:string">You enter is msg aa</return>
          <msg xsi:type="xsd:string">You enter is msg aa</msg>函数中无变参时,是这样     <return xsi:type="xsd:string">You enter is msg aa</return>
      

  2.   

    原来是这样啊
    感谢liangpei2008,不过还有点小疑问,通常说按引用传递传的是指针(指向该变量的一个内存地址),这样说的话,把一个指针传递给远程的客户端或服务端,那接收方如何知道这个地址指向的变量的实际值呢。还是说其实传递的不是地址,而是把所有内容都传递过去?
    另如何截取WS的包?望liangpei2008指点一二,谢谢!
      

  3.   

    1.
    传递的是内容,而不是地址!
    做为远程调用,二个进程的内存空间都不在一起,不可能用指针来实现的引用传递的。
    2.
    procedure TForm1.htpr1AfterExecute(const MethodName: String;
      SOAPResponse: TStream);
    begin
      (SOAPResponse as TMemoryStream).SavetoFile();
    //或者用HttpWatch来监测
    end;