var
    b:TBlobStream;
begin
    B:=TBlobStream.Create(query1.FieldByName('image') as TBlobField,bmread);
    showmessage(inttostr(b.Size));
end;
我刚作了个小实验,上面的没有问题,不过我用的是sql库。

解决方案 »

  1.   

    我知道原因了,你不要用TBlobStream
    改用TClientBlobStream就可以了
      

  2.   

    我知道原因了,你不要用TBlobStream
    改用TClientBlobStream就可以了
      

  3.   

    按照 netlib(河外孤星) 的修改之后,确实不显示'Invalid Class Typecast'了,但执行到OleStream.Write(Buffer^,MemSize)还是显示...Access violation at address...,还望各位大侠帮忙我的操作系统是win2000 professinal,关机时经常显示和此类似的信息,比如Memory not allowed read等,是不是操作系统的内存分配有问题了?
      

  4.   

    还要注意,不要放释放那两个流,你还必须要释放buffer!否则,程序也会不定期的出错!
      

  5.   

    把Buffer:=AllocMem(MemSize);
    改为
    Buffer:=AllocMem(MemSize+1);
    在试试
      

  6.   

    还要注意,不要放释放那两个流,你还必须要释放buffer!否则,程序也会不定期的出错!
      

  7.   

    借鉴了所有的回复,错误依旧
    procedure TForm1.Button3Click(Sender: TObject);
    Var MemSize:Integer;
        Buffer:PChar;
        BlobStream1:TClientBlobStream;
        OleStream:TStream;
    begin
      if not BDEClientDataset1.FieldByName('全文').IsNull then
        begin
          try
            //OleContainer1.InsertObjectDialog;
            BlobStream1:=TClientBlobStream.Create(BDEClientDataset1.FieldByName('全文') as TBlobField,bmRead);
            MemSize:=BlobStream1.Size;
            Inc(MemSize);
            try
              Buffer:=AllocMem(MemSize);
              //GetMem(Buffer,MemSize);
            except
              MessageDlg('内存不足,不能执行此操作!',mtWarning,[mbOk],0);
              exit;
            end;        BlobStream1.Seek(0,soFromBeginning);
            BlobStream1.Read(Buffer^,MemSize);        //OleStream:=TStream.Create;
            OleStream.Write(Buffer^,MemSize);        OleContainer1.LoadFromStream(OleStream);
            OleContainer1.Run;
            OleContainer1.DoVerb(ovPrimary);
          finally
            BlobStream1.Free;
            OleStream.Free;
            FreeMem(Buffer,MemSize);
          end;
        end
      else
        ShowMessage('对象为空,不能执行此操作!');
    end;