MemoryStream和OLEVariant如何相互转换?(50分)

  • 主题发起人 主题发起人 Yong
  • 开始时间 开始时间
参考一下把

function TCommClient.Send(aData: TStream; const aDestination: String; aTTL: Integer): Integer;
var
V : Variant;
P : Pointer;
L : Integer;
begin
Result := -1;
try
//进行类型转换, 将COM不支持的TStream类型转换为字节数组来传送
L := aData.Size;
if L > 0 then
begin
V := VarArrayCreate([0, L-1], varByte);
P := VarArrayLock(V);
try
aData.Seek(0, soFromBeginning);
aData.ReadBuffer(P^, L);
finally
VarArrayUnlock(V);
end;

if Active then Result := FServer.Send(V, aDestination, aTTL);
end;
except
on E: Exception do
TLogFile.WriteLn('发送数据出错, 错误信息="%s"', [E.Message]);
end;
end;
 
还有呢?你这是Client端的吧? Server那边接到OLEVariant;后怎么反写入到TStream里去?
 
procedure TCommClient.DoOnData(aData: OleVariant; const aSource: WideString; out aAction: Integer);
var
S : TMemoryStream;
P : Pointer;
L : Integer;
begin
if Assigned(FOnData) then
begin
S := TMemoryStream.Create;
try
//将传过来的安全数组转换为TStream类型,触发事件
L := VarArrayHighBound(aData, 1) - VarArrayLowBound(aData, 1) + 1;
P := VarArrayLock(aData);
try
S.Seek(0, soFromBeginning);
S.WriteBuffer(P^, L);
finally
VarArrayUnlock(aData);
end;

FOnData (Self, S, aSource, aAction);
finally
S.Free
end;
end;
end;
 
非常感谢tseug,其实我的本意是这样的:我在中间层有一个二维的结构数组,长度不定,
而且每维数组的长度都不一样,想用DCOM传到客户端,由于Dcom只支持OLEVariant,所以
只能在中间层建OLEVariant数组,客户端接受到后再把OLEVariant数组写入到二维数组里,
非常浪费时间,我现在想的是能不能把OLEVariant数组直接通过整体复制的方式传给结构数组
 
接受答案了.
 
后退
顶部