没搞头了,帖代码!(没有人理睬,可能吸引力不够,加100,通货膨胀就是这样造成的) (100分)

  • 主题发起人 主题发起人 GanQuan
  • 开始时间 开始时间
G

GanQuan

Unregistered / Unconfirmed
GUEST, unregistred user!
客户端代码:
TMyRecord=record
Name: String;
Age: Integer;
end;

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;

procedure TForm1.Button1Click(Sender: TObject);
var
MyStream: TMemoryStream;
Info: Olevariant;
Obj: IServerObject;
R: TMyRecord;
begin
Obj := CoServerObject.CreateRemote('LEO');
Obj.GetInfo(Info);
MyStream := TMemoryStream.Create;
VariantToStream(Info,MyStream);
MyStream.Seek(0,soFrombegin
ning);
MyStream.ReadBuffer(R,sizeof(TMyRecord));
//R不可存取,Why???????
MyStream.Free;
Showmessage(R.Name + ':' + IntToStr(R.Age));
end;

服务器端代码:
TMyRecord=record
Name: String;
Age: Integer;
end;

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;

procedure TServerObject.GetInfo(var vUserInfo: OleVariant);
var
R: TMyRecord;
MyStream: TMemoryStream;
begin
R.Name := 'AAA';
R.Age := 25;
MyStream := TMemoryStream.Create;
MyStream.Write(R,sizeof(TMyRecord));
MyStream.Seek(0,soFrombegin
ning);
vUserInfo := StreamToVariant(MyStream);
MyStream.Free;
end;

注:
1。以前使用此方法传递数据没有出现此类错误!
2。在客户端封装显示不会出现此类错误!
如下面代码在客户端没有错误。
procedure GetInfo(var vInfo: OleVariant);
var
MyStream: TMemoryStream;
R: TMyRecord;
begin
R.Name := 'AAA';
R.Age := 25;
MyStream := TMemoryStream.Create;
MyStream.Write(R,sizeof(TMyRecord));
MyStream.Seek(0,soFrombegin
ning);
vInfo := StreamToVariant(MyStream);
MyStream.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
MyStream: TMemoryStream;
UInfo: TMyRecord;
Info: Olevariant;
begin
GetInfo(Info);
MyStream := TMemoryStream.Create;
VariantToStream(Info,MyStream);
ShowMessage(Inttostr(MyStream.Size));
MyStream.Seek(0,soFrombegin
ning);
MyStream.Read(UInfo,sizeof(TMyRecord));
MyStream.Free;
Showmessage(UInfo.Name + ':' + IntToStr(UInfo.Age));
end;
 
每人理??提一提!
 
表面上,问题主要集中在Client端的调用代码上。
Obj := CoServerObject.CreateRemote('LEO');
Obj.GetInfo(Info);
//创建远程对象,调用函数
MyStream := TMemoryStream.Create;
VariantToStream(Info,MyStream);

//将Variant对象的内容写到Stream中,此时流里面内容Size是正确的。
MyStream.Seek(0,soFrombegin
ning);
MyStream.ReadBuffer(R,sizeof(TMyRecord));
//流写到结构中,R在写前可以存取,为何写后R不可存取,Why???????
MyStream.Free;
Showmessage(R.Name + ':' + IntToStr(R.Age));//error
end;
没有理由阿,Stream read到结构中,相当于赋值,是写到结构的地址空间中的,
怎么写之后,结构不能够存取了???
 
踹一脚!
 
不懂,UP!
 
就是要取得服务器上的数据。
传递Olevariant类型参数,调用后在服务器端赋值,在客户端取值使用。
两边使用同一自定义结构。传递先读到Stream再到Olevariant,
客户端解开使用相反流程。
以前试验过,好像没有错的,但代码不见了,现在重写出了怪问题!
没有人愿意写写代码试试吗?
就是注册个Com+组件,不麻烦!
 
欲哭无泪啊!
把服务器作为ActiveX Server注册,调用,一切正常。
作为Com+ Objects注册执行就出现问题!
why????
 
问题找到了,代码里有严重问题,都不好意思说!:=)
很奇怪以前是怎么通过的!
现在解决了!发分。加的那100分留给自己了。
虽然只是踢了两脚,但我还是很感激荷塘新月和天真的。Thanx!
 
忘了给分 :-)
 
后退
顶部