急急急,急急急!在线等待,OLE variant 参数从服务器端接收后,如何再将它变成原来的数据类型? (50分)

  • 主题发起人 主题发起人 笑幺
  • 开始时间 开始时间

笑幺

Unregistered / Unconfirmed
GUEST, unregistred user!
源代码再后面,分不够可再加。OLE variant 参数从服务器端接收后,如何再将它变成原来的数据类型?
 
急,在线等待,谢谢
 
强制类型转换!!!
 
我实用的 Variant array of Variant 传来,然后是用 Variant array of Byte兴的纪录
 
function OleVariantToMemoryStream(OV: OleVariant): TMemoryStream;
var
Data: PByteArray;
Size: integer;
begin
Result := TMemoryStream.Create;
try
Size := VarArrayHighBound (OV, 1) - VarArrayLowBound(OV, 1) + 1;
if Size = 0 then
begin
if Result <> nil then Result.Free;
Result := nil;
exit;
end;
Data := VarArrayLock(OV);
try
Result.Position := 0;
Result.WriteBuffer(Data^, Size);
finally
VarArrayUnlock(OV);
end;
except
VarArrayUnlock(OV);
Result.Free;
Result := nil;
end;
end;

 
delphiland:
从variant类型转换呢?
 
仅做参考


例:服务端接口函数:
function ITest(var ErrInof: string; Var ErrCode: integer): boolean;


客户端:
var sErrInfo,iErrorCode: olevariant;
s: string;
begin
if not Server.ITest(sErrInfo,iErrorCode) then
begin
iErrorCode 可以直接当整型用了.
   对sErrInfo 可做以下判断
if VarIsNULL(sErrInfo) or (VarIsEmpty(sErrInfo)) or (sErrInfo = NULL) then
begin
s:= sErrInfo;
end;
end;
end;
 
我是指反向转化呢?
 
我实际上要传递一个型为 [String,String,OLE,OLE]的纪录
 
//客户端
procedure TfrmClientTcpip.Button11Click(Sender: TObject);
Var
s : TMemoryStream;
o : OLEVariant;
p : Pointer;
v1,v2,v3,v4:OLEVariant;//4个字段
begin
If Not ADODataSet1.Eof Then
Begin
s := TMemoryStream.Create; //Stream
v1 := ADODataSet1.FieldByName('a').CurValue;//OleVariant
v2 := ADODataSet1.FieldByName('b').CurValue;//OleVariant
v3 := ADODataSet1.FieldByName('c').CurValue;//OleVariant
v4 := ADODataSet1.FieldByName('d').CurValue;//OleVariant
o := VarArrayOf([v1,v2,v3,v4]);
p := VarArrayLock(o); //Init p
s.Write(p^,VarArrayHighBound(o,1)+1); //Init s
csTcpip.Socket.SendBuf(p^,VarArrayHighBound(o,1)+1);
End;
end;

//服务器端:
procedure TfrmServerTcpip.ssTcpipClientRead(Sender: TObject;
Socket: TCustomWinSocket);
Var
o : OLEVariant;
p : Pointer;
v : OLEVariant;
begin
v := VarArrayOf(['a','b','c','d']);
o := VarArrayCreate([0, Socket.ReceiveLength - 1], varByte);
Try
Try
p := VarArrayLock(o);
Socket.ReceiveBuf(p^,Socket.ReceiveLength);
ADODataset1.Recordset.AddNew(v,o);
Finally
VarArrayUnlock(o);
End;
Except
Application.MessageBox(PChar('错误'),PChar('错误'),MB_OK+MB_ICONINFORMATION);
Abort();
End;
end;
 
不够可以再加分,大家快帮我想想办法啊
 
"多步操作产生错误,请检查每一步的值"
 
非常感谢大家特别是delphilan的帮忙,但他/她的方法我现在用不上。
大家快帮我一下啦,分数不够可以再加。
 
[:(]大家快帮忙呀。[:(][:(][:(]
 
后退
顶部