2

我决定为 IPC 使用邮槽。在 Windows 8 上一切正常。但是在 Windows Xp 上,我收到了很好的第一条消息,但是对 ReadFile 的调用被卡住了。

这是我的测试代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  hand : THandle;
  buf : array [0..255] of AnsiChar;
  btsRead : DWORD;
begin
  hand := CreateMailslot('\\.\mailslot\somemailslot', 255, DWORD(-1), nil);
  if hand <> INVALID_HANDLE_VALUE then
  begin
      while True do
      begin
        ReadFile(hand, buf, 255, btsRead, nil); // call gets stuck after first message
        ShowMessage(buf);
        Application.ProcessMessages;
      end;
  end;

在 Windows 8 上,我继续从客户端应用程序接收消息,但在 Windows xp 上,对 ReadFile 的调用会永远等待消息。我尝试重新打开客户端应用程序但没有成功。

我做错了什么?

4

1 回答 1

2

使用线程从邮槽读取。否则,您将始终遇到在 ReadFile 中等待时必须处理 Windows 消息的问题。

话虽如此,对 CreateMailslot 和 ReadFile 的调用看起来与我使用的(在 XP 及更高版本上)非常相似,只是我有一个更大的缓冲区(65535)。

如果这些都没有帮助,那么问题可能出在其他地方。

当需要取消对 ReadFile 的调用时,CloseHandle(hand)从主线程调用。当您需要退出线程时,这很有用。这是为邮槽使用线程的另一个原因。

于 2015-05-27T21:19:34.917 回答