【问题标题】:INVALID_HANDLE_VALUE when calling CreateFileA several times多次调用 CreateFileA 时出现 INVALID_HANDLE_VALUE
【发布时间】:2014-11-14 02:37:43
【问题描述】:

我正在使用 CreateFileA,第一次调用它时,它按预期工作。但是当我第二次调用它时,它返回句柄 INVALID_HANDLE_VALUE。可能是什么问题呢?仅供参考,我每次需要检查我的 USB 设备是否已连接时都会调用它..

int port = 500;
char port_name [MAX_CAR] = {0};

sprintf_s (port_name, MAX_CAR, "\\\\.\\COM%d", port);

com->id = CreateFileA (port_name,
                       GENERIC_READ | GENERIC_WRITE,
                       0,
                       NULL,
                       OPEN_EXISTING,
                       FILE_FLAG_OVERLAPPED,
                       NULL);

编辑:我确实尝试使用 CloseHandle,例如 CloseHandle(com->id);但这无济于事。

【问题讨论】:

  • 您已超过最大打开文件句柄。确保在使用后关闭把手以作废。
  • 只要你不添加正确的错误报告,你就瞎了眼。当您修改串行端口时,使用 GetLastError() 绝不是可选的,太多的事情可能会超出您的控制范围。
  • 您的 CloseHandle() 调用是否真正被执行?当您在线上断点时,'com->id' 是否与 CreateFileA() 调用返回的值相同?你当时还没有,万一,已经摧毁了com?另外,@HansPassant 所说的。

标签: c++ c file-io port


【解决方案1】:

使用GetLastError 获取错误代码,并使用FormatMessage 获取人类可读的错误描述,或者只是简单地通过谷歌搜索错误代码。

有很多原因会导致相同的错误(CreateFile 返回INVALID_HANDLE_VALUE),没有GetLastError,你将很难找出真正的原因。

【讨论】:

    【解决方案2】:

    来自documentation

    当应用程序使用返回的对象句柄完成时 CreateFile,使用CloseHandle函数关闭句柄。这不 只会释放系统资源,但可以对事物产生更广泛的影响 比如共享文件或设备以及将数据提交到磁盘。细节 在本主题中酌情注明。

    【讨论】:

    • 问题是我每次读/写文件时都需要关闭句柄。
    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    相关资源
    最近更新 更多