2

我在 Windows 上使用被视为虚拟串行端口的 USB 设备。我可以使用 CreateFile 和 ReadFile 函数与设备通信,但在某些情况下,我的应用程序不会调用 CloseHandle(当我的开发应用程序崩溃时)。之后,对 CreateFile 的所有调用都失败(ERROR_ACCESS_DENIED),唯一的解决方案是再次登录我的计算机。有没有办法以编程方式强制关闭打开的句柄(或重新打开)?

4

6 回答 6

3

这当然不正常。在进程终止后,Windows 会自动关闭所有打开的句柄。这一定是您的 USB 设备驱动程序中的一个缺陷,尽管很难看出它是如何搞砸的。然而,模拟串行端口的那些是出了名的糟糕。好吧,除了希望制造商更新驱动程序之外,您无能为力。或其他制造商的设备。

于 2010-06-01T10:03:25.840 回答
2

我同意之前的两个帖子。

  1. 这不是正常情况。
  2. 拔下 USB 设备通常会有所帮助。

此问题与负责实现虚拟 COM 端口的 FTDI 驱动程序中的故障有关。另一方面,这些“故障”与 USB 设备的各种故障有关。(当然,这并不能证明 FTDI 驱动程序是合理的)。

顺便说一句,某些 FTDI 驱动程序还有其他几个已知问题:

  • 有时调用CloseHandle只是挂起调用线程。
  • 有时应用程序在任务管理器中仍然“可见”,即使在它关闭之后也是如此。任务管理器不能终止应用程序,调试器也不能附加到它上面。它的 EXE 文件被锁定(无法删除)。

通常在这些情况下立即拔出 USB 设备会有所帮助。FTDI 驱动程序,似乎正在“等待某事”醒来。

于 2010-06-01T11:59:41.393 回答
1

是否有可能您崩溃的程序的某些线程或子进程仍在运行并持有文件句柄的副本?也许调试器进程仍然打开?如果是这样,那些可能会使设备保持打开状态。为了确定,我会检查任务管理器;如果是这样,强制终止剩余进程可能会解决问题。

于 2010-06-01T17:40:03.673 回答
0

您不希望发生的另一件事是打开 USB 串行端口并且用户将 USB 拉到串行适配器。该错误已经(是?)存在了很长时间。这是该错误的答案

“由 Microsoft 于 2009 年 3 月 27 日下午 4:03 发布 您好,感谢您报告此问题。我们已意识到此问题,并已在 .NET 框架的下一个主要版本中修复该问题。

如果您有任何疑问,请重新激活此问题,我会尽快回复。谢谢,Kim Hamilton 基类库"

不知道问题是否相关。Microsoft Connect 报告了多个 USB 串行错误。

于 2010-06-01T23:47:19.187 回答
0

也许您可以在主代码周围添加一个 Try catch close,并在 catch close 中调用 CloseHandle。然后即使程序崩溃,也会调用 CloseHandle。

try
{
   HANDLE hPort = NULL;
   hPort = CreateFile(...);
   // You code...

}
catch (...)
{
   if (hPort != NULL)
       CloseHandle(hPort);
}
于 2010-06-30T15:47:09.677 回答
-1

尝试拔下设备并将其重新插入。有时需要提醒 Windows 没有人再连接到该端口。

于 2010-06-01T11:39:08.610 回答