1

我正在尝试通过在启动允许用户执行通信操作的对话框窗口之前测试 COM 端口的“可打开性”来进行“飞行前检查”。

这是代码序列的概要:

handle = CreateFile("\\\\.\\COM4:", GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);

if (handle != INVALID_HANDLE_VALUE)
{
  CloseHandle(handle);
  DoTheWork("\\\\.\\COM4:");
}
else
{ 
  ShowMessage("I'm sorry Dave, I can't do that"); 
} 

...

void DoTheWork(char * port)
{
  handle = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);
  /// do lots of stuff
  CloseHandle(port);
}

这就是问题所在:“DoTheWork”是一个久经考验的功能,并且可以自行正确执行。只有在前面的 CreateFile/CloseHandle 调用之后立即调用它才会失败,此时第二个 CreateFile 返回 E_ACCESSDENIED。

更糟糕的是,如果我在调试器中慢慢地单步调试代码,它工作得很好。

在第一个 closeHandle 之后,我似乎需要一个 Sleep(),但这感觉就像一个 hack - 我无法知道它必须多长时间。

4

3 回答 3

2

系统需要一些时间来关闭资源。可能有一些神秘的方法可以测试它是否已被释放,但我不知道那是什么。我所知道的是,如果您检查注册表项:

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

您将看到哪些串行端口可用而无需打开它们,这应该可以解决您的问题。

于 2009-08-20T16:21:23.557 回答
1

在关闭句柄之前尝试在句柄上调用 PurgeComm() 或 FlushFileBuffers()。

于 2009-08-20T17:31:44.053 回答
0

好吧,经过更多的拖网搜索,我发现了这个,它与 Windows CE 而不是 Win32 相关。

在关闭端口和释放资源之前调用 CloseHandle 后会有两秒的延迟。

我想这同样适用于 Win32,但我还没有找到任何书面证据。

于 2009-08-20T16:32:35.280 回答