//......省略//定义类型
type
  TKeyEvent=(KE_DOWN,KE_UP);type
PKeyBoardData=^TKeyBoardData;
TKeyBoardData=Packed record
  VKey:Word;
  VKeyEent:TKeyEvent;
  ShiftState:TShiftState;
end;   //......省略//发送单元
//发送
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  pbd:PKeyBoardData;
begin
   //......省略
  GetMem(pbd,sizeof(TKeyBoardData));
//FillChar(pbd,sizeof(TKeyBoardData),$0);
  with Pbd^ do
  begin
    VKey:=Key;
    VKeyEent:=KE_DOWN;
    shiftState:=Shift;
  end;
  self.ClientSocket.SendBuf(pbd,sizeof(TKeyBoardData));
  FreeMem(pbd);
end;//接收单元
//接收
procedure TForm1.ServerSocketOnClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
   pbd:PKeyBoardData;
begin
  GetMem(pbd,Socket.ReceiveLength);
  Socket.ReceiveBuf(pbd,Socket.ReceiveLength);
  with pbd^ do
  //检查
  showmessage(inttostr(VKey));//我得到的按键不对不知为何?
  freeMem(pbd);
end;
////////////请高手帮忙解决,小弟非常感谢

解决方案 »

  1.   

    ClientSocket.SendBuf(pbd,sizeof(TKeyBoardData));
    Socket.ReceiveBuf(pbd,Socket.ReceiveLength);两句都不对, SendBuf和 ReceiveBuf 的(const Buf;... 是个无值类型,相当于一个对像引用, 有时很不方便, 你给个指针就会取指针自已所有内存区的值(一个Integer), 超过部分未知ClientSocket.SendBuf(pbd^,sizeof(TKeyBoardData)); 就对了
    Socket.ReceiveBuf(pbd^,Socket.ReceiveLength);
      

  2.   

    不加 "^", 把 var 部分改成 pbd: TKeyBoardData; 就是正确的, 这个程序没必要动态分配内存记得分清用对像调用无值参数, 指针就要取出对像本身
      

  3.   

    原来就这样子啊,可是折腾了我许久,但还是有点迷糊我看到Borland的里子用收发string
    用 Pchar(string) 我就照办了,是啊我又错了哎!
    OK高手出马就是不一样
    非常感谢仁兄!