在中间层写了一个函数,客户端调用时显示“无效的被呼叫方”,什么原因?(100分)

  • 主题发起人 主题发起人 M16
  • 开始时间 开始时间
M

M16

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。请执教。
 
传递的参数类型有问题。
 
代码如下:
客户端:
procedure TForm2.Button2Click(Sender: TObject);
var
i,j:integer;
begin
i:=1;
j:=1;
DAtamodule1.DcomConnection1.AppServer.add(i,j);
showmessage(inttostr(j));
end;
服务器端:
procedure Tmidasserver.add(a: Integer;
var b: OleVariant);
begin
b:=a+b;
end;
我想实现一个加法的操作,问题在哪里?
 
将OleVariant换为其他类型试试!
 
是不是这个客户端没有访问中间层的权限?
客户端和服务器端在同一台机上也不行吗?
 
刚才的问题已经解决,现在时写怎样一个方法可以取得服务器的时间,最好有代码。
另外就是接口中的函数的参数都特别不常见,是怎么回事?
 
procedure Tmidasserver.GetLocalTime(var ServerTime: WideString);
begin
ServerTime:= DateTimeToStr(Now);
end;
不知能否满足你的要求?
我的经验是能使用Long就是用Long,能使用WideString就是用WideString,来传递参数值。
 
不行啊,说是“该方法不被自动化对象所支持!”怎么回事?
 
哈哈,你的Com+组件中没有定义该方法,要么是你把方法名写错了。
GetLocalTime是要在Com组件中定义的。另外你可以使用API:NetRemoteTOD来得到服务器端时间,不过还是在Com组件中定义一个方法来的简单方便。
 
三种可能:
一、你在客户端写的代码:DCom(ScoketConnection).AppServer.MethodName
的MethodName和你在AppServer的MethodName不一样。
二、你在AppServer写了一个新的方法, 但没有编译过。当客户端呼叫时出错(因为老的还没有)
三、你有多个AppServer端,你的客户端没有连到最新这个上。
 
我再重新试一下,各位能否把告知小弟每个参数的选项的意思,如in,out,retval,LCID等(也就是modifier)的意思,以及他们怎么样组合成什么意思,还有就是参数的数据类型,这些类型我怎么都没见过呢?他们怎么用,以及那些是常用的(比如我想解决整形浮点型的数据的运算,还有字符串的处理,还可以传递到客户端一个查询的结果)。望赐教。如问题解决,300分送上。
 
in,out,retval都是表示参数传入、传出的方向,in和out就不必说了,retval其实就是返回
值,每个方法你只能定义一个此类型的参数。
你所说的查询结果实际用的是**Recordset类型,对于参数类型的常见使用方法,看看以前的帖子吧!
 
比如加法,平常就是
function add(a,b:integer):integer;就可以。
但是再接口里面就必须是
procedure add(a: Integer;
var b: OleVariant);
safecall;
这种样子,(或者这只是一种可能的结果。)但是这里面就很混乱。
b应该是返回值,但却再传进来的参数里面。有没有更清晰的写法?或者别的方法?
 
多人接受答案了。
 
后退
顶部