OleVariant转换成stream的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 deadeye
  • 开始时间 开始时间
D

deadeye

Unregistered / Unconfirmed
GUEST, unregistred user!
用下面这个方法,读到的数据每个字节都是零
我试过用move把几个byte copy出来
可以看到数据是有的,不是全零

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;
 
用下面这个方法,读到的数据每个字节都是零
我试过用move把几个byte copy出来
可以看到数据是有的,不是全零

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;
 
直接这样行不行
Move(pchar(@OV)^, Data^, OVLen);
 
...........................
 
To:app2001
试过了,不行,也是零
 
老贴子中,关于这个函数的介绍还不少呢,你调用这个函数后,对得到的TMemoryStream,是用什么方式来读出来呢???
 
送你一个成熟函数的样例,对你一个有帮助:
function VarToIcon(const v: OleVariant): TIcon;
var
nCount: Integer;
Stm: TStringStream;
s: string;
P: Pointer;
begin
Result := TIcon.Create;

nCount := VarArrayHighBound(v, 1) - VarArrayLowBound(v, 1) + 1;
SetLength(s, nCount);
P := VarArrayLock(v);
try
Move(P^, s[1], nCount);
finally
VarArrayUnLock(v);
end;

Stm := TStringStream.Create(s);
Result.LoadFromStream(Stm);
end;
 
To:app2001
我其实用的是TfileStream
我保存在文件里,用十六进制编辑器看的
 
你是用在什么地方的呢,是通过Clientdataset从三层中传递过来的内容吗???
如果是的话Clientdataset自己就有SAVETOSTREAM和LOADFROMSTREAM的啊
 
不是的
这个是别人写好的dll
有个函数的参数是olevariant
再在想把这个olevariant存回成文件
 
你把代码多贴一点出来看看嘛,当看一个函数看不出问题出来的
 
实在不好意思
这个dll签了保密协议
他不允许公开
 
这个是Olympus的sdk
打电话去技术支持
他们没有对delphi的支持
郁闷
 
Data := VarArrayLock(OV);
try
Result.Position := 0;
Result.WriteBuffer(Data^, Size); 改成下面这句看看
Result.Position := 0
//再弄一句将指针复位看看
finally
VarArrayUnlock(OV);
end;
 
应该不是这个问题
我是用filestream保存到文件的
文件每个字节都是零
 
这个要不断的尝试,因为操作流,来来去去就那么几个方法,要不就这么试试
Result.WriteBuffer(Data^, VarArrayLowBound(OV, 1) + 1); 改成这句看看
Result.seek(0,soFromBeginning)
//再弄一句将指针复位看看
 
有的地方说可以用OV[index]来访问olevariant
我想把OV的内容一点一点move出来
不过还是不行
 
procedure OleVariantToMemoryStream(OV: OleVariant;stream:tstream);
var
Data:pointer;
begin
Data := VarArrayLock(OV);
try
stream.Position := 0;
stream.WriteBuffer(Data^, VarArrayHighBound(OV,1) + 1)
finally
VarArrayUnlock(OV);
end;
end;
stream由调用者创建
 
有什么办法可以确认OleVariant里面是不是真的返回了数据
如果本般返回的就是全零
那就不是这里的问题了
 
你看看这个???
function VarDataSize(const Value: OleVariant): Integer;
begin
if VarIsNull(Value) then
Result := -1
else if VarIsArray(Value) then
Result := VarArrayHighBound(Value, 1) + 1
else if TVarData(Value).VType = varOleStr then
begin
//Result := Length(PWideString(@TVarData(Value).VOleStr)^);
Result := Length(String(Value))
{ 解决汉字参数传递问题 }
if Result = 0 then
Result := -1;
end
else
Result := SizeOf(OleVariant);
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
A
回复
2
查看
528
I
回复
0
查看
571
import
I
I
回复
0
查看
830
import
I
后退
顶部