var ov : olevariant; s : TMemoryStream; p : pointer; begin s := TMemoryStream.Create; .... ov := VarArrayCreate([0, s.Size - 1], varByte); p := VarArrayLock(ov); try S.Position := 0; //start from beginning of stream S.Read(p^, S.Size); finally VarArrayUnlock(Result); end; end;
function TScan_Control.of_SavePicVar(out Blob_Data: POleVariant1): Integer; var db_Stream:TMemoryStream; bmp:TBitmap; temp_jpeg:TJPEGImage; size :integer; begin if not imgedit1.ImageDisplayed then begin MessageBox(self.Handle,'没有图象可保存','提示',MB_ICONSTOP); Result := -1; exit; end; db_Stream := TMemoryStream.Create; temp_jpeg := TJPEGImage.Create; bmp := Tbitmap.Create; //拷贝图象到粘贴板 ImgEdit1.ClipboardCopy(0,0,ImgEdit1.Width,ImgEdit1.Height); //打开粘贴板 Clipboard.Open; //装入图象到位图实例 bmp.LoadFromClipBoardFormat(CF_BitMap,ClipBoard.GetAsHandle(cf_BitMap),0); //关闭粘贴板 ClipBoard.Close; ClipBoard.Clear; //把位图对象赋给JPEG图象格式文件 temp_jpeg.Assign(bmp); //把JPEG图象格式文件保存到流 temp_jpeg.SaveToStream(db_Stream); //得到流的大小 Size := db_Stream.Size; if Size = 0 then begin Result := 0; exit; end; try try db_Stream.Position := 0; //给存放流数据的指针分配内存 Blob_Data := Allocmem(size); //读流的数据到变量 size := db_Stream.Read(Blob_Data^,size); if size < 1 then begin showmessage('读流数据错误'); FreeMem(Blob_Data,size); Result := -1; exit; end; finally bmp.Free; temp_jpeg.Free; db_Stream.Free; Result := size; end; except Result := -1; end; end;
var
Stream_Data:TMemoryStream;
Any_Data:OleVariant;
begin
Stream_Data := TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(Stream_Data);
Stream_Data.Position := 0;
Stream_Data.Read(Any_Data,Stream_Data.Size);
finally
Stream_Data.Free;
end;
end;上面的代码可以是把TMemoryStream保存到OleVariant,但是保存之后,系统报错
'access volation at 0x77f8af26:write of address 0x00030ff8'的错误,我不知道是什么原因,我现在也急需要解决这个问题,谁能解决,我给他加200分。
我在调试的时候,一直到TForm1.Button1Click(Sender: TObject)执行完了后才报错。请高手指点。
var
Stream_Data:TMemoryStream;
Any_Data:OleVariant;
begin
Stream_Data := TMemoryStream.Create;
try
image1.Picture.Bitmap.SaveToStream(stream_data);
Stream_Data.Position := 0;
Stream_Data.Read(Any_Data,Stream_Data.Size);
finally
Stream_Data.Free;
end;
end;
Stream_Data:TMemoryStream;
Any_Data:OleVariant;
begin
Stream_Data := TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(Stream_Data);
Any_Data := VarArrayCreate( [0, Stream_Data.Size ], varByte);
Stream_Data.Read(Any_Data,Stream_Data.Size);
finally
Stream_Data.Free;
end;
end;
http://www.glennstephens.com.au/ActiveXServerObjects.doc
中的第16页的代码。
ov : olevariant;
s : TMemoryStream;
p : pointer;
begin
s := TMemoryStream.Create;
....
ov := VarArrayCreate([0, s.Size - 1], varByte);
p := VarArrayLock(ov);
try
S.Position := 0; //start from beginning of stream
S.Read(p^, S.Size);
finally
VarArrayUnlock(Result);
end;
end;
var
db_Stream:TMemoryStream;
bmp:TBitmap;
temp_jpeg:TJPEGImage;
size :integer;
begin
if not imgedit1.ImageDisplayed then
begin
MessageBox(self.Handle,'没有图象可保存','提示',MB_ICONSTOP);
Result := -1;
exit;
end;
db_Stream := TMemoryStream.Create;
temp_jpeg := TJPEGImage.Create;
bmp := Tbitmap.Create;
//拷贝图象到粘贴板
ImgEdit1.ClipboardCopy(0,0,ImgEdit1.Width,ImgEdit1.Height);
//打开粘贴板
Clipboard.Open;
//装入图象到位图实例
bmp.LoadFromClipBoardFormat(CF_BitMap,ClipBoard.GetAsHandle(cf_BitMap),0);
//关闭粘贴板
ClipBoard.Close;
ClipBoard.Clear;
//把位图对象赋给JPEG图象格式文件
temp_jpeg.Assign(bmp);
//把JPEG图象格式文件保存到流
temp_jpeg.SaveToStream(db_Stream);
//得到流的大小
Size := db_Stream.Size;
if Size = 0 then
begin
Result := 0;
exit;
end;
try
try
db_Stream.Position := 0;
//给存放流数据的指针分配内存
Blob_Data := Allocmem(size);
//读流的数据到变量
size := db_Stream.Read(Blob_Data^,size);
if size < 1 then
begin
showmessage('读流数据错误');
FreeMem(Blob_Data,size);
Result := -1;
exit;
end;
finally
bmp.Free;
temp_jpeg.Free;
db_Stream.Free;
Result := size;
end;
except
Result := -1;
end;
end;