用socketconnection的Dispatch调用方式的问题,(还没有结束!!!!!) (200分)

  • 主题发起人 主题发起人 susu
  • 开始时间 开始时间
S

susu

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器接口
ItestDisp = dispinterface
['{3078FB3B-0F31-45F8-91D0-1CDED09FC236}']
procedure getinfo(var para: OleVariant);
begin
para := VarArrayCreate([0,2],varVariant);
para[0] := 1;
para[1] := 'test_string';
end;


客户端调用代码:
uses ???_TLB;
var
test:ItestDisp;
temp:Variant;
begin
test:=ItestDisp(Idispatch(SocketConnection1.AppServer));
test.getinfo(temp);
showmessage(temp[1]);
end;
编译时出错,将temp声明改为OleVariant后编译通过,但执行到test.getinfo(temp);时出错!
我如何才能用Dispatch Table方式,在客户端得到这两个返回值?
 
用法是没错,但你可能忽略了一点:没有打开TSocketConnection就调用接口方法,从而导致
出错。
procedure TForm1.Button1Click(Sender: TObject);
var Test: ISC_DelphiDCOMSvrDisp;
V: OleVariant;
begin
SConn.Open;
Test := ISC_DelphiDCOMSvrDisp(IDispatch(SCOnn.AppServer));
Test.GetInfo(V);
ShowMessage(V[1]);
SConn.Close;
end;
如果不是这个原因,那么就要重设一个TSocketConnection的GUID,如果服务器端重新建立
了一个同名的接口(但GUID不同),而客户端没有刷新的情况下,也是会调用失败的。
 
大富翁都那里去了??
 
我要晕了,我在另一台机子上试了,可以哦!
可能真如Sachow所说的是没有刷新的原故?? 那又如何刷新及刷新何处??
更奇怪的是如果服务端改为:
ItestDisp = dispinterface
['{3078FB3B-0F31-45F8-91D0-1CDED09FC236}']
function getinfo: WideString;
begin
{ para := VarArrayCreate([0,2],varVariant);
para[0] := 1;
para[1] := 'test_string';
}
Result := 'ddddd';
end;

在客户端用:showmessage('第二次调用:' + SocketConnection1.AppServer.getinfo);则成功
但用Dispatch调用方式调用则不成功,还是出错!!!!!!!!!

 
我指的客户端刷新接口是:点击“Project->Remove from project”,把原来引入的XXX_TLB
接口单元移除,然后再次点击“Project->Import type library”引入同一个组件的接口单
元,这样就实现刷新了。实质上是要更新$Delphi/imports目录下的XXX_TLB.pas文件。
function getinfo: WideString;
begin
{ para := VarArrayCreate([0,2],varVariant);
para[0] := 1;
para[1] := 'test_string';
}
//Result := 'ddddd';
//[red]看样子不对,应该给返回参数分配内存,改为下面:[/red]
Result := StringToOleStr('ddddd');
end;
 
后退
顶部