K kenmaj Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-11 #1 如:在一个客户端执行一个中间层的方法,返回自定义信息,另外,中间层如何通知(联系)客户端!
Z zqs10597249 Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-11 #2 同意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;
同意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;
Z zqs10597249 Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-11 #3 可以用variant数组,最简单的用法如下: 客户端与服务端都定义rAccReg,rAccountReg结构。 客户端将结构变为Variant: V:Variant; 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;
可以用variant数组,最简单的用法如下: 客户端与服务端都定义rAccReg,rAccountReg结构。 客户端将结构变为Variant: V:Variant; 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;
S softdog Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-12 #5 自定义一个实现IDispatch接口的类,然后就可以传递接口了。
K kenmaj Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-12 #6 softdog: 详细一点! 我在IappServer接口上实现过返回自定义类型,但客户端没有办法接受和识别!
Z zqs10597249 Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-12 #7 另外,中间层如何通知(联系)客户端! 可以用内部邮件的方式 也可以起文件服务器、消息服务器等
S softdog Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-13 #8 to kenmaj: 在客户端你有没有转换为服务端封装的接口?
K kenmaj Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-13 #9 to softdog: 你是说把服务端的类型库导入客户端,用前期帮定!
S softdog Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-13 #10 to kenmaj: 这样也可以,如果不用前期绑定,用Variant转换也可以。
K kenmaj Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-13 #11 如在服务段定一如下类型 type list=record a:string b:integer; end; 执行完服务端方法后客户端得到Variant类型 怎么在客户端把Variant转换成list类型 (当然,客户端也定一相同的list类型)
如在服务段定一如下类型 type list=record a:string b:integer; end; 执行完服务端方法后客户端得到Variant类型 怎么在客户端把Variant转换成list类型 (当然,客户端也定一相同的list类型)
W wolaixue Unregistered / Unconfirmed GUEST, unregistred user! 2003-02-14 #12 中间层主动联系客房端好象不太好吧?服务器负担太重. 真有这种需求,是否可以这样: 1.TCPIP通信,中间层得到客户的IP,用Socket方式连接客房端,与COM无关. 2.每个客户端同时也可以当成是服务器,而中间层与客户端联系时则把自己当成客户端. 数组太麻烦了,直接用WideString,任何自定义结构都可以转换到一个string, 再转换成WideString返回客户端,客户端将其转换成string后再转换成自定义的结构.
中间层主动联系客房端好象不太好吧?服务器负担太重. 真有这种需求,是否可以这样: 1.TCPIP通信,中间层得到客户的IP,用Socket方式连接客房端,与COM无关. 2.每个客户端同时也可以当成是服务器,而中间层与客户端联系时则把自己当成客户端. 数组太麻烦了,直接用WideString,任何自定义结构都可以转换到一个string, 再转换成WideString返回客户端,客户端将其转换成string后再转换成自定义的结构.