procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
//事件中我是这么写的....如下
var
    buf:array of byte; //设置接收缓冲区
    len:integer;
begin
    len:=Socket.ReceiveLength ;//接收到数据长度
    SetLength(buf,len);        //设置接收数组长度
    Socket.ReceiveBuf(buf,len);    if (buf[0]=$FF) then       //●出错地方.....
        begin
        ....
        end;
end
====================================================
提示:
Access violation at address 00404ED8 in module 'Project1.exe'.Write of address 736574f7.

解决方案 »

  1.   

    先看看你的len为多少,如果它为0呢?
      

  2.   

    因为buf是一个指针,指向的地址是申请的内存,而receivebuf是把接收的内容写到参数1的地址中,所以,这里Socket.ReceiveBuf(buf,len);后,是接收的数据把buf指针自己的空间覆盖了,而不是把数据覆盖到指针申请到的内存空间。所以,buf已经指向了一个错误的地址了,那么buf[0]一定会出错。如果接收的数据多,可能ReceiveBuf(buf,len)的时候就会出错。改成如下:procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
        buf:array of byte;
        len:integer;
        p:pbyte;
    begin
        len:=Socket.ReceiveLength ;
        SetLength(buf,len);        
        p:=@buf[0];
        Socket.ReceiveBuf(p^,len);    if (buf[0]=$FF) then 
        begin
            showmessage('haha');
        end;
    end;