//下载
procedure DownFile;
begin
  //....
  DownMemory(Stream, ASize); //下载Stream
  SendMessage(Handle, WM_DOWN_MSG, Integer(Stream.Memory), ASize);
end;
//接受数据
procedure GetDownMsg(var Msg: TMessage);
var
  Stream: TMemoryStream;
  ASize: Int64;
begin
  Stream := TMemoryStream.Create;
  try
    //Stream.Memory := DWORD(Msg.WParam); //这个地方这么做?必须用CopyMemory吗?能不能直接指针赋值就行了?
    //ASize := Int64(Msg.LParam);
    
    //...
    _FileStream.Position := _FileStream.Size;
    FileStream.CopyFrom(Stream, Stream.Size);
  finally
    FreeAndNil(Stream);
  end;  
end

解决方案 »

  1.   

    可以这样试一下(没测试):TMyMemoryStream = class(TMemoryStream) 
    end;procedure GetDownMsg(var Msg: TMessage);
    var
      Stream: TMemoryStream;
      ASize: Int64;
    begin
      Stream := TMemoryStream.Create;
      try
        TMyMemoryStream(Stream).SetPointer(DWORD(Msg.WParam), Msg.LParam);
        //Stream.Memory := DWORD(Msg.WParam); //这个地方这么做?必须用CopyMemory吗?能不能直接指针赋值就行了?
        //ASize := Int64(Msg.LParam);
        
        //...
        _FileStream.Position := _FileStream.Size;
        FileStream.CopyFrom(Stream, Stream.Size);
      finally
        FreeAndNil(Stream);
      end;  
    end
      

  2.   

    DWORD(Msg.WParam)应该改为Pointer(Msg.WParam)
      

  3.   

    Stream.ReadBuffer(Pointer(Msg.WParam)^, Msg.LParam);
      

  4.   

    你看下VCL的源代码就知道了procedure TMemoryStream.LoadFromStream(Stream: TStream);
    var
      Count: Longint;
    begin
      Stream.Position := 0;
      Count := Stream.Size;
      SetSize(Count);
      if Count <> 0 then Stream.ReadBuffer(FMemory^, Count);
    end;
      

  5.   

    提示一下,我不知道发送过来的内存是怎么分配和释放的,但是在释放Stream前应加一句:
      finally  TMyMemoryStream(Stream).SetPointer(nil, 0);  FreeAndNil(Stream);
      end; 
      

  6.   

    写错了
    应该是
    Stream.WriteBuffer(Pointer(Msg.WParam)^, Msg.LParam); 才是写到Stream
      

  7.   

    简单测试了下var
      T1, T2: TMemoryStream;
    begin
      T1 := TMemoryStream.Create;
      T1.LoadFromFile('C:\新建 文本文档 (3).txt');  T2 := TMemoryStream.Create;
      T2.WriteBuffer(T1.Memory^, T1.Size);  
      T2.SaveToFile('C:\新建 文本文档 (4).txt');  T1.Free;
      T2.Free;
    end;
      

  8.   

    拷贝之前要做 FileStream.Position := 0;