难题?(100分)

  • 主题发起人 主题发起人 zqs10597249
  • 开始时间 开始时间
Z

zqs10597249

Unregistered / Unconfirmed
GUEST, unregistred user!
三层结构中,前端自己定义了一个结构,怎么把这个结构传给中间层?急!!!
谢谢!最好给给小例子。
 
直接调用不就得啦
 
没搞过,,,GZ
 
前端与后端只能传递微软的标准定义的东西,
建议如此使用
请声名一个Variant变量,请将你的结构内容赋给一个数组
例:
type
myrecord=record
s1:string;
s2:string;
end;
myx:myrecord;
......
mytype:Variant;
.....
mytype:=VarArrayCreate(mytype[1..2],varString);
mytype[1]:=myx.S1;
mytype[2]:=myx.S2;
.....
DCom.Appserver.Setmytype(mytype);
服务器上:
Setmytype(Serv:Variant);
begin
相同的结构变量.S1:=String(Serv[1]);
相同的结构变量.S2:=String(Serv[2]);
end;
 
to:redkingbird
这样的做法,我没有问题
只是现在我用结构的话可以很容易看清楚字段的对应,如果用数组的话那么就要写文档
说明了,而且不明了。因为我们开发是中间层和客户端分开来开发的。
 
在中间层也定义一个接口
 
老兄,公牛是不下小牛的。
DCOM协义没有添加此功能,请绕绕道吧。
 
还是没有好的办法吗?
那我只好用数组了,唉
 
我是通过Stream和OleVariant的转换传递的。
先把自定义记录类型读到Stream,再转成OleVariant,传递到另一方后,OleVariant转换
成Stream,再读出记录。对象也可以这样。
用惯了,也没有再去找其他简单方法!
procedure VariantToStream(const Data: OleVariant;
Stream: TStream);
var
p: Pointer;
begin
p := VarArrayLock(Data);
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1);
//assuming low bound = 0
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;
//start from begin
ning of stream
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Result);
end;
end;
 
to:GanQuan
procedure VariantToStream(const Data: OleVariant;
Stream: TStream);
是客户端程序
function StreamToVariant(Stream: TStream): OleVariant
是服务端程序
那么你怎么传递 TStream,有那种变量??
 
你搞错了!
服务端和客户端都要有你的结构说明。
服务端提供的方法参数为Olevariant类型。
举个例子
服务器端:
TMyRecord = record
no: Integer;
name: string
address: string;
end;

procedure VariantToStream(const Data: OleVariant;
Stream: TStream);
var
p: Pointer;
begin
p := VarArrayLock(Data);
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1);
//assuming low bound = 0
finally
VarArrayUnlock(Data);
end;
end;

procedure TcoServerObj.GetInfo(vDatas: OleVariant);
var
MyStream: TMemoryStream;
vInfo: TMyRecord;
s: String;
begin
MyStream := TMemoryStream.Create;
VariantToStream(vDatas,MyStream);
MyStream.Seek(0,soFrombegin
ning);
MyStream.Read(vInfo,sizeof(TMyRecord));
MyStream.Free;
s := vInfo.name;
.........处理你的数据
end;

************************************************
客户端:
TMyRecord = record
no: Integer;
name: string
address: string;
end;

function StreamToVariant(Stream: TStream): OleVariant;
var
p: Pointer;
begin
Result := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(Result);
try
Stream.Position := 0;
//start from begin
ning of stream
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Result);
end;
end;

procedure TFrom1.BitBtn1Click(Sender: TObject);
var
ServerObj: IServerObj;
vInfo: TMyRecord;
MyStream: TMemoryStream;
begin
ServerObj := CoServerObj.CreateRemote('FreeSky');
//创建过程参数
MyStream := TMemoryStream.Create;
MyStream.Write(vInfo,sizeof(TServerInfo));
MyStream.Seek(0,soFrombegin
ning);
ServerObj.GetInfo(StreamToVariant(MyStream));//把流转成OleVariant当参数传递
MyStream.Free;
end;

如果需要反向传数据就反过来就行了!
 
对了
在客户端先给你的结构赋值,再用流读入。
begin
vInfo.no := ...
vinfo.name := ...
......
ServerObj := CoServerObj.CreateRemote('FreeSky');
MyStream := TMemoryStream.Create;
MyStream.Write(vInfo,sizeof(TServerInfo));
。。。。。
 
多人接受答案了。
 
后退
顶部