我想传递自己定义的一个对象实例到远程过程,先采用转换为流,再将流转为Variant进行传递的办法://远程过程
procedure synCsData(iRecord: OleVariant);
var
BinStrm: TStream;
formRecord: TrootForm;
p: Pointer;
begin
BinStrm:= TMemoryStream.Create;
BinStrm.Position:= 0;
p := VarArrayLock(iRecord);
BinStrm.Write(p^, VarArrayHighBound(iRecord, 1));
VarArrayUnlock(iRecord);
BinStrm.Position := 0;
formRecord:= TrootForm.create;
BinStrm.Read(formRecord,TrootForm.InstanceSize); //我想问题应该是出在这句吧?? memo1.Lines.Add(formRecord.Forder_no); //执行到这句就报错,估计这个对象实例没用转换成功
end;//客户端调用
procedure TForm1.Button1Click(Sender: TObject);
var
iRecorde: TrootForm;
writeSize: integer;
AStream: TStream;
MyBuffer: Pointer;
paraRecord: oleVariant;
begin
iRecorde:= TrootForm.create;
iRecorde.setOrderNo('1232145');
try AStream := TMemoryStream.Create;
writeSize:= AStream.Write(iRecorde,TrootForm.InstanceSize);
if writeSize<TrootForm.InstanceSize then
raise Exception.Create('读取错误'); paraRecord:= VarArrayCreate([0, AStream.Size - 1], VarByte);
MyBuffer := VarArrayLock(paraRecord);
AStream.Read(MyBuffer^, AStream.Size);
VarArrayUnlock(paraRecord); synCsData(paraRecord);
except
on E:Exception do
showmessage(E.message);
end;
end;
--然后我试着用直接转为Variant的办法:procedure synCsData(iRecord: OleVariant);
var
BinStrm: TStream;
formRecord: TrootForm;
p: Pointer;
begin formRecord:= TrootForm.create;
move(iRecord,formRecord,sizeof(iRecord)); //这样用有问题么?? memo1.Lines.Add(formRecord.Forder_no); //还是在这句报错...
end;
//调用
procedure TForm1.Button1Click(Sender: TObject);
var
iRecorde: TrootForm;
MyBuffer: Pointer;
paraRecord: oleVariant;
begin
iRecorde:= TrootForm.create;
iRecorde.setOrderNo('1232145'); paraRecord:= VarArrayCreate([0, sizeof(iRecorde)-1], VarByte);
myBuffer:= VarArrayLock(paraRecord);
Move(iRecorde,myBuffer^,sizeof(iRecorde));
VarArrayUnLock(paraRecord); synCsData(paraRecord);
end;哪里需要改动呢??请高手指点!!
procedure synCsData(iRecord: OleVariant);
var
BinStrm: TStream;
formRecord: TrootForm;
p: Pointer;
begin
BinStrm:= TMemoryStream.Create;
BinStrm.Position:= 0;
p := VarArrayLock(iRecord);
BinStrm.Write(p^, VarArrayHighBound(iRecord, 1));
VarArrayUnlock(iRecord);
BinStrm.Position := 0;
formRecord:= TrootForm.create;
BinStrm.Read(formRecord,TrootForm.InstanceSize); //我想问题应该是出在这句吧?? memo1.Lines.Add(formRecord.Forder_no); //执行到这句就报错,估计这个对象实例没用转换成功
end;//客户端调用
procedure TForm1.Button1Click(Sender: TObject);
var
iRecorde: TrootForm;
writeSize: integer;
AStream: TStream;
MyBuffer: Pointer;
paraRecord: oleVariant;
begin
iRecorde:= TrootForm.create;
iRecorde.setOrderNo('1232145');
try AStream := TMemoryStream.Create;
writeSize:= AStream.Write(iRecorde,TrootForm.InstanceSize);
if writeSize<TrootForm.InstanceSize then
raise Exception.Create('读取错误'); paraRecord:= VarArrayCreate([0, AStream.Size - 1], VarByte);
MyBuffer := VarArrayLock(paraRecord);
AStream.Read(MyBuffer^, AStream.Size);
VarArrayUnlock(paraRecord); synCsData(paraRecord);
except
on E:Exception do
showmessage(E.message);
end;
end;
--然后我试着用直接转为Variant的办法:procedure synCsData(iRecord: OleVariant);
var
BinStrm: TStream;
formRecord: TrootForm;
p: Pointer;
begin formRecord:= TrootForm.create;
move(iRecord,formRecord,sizeof(iRecord)); //这样用有问题么?? memo1.Lines.Add(formRecord.Forder_no); //还是在这句报错...
end;
//调用
procedure TForm1.Button1Click(Sender: TObject);
var
iRecorde: TrootForm;
MyBuffer: Pointer;
paraRecord: oleVariant;
begin
iRecorde:= TrootForm.create;
iRecorde.setOrderNo('1232145'); paraRecord:= VarArrayCreate([0, sizeof(iRecorde)-1], VarByte);
myBuffer:= VarArrayLock(paraRecord);
Move(iRecorde,myBuffer^,sizeof(iRecorde));
VarArrayUnLock(paraRecord); synCsData(paraRecord);
end;哪里需要改动呢??请高手指点!!
解决方案 »
- 有没有加密用的控件!请同是天涯同命鸟的程序员帮帮忙!能让我们的辛苦的工作不会白费!!!
- 怎样把vcd(.dat)文件转为rm文件,请高手指点,老师要我实现 我急啊
- 请问有DXF转其他格式的控件吗?
- 各位高手!程序里使用热键的程序,给小弟指导一下。
- 寻找合租室友 北京城铁霍营站(400元)
- TDBGrid第一行第一列中连续按Enter,光标先向左移动,移到末列时就移到下一行
- ADO 与 BDE速度讨论
- 怎么我调用远程的SQL2000 SEVER服务器时,表中有中文的字段就根本不显示呢。
- ftp 软件做了以后怎么读取文件列表。让他显示
- 一个编译时候问题。
- CCITT CRC-16校验程序怎么实现?
- 一个矩阵取数的算法,东西不多,不过我和我同学想了好久都没有想出来,麻烦大家,急呀
一般需借助第三方支持库来实现看看这个: http://www.remobjects.com/