如题

解决方案 »

  1.   

    你把TMemoryStream的内容读取出来存放到Variant里面就可以了啊,这有什么奇怪的
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    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)执行完了后才报错。请高手指点。
      

  3.   

    procedure 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;
      

  4.   

    你没有分配内存:var
      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;
      

  5.   

    参考
    http://www.glennstephens.com.au/ActiveXServerObjects.doc
    中的第16页的代码。
      

  6.   

    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;
      

  7.   

    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;