線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2436
推到 Plurk!
推到 Facebook!

一个有关webservice的问题

答題得分者是:Mickey
like
一般會員


發表:30
回覆:35
積分:18
註冊:2005-03-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-01-08 14:37:48 IP:61.242.xxx.xxx 訂閱
请问一个关于webservice的问题,服务端只有一个接口IFistWS:
type
IFirstWS=interface(IInvokable)
['{4D72FE8F-6543-4DC0-91ED-796746BF4E13}']
function GetWSMsg:WideString;stdcall;
end;

implementation

uses
InvokeRegistry;

initialization
InvRegistry.RegisterInterface(TypeInfo(IFirstWS));

=====TFirstWS实现上面的接口:
type
TFistWS=class(TInterfacedObject,IFirstWS)
public
function GetWSMsg : widestring; stdcall;
end;

implementation

{ TFistWS }

function TFistWS.GetWSMsg: widestring;
begin
Result:='Test Good';
end;

procedure FirstWSFactory(out obj:TObject);
begin
obj:=TFistWS.Create;
end;

initialization
InvRegistry.RegisterInvokableClass(TFistWS,FirstWSFactory);

end.
///////////////////////////////////
客户端的HTTPRIO1的WSDLLOCATION我设置为:
http://localhost:8081/FirstWEBService.WSDemo1/wsdl/IFirstWS
我在web app debugger中看到的地址是这个。
PORT:IFirstWSPort和Serice:IFirstWSservice
都是从下拉框中的选中的。

我在button1中的代码为:
implementation

{$R *.dfm}

uses
FirstWSIntf;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
IFWebClient:IFirstWS;
begin
IFWebClient:=HTTPRIO1 as IFirstWS;
try
Edit1.Text:=IFWebClient.GetWSMsg;
finally
IFWebclient:=nil;
end;
end;

//执行到Edit1.Text:=IFWebClient.GetWSMsg;这一句时报错,提示如下:
Project clientapp.exe raised exception class ERemotableExcpetion with message 'Invalid pointer operation',Process stopped.Use Step or Run to continue.
这个错误是怎么造成的?还请各位大大们帮忙指点,谢谢!
我调试服务端时,发现是在_FreeMem(self)这一步报的错。

(附件中有这整个过程)
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-01-10 10:51:56 IP:61.219.xxx.xxx 訂閱
您好:
您 Invoke RIO 的方法不對...
最好透過 Delphi IDE...WSDL Importer...
產生的 Unit 中...會有叫做 GetIFirstWS 的 Function.
like
一般會員


發表:30
回覆:35
積分:18
註冊:2005-03-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-01-11 20:46:09 IP:218.95.xxx.xxx 訂閱
Mickey大大,十分感谢您的回贴!

我是最近看李维老师一书上的例子时遇到的问题,这个例子D6下面的,我在D7中测试,但是在点击客户端按钮时,出现这个错误提示,
后来,我就调试服务端,发现GetWSMsg这个方法已执行了,并且出错地方是在对像被释放时,也就是_FreeMem(self)这条语句出错,
于是感觉是对象释放时出了问题,想到李维老师另一书inside vcl中的接口一章的实现接口对象释放时,会出现接口引用计数为0时,会自动
将对象也释放,但如果还调用feeandnil或对象.free时就会出现错误。
在这个例子中_FreeMem(self)这条语句报错是'Invalid pointer operation',猜想是不是self已经被释放了,于是我在FirstWSFactory方法中
增加了接口引用计数:
procedure FirstWSFactory(out obj:TObject);
begin
obj:=TFirstWS.create;
(TFirstWS(obj) as IFistWS)._AddRef;
end;

这样修改后,程序运行正常了!
至于我这样理解是否正确,还请指点,谢谢!

===================引 用 文 章===================
您好:
您 Invoke RIO 的方法不對...
最好透過 Delphi IDE...WSDL Importer...
產生的 Unit 中...會有叫做 GetIFirstWS 的 Function.
系統時間:2024-03-29 14:11:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!