如题!急。

解决方案 »

  1.   

    如果你的结构使用了string,那就不奇怪了~~
      

  2.   

    如果你用了PostMessage,接着又释放了内存也就不奇怪了。
      

  3.   

    没用string,用的sendmessage。倒是内存是主线程分配的。
    谢谢三位,我先试一下。
      

  4.   

    /////////////////////// thread ///////////////////////////////////
    var
      DataTB : DataInfoTB;
    procedure TRecvThread.Execute;
    begin
      while not Terminated do
        if WaitForSingleObject(FEvent.Handle,WaitTime*4)=Wait_Object_0 then
        begin
          PInsDataRec:=Pointer(FMessage.LParam);
          Case PInsDataRec.dwData of
            InsData:
            begin
              DataTable:=DataInfoTB(PInsDataRec.lpData^);
              DealData;
              if RefreshAlarm then
                PostMessage(FrmData.Handle,RecvMessage,0,0);
            end;
          end;
         end;
    end;procedure TRecvThread.RecvAllMessage(var Mess: TMessage);
    begin
      with Mess do
      begin
        if Msg=WM_CopyData then
        begin
          FMessage:=Mess;
          FEvent.SetEvent;
        end else
          Result := DefWindowProc(FWinHandle, Msg, WParam, LParam);
      end;
    end;///////////////定义///////////////////
    type DataInfo = record
      ddr : Word;
      DataTime : TDateTime;
      SolveData: array [1..6] of Double;
    end;
    type  DataInfoTB = array [1..5] of DataInfo;//每次是五个数据,前4个正常,最后一个数据不正常。
    //////////////////////////// 发送端 ///////////////////////  
    SendMessage(ProcHandle,WM_CopyData,Handle,LongInt(@SendDataRec));
    //其中SendDataRec 为 DataInfoTB类型。
    把thread中的代码帖到主线程中接收到的数据就是正常的。
      

  5.   

    偏偏关键部分楼主没有贴出来
    SendDataRec这块内存是什么时候分配的?哪儿分配的?静态?栈?堆?
    怀疑问题出在这儿SendMessage(ProcHandle,WM_CopyData,Handle,LongInt(@SendDataRec));
    //其中SendDataRec 为 DataInfoTB类型。
      

  6.   

    SendDataRec的内存是静态分配的。
    如果是这的原因,为什么在主线程中接收正常?
      

  7.   

    COPYDATA发送的内存是有长度的,可能你访问了指定长度以外的内存,你需要接收到数据后先切下你需要的长度,其余的不属于你,不要访问也不要释放
      

  8.   

    我是只取了我需要的长度,没有访问指定长度外的内存。
    您看上面的代码了吗?估计是哪的问题?
    我程序中发送和接收用的都是静态分配的内存,发送和接收的record定义是一样的。而且,在主线程中接收就正常。
      

  9.   

    》》SendMessage(ProcHandle,WM_CopyData,Handle,LongInt(@SendDataRec));
    》》//其中SendDataRec 为 DataInfoTB类型。SendDataRec不应该是自定义类型的,应该是COPYDATASTRUCT类型。
    var
      cds:TCopyDataStruct;
      data:DataInfoTB;
    begin
    //  SendMessage(ProcHandle,WM_CopyData,Handle,LongInt(@SendDataRec));
      cds.dwData:=0;
      cds.cbData:=sizeof(data);
      cds.lpData:=@data;  SendMessage(prohandle,WM_COPYDATA,handle,Longint(@cds));
    end;
      

  10.   

    不好意思,说错了。
    var
      SendDataRec : TCopyDataStruct;
    begin
          SendDataRec.cbData:=SizeOf(DataInfoTable);
          SendDataRec.lpData:=@DataInfoTable;
    end;
    //DataInfoTable 为 DataInfoTB类型。
      

  11.   

    如果是不同进程的话 
    WM_COPYDATA 分配的内存空间必须为全局的 不能为某一个进程的 私有空间
      

  12.   

    哪位帮忙看看,我把源程序发给你。
    在进程间通信用postMessage位什么不行?