关于Stream于OleVariant类型转换的难题!(200分)

Z

zfine

Unregistered / Unconfirmed
GUEST, unregistred user!
在三层应用中如何将Stream于OleVariant类型转换,以便传递流类型数据。
那位高手指点一下,不胜感谢!
 
stream --> variant
var
stm: TMemoryStream;
v: Variant;
p: PChar;
begin
....
v := VarArrayCreate([0, stm.size-1], varByte);
p := VarArrayLock(v);
stm.readbuffer(p^, stm.size);
VarArrayUnlock(v);
...
end;

variant --> stream
...
b := VarArrayLowBound(v);
e := VarArrayHighBound(v);
p := VarArrayLock(v);
Stm.Writebuffer(p^, e - b + 1);
VarArrayUnlock(v);
stm.seek(0,0);
...
 
要的是olevariant,而不是variant,两者之间还是有区别的。
我要用华表控件来存储和读数据,只能保存为OleVariant,我用上面的代码从数据表中读数据
到olevariant,华表读时出错,通不过
 
如果你读过源程序, 你就会知道, 上述代码生成的variant和olevariant结构完全相同。
 

procedure VariantToStream(const Data: OleVariant;
Stream: TMemoryStream);
var
p: Pointer;
begin
p := VarArrayLock(Data);
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1);
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;
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Result);
end;
end;

 
佩服佩服,能给我讲讲转换原理吗?我为什么找不到相关的帮助,我跟本不知道流和olevariant
如何构成,所以它们的转换也就更谈不上了。一定另加贴子加分
 
谢谢大家,问题解决了!
 
顶部