如何在中间层中返回自定义类型(100分)

  • 主题发起人 主题发起人 kenmaj
  • 开始时间 开始时间
K

kenmaj

Unregistered / Unconfirmed
GUEST, unregistred user!
如:在一个客户端执行一个中间层的方法,返回自定义信息,另外,中间层如何通知(联系)客户端!
 
同意guqs。
最近也在烦这个问题,在网上找到一段代码是Stream和OleVariant的转换。
这样可以不管是什么数据结构(包括文件),都可以转换成流,再转换成OleVariant
进行传递。不过在两端也需要知道数据结构组成,以便转换成Stream和从Stream中读出。
procedure VariantToStream(const Data: OleVariant;
Stream: TStream);
var
p: Pointer;
begin

p := VarArrayLock(Data);
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1);

finally
VarArrayUnlock(Data);
end;

end;

function StreamToVariant(Stream: TStream): OleVariant;
var
p: Pointer;
begin

Result := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(Result);
try
Stream.Position := 0;

Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Result);
end;

end;
 
可以用variant数组,最简单的用法如下:
客户端与服务端都定义rAccReg,rAccountReg结构。
客户端将结构变为Variant:
V:Variant;
P:pointer;
V:=VarArrayCreate([0,Sizeof(rAccountReg)],varByte);
P:=VarArrayLock(V);
Move(AccountReg,P^,Sizeof(rAccountReg));
VarArrayUnLock(V);
调用 mTransaction(UserName,AccountReg);
服务器端变回来:
procedure TCliManagerApp.mTransaction(const userName: WideString;
vAccountReg: OleVariant);
var AccountReg:rAccountReg;
begin
P:=VarArrayLock(vAccountReg);
Move(P^,AccountReg,Sizeof(rAccountReg));
VarArrayUnLock(vAccountReg);
end;
 
这种方法我知道,但有别的方法吗?另外的问题知道吗?
 
自定义一个实现IDispatch接口的类,然后就可以传递接口了。
 
softdog:
详细一点!
我在IappServer接口上实现过返回自定义类型,但客户端没有办法接受和识别!
 
另外,中间层如何通知(联系)客户端!
可以用内部邮件的方式
也可以起文件服务器、消息服务器等
 
to kenmaj:
在客户端你有没有转换为服务端封装的接口?
 
to softdog:
你是说把服务端的类型库导入客户端,用前期帮定!
 
to kenmaj:
这样也可以,如果不用前期绑定,用Variant转换也可以。
 
如在服务段定一如下类型
type list=record
a:string
b:integer;
end;
执行完服务端方法后客户端得到Variant类型
怎么在客户端把Variant转换成list类型
(当然,客户端也定一相同的list类型)
 
中间层主动联系客房端好象不太好吧?服务器负担太重.
真有这种需求,是否可以这样:
1.TCPIP通信,中间层得到客户的IP,用Socket方式连接客房端,与COM无关.
2.每个客户端同时也可以当成是服务器,而中间层与客户端联系时则把自己当成客户端.
数组太麻烦了,直接用WideString,任何自定义结构都可以转换到一个string,
再转换成WideString返回客户端,客户端将其转换成string后再转换成自定义的结构.
 
多人接受答案了。
 
后退
顶部