如何远程调用类!(50分)

  • 主题发起人 主题发起人 bobolyg
  • 开始时间 开始时间
B

bobolyg

Unregistered / Unconfirmed
GUEST, unregistred user!
在我现在的程序(MIDAS)中,我有一个构想,能不能象在TypeLibrary中定义Method一样,定义一个可以远程调用的类呢?
因为我在application server 中定义了一个类,类中有很多实现不同功能的方法.
我希望在Client端能调用每个方法在Server端执行,如果每个方法用一个TypeLibrary的Method函数调用的话,那不是每个Method要创建一个类的实例?并且要耗费大量的代码去初始化.这样不是很不合理?所以我希望能在Type Library中建立一个可以远程调用的类.
我只需要在Client端建立一个类的实例这样就可以在一个实例中完成多个方法的调用.
可以吗?如果可以应该怎样?
我是个菜鸟,请各为大虾指教.倾家荡产了,50分.
 
怎么没人回答我?是嫌米米太少吗?
 
这是有状态调用
如果对这个对象的两次调用是无关的
就可以在服务的private中定义
把这个对象的方法暴露到服务的接口
 
这就是n层,corba,dcom都是这样的
 
DCOM,COM+是最好的方式
 
另一个问题:
如何在Method中返回一个TStrings类型的数据到客户端?
 
function TQueueDataServer.GetGroupList: OleVariant;
var
GroupSet:TGroupSet;
strs:TStrings;
begin
strs:=TStringList.Create ;
GroupSet:=TGroupSet.Create('WorkGroup.ini');
GroupSet.proGetGroupList(strs);
Result:=strs;//出错: Incompatible types: 'OleVariant' and 'TStrings'
GroupSet.Free ;
strs.Free;
end;

应该如何写?
我想返回TStirngs类型到客户端
 
直接返回Tstrings类型恐怕做不到。可以返回一个变体数组用以代替Tstrings
 
to reallearning
能具体举个例子吗?
 
function TQueueDataServer.GetGroupList: OleVariant;
var
GroupSet:TGroupSet;
i, len: integer;
begin
strs:=TStringList.Create ;
GroupSet:=TGroupSet.Create('WorkGroup.ini');
try
GroupSet.proGetGroupList(strs);
Result := VarArrayCreate([0, len - 1], varVariant);
for i := 0 to len - 1do
Result := strs.Strings;
finally
GroupSet.Free ;
strs.Free;
end;
end;

这样子你在另一端收到数据的时候,
再把数据取出来就可以了。。
VarArrayHighBound, VarArrayLowBound....
一系列的函数专门用来处理 Variant 数据的。。。
 
to danis
客户怎么写?
procedure Client;
var
Temp:OleVariant;
strs:TStrings;
i,Count:integer;
begin
strs:=TStringList.create;
Temp:=****.appserver.GetGroupList;
for i:=0 to Count-1do
strs:=Temp;
strs.free
end;

这样应该不行吧
 
to darnis
我的客户端是这样写的:
temp:oleVariant;
i:integer;
strs:TStrings;
begin
Strs:=TStringList.Create ;
Temp:=VarArrayCreate([0,1],varvariant);
temp:=Socketconnection1.AppServer.GetGroupList;
for i:=0 to 1do
strs.Add(Temp);
编译能通过,运行是出错:"invalid argument"
是什么问题?
 
要返回TStrings,变通一下,返回Strings.Text,接收后再Strings.Text:= varResult。
 
to mfksoft
你的办法我试了,失败!
 
多人接受答案了。
 
我用这个方法可以传递一个 Table 里的数据,,,
你在方式上要注意。。

to darnis
我的客户端是这样写的:
temp:oleVariant;
i:integer;
strs:TStrings;
begin
Strs:=TStringList.Create ;
Temp:=VarArrayCreate([0,1],varvariant);
temp:=Socketconnection1.AppServer.GetGroupList;
for i:=0 to 1do
strs.Add(Temp);
编译能通过,运行是出错:"invalid argument"
是什么问题?

查错的问题,你自己要多研究,,

var
i: integer;
strs: TStrings;
varTmp: Olevariant;
begin
strs := TStringList.Create;
try
varTmp := Socketconnection1.AppServer.GetGroupList;
for i := VarArrayLowBound(varTmp, 1) to
VarArrayHighBound(varTmp, 1)do
strs.Add(varTmp);
// 这里就已经把你的数据填充到 TStrings 里了。。
//
finally
strs.free;
end;
end;

 
后退
顶部