采用 完成例程方式 函数名:WorkerRoutine
当程序接收到一个UDP信息的时候 程序就出错了. 请问哪里的原因unit uUDP;interfaceuses
  Windows, Classes, SysUtils, WinSock2;const
  BUFFER_SIZE = 4096;
  RECV_TIME_OUT = 550;
  LISTEN_PORT = 8088;type
  TOverlapThread = class(TThread)
  private
    FBuf: TWSABUF;
    FBuffer: array[0..BUFFER_SIZE] of Char;
  public
    m_socket: TSocket;
    m_overlap: WSAOVERLAPPED;
  protected
    procedure Execute; override;
  protected
    procedure PostRecvMessage;
  protected
    function InitSock: BOOL;
    procedure FreeResource;
  end;var
  OverlapThread: TOverlapThread;procedure WorkerRoutine( dwError :Dword;
    cbTransferred: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: Dword
    ); stdcall;implementationuses Unit1;{ TOverlapThread }procedure TOverlapThread.Execute;
begin
  try
    if not InitSock() then Exit;    PostRecvMessage;    while (not Terminated) do
    begin
      if SleepEx(RECV_TIME_OUT, True) = WAIT_IO_COMPLETION then //
      begin
        ;
      end else
      begin
        continue;
      end;
    end;    FreeResource;  except
  end;
end;procedure WorkerRoutine( dwError :Dword;
    cbTransferred: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: Dword
    ); stdcall;
//var
//  lpBuf: array[0..BUFFER_SIZE] of Char;
begin
 
  try
//    if (dwError <> 0) or (cbTransferred = 0) then
//    begin
//      TOverlapThread(lpOverlapped^.hEvent).PostRecvMessage;
//      Exit;
//    end;//    CopyMemory(@lpBuf, TOverlapThread(lpOverlapped^.hEvent).FBuf.buf, BUFFER_SIZE);
//    unit1.Form1.mmo1.Lines.Add(StrPas(lpBuf));//    TOverlapThread(lpOverlapped^.hEvent).PostRecvMessage;
  except
  end;
end;procedure TOverlapThread.FreeResource;
begin
  closesocket(m_socket);
  WSACleanup;
end;function TOverlapThread.InitSock: BOOL;
var
  addr: TSockAddr;
  wsaData: TWSADATA;
  dwVersionRequested: DWORD;
begin
  Result := False;
  try
    dwVersionRequested := MAKEWORD(2, 2);
    WSAStartup(dwVersionRequested, wsaData);    m_socket := WSASocket(AF_INET, SOCK_DGRAM, 0, nil, 0, WSA_FLAG_OVERLAPPED);
    addr.sin_family := AF_INET;
    addr.sin_port := htons(LISTEN_PORT);
    addr.sin_addr.S_addr := INADDR_ANY;
    bind(m_socket, @addr, sizeof(SOCKADDR));    Result := True;
  except
  end;end;procedure TOverlapThread.PostRecvMessage;
var
  addr: TSockAddrIn;
  addrlen: Integer;
  dwTemp, dwFlag: DWORD;
begin
  try
    addrlen := sizeof(addr);    FBuf.len := BUFFER_SIZE;
    FBuf.buf := @FBuffer;    dwFlag := 0;
    FillChar(m_overlap, sizeof(WSAOVERLAPPED), 0);
    m_overlap.hEvent := DWORD(self);    WSARecvFrom(m_socket,
      @FBuf,
      1,
      @dwTemp,
      @dwFlag,
      @addr,
      @addrlen,
      @m_overlap,
      WorkerRoutine);
  except
  end;
end;initialization
  OverlapThread := TOverlapThread.Create(True);
  OverlapThread.FreeOnTerminate := True;
  OverlapThread.Resume;finalizationend.