有没有办法检查一个句柄是否有效,我的情况是由CreateFile返回的?
我面临的问题是,由CreateFile返回的一个有效文件句柄(它不是INVALID_HANDLE_VALUE)后来导致WriteFile失败,并且GetLastError声称是因为无效的句柄。
INVALID_HANDLE_VALUE
,因此我建议在HANDLE
变量上设置读取监视点,这将导致调试器在访问HANDLE
的值时在每行代码处中断。您将能够看到变量被访问的顺序,包括何时读取变量以将其传递给CloseHandle
函数。请参见:添加监视点(在变量更改时中断)
nNumberOfBytesToWrite
设置为 0 的 WriteFile 执行空写操作。你的问题很可能是由以下两种情况之一引起的:
通常最好的做法是将INVALID_HANDLE_VALUE
赋值给每个句柄,只要它不应包含任何有效的句柄值。简单来说,当你声明变量时,立即将其初始化为此值。并且在关闭文件句柄后立即将此值写入变量中。
这将提示你(1)——尝试使用已关闭的文件句柄(或尚未打开的文件句柄)
打开文件在内核中被保存为数据结构,我认为没有官方的方法来检测文件句柄是否有效,只需使用它并检查错误代码作为INVALID_HANDLE。你确定没有其他线程关闭了该文件句柄吗?
仅仅检查句柄的有效性是治标不治本。
你应该调试整个过程 - 在设置句柄(文件打开)的代码处设置断点,当你到达那段代码并且句柄被设置后,再设置一个条件性断点以在句柄值改变时触发。
这样可以帮助你找出根本原因,而不仅仅在每次访问时检查句柄是否有效,这种方法不可靠、代价高昂,而且在正确的逻辑下是不必要的。
CreateFile
时检查返回值。如果失败,它将返回INVALID_HANDLE_VALUE
,此时您应该调用GetLastError
来查找原因。