有没有办法检查(文件)句柄是否有效?

时间:2011-01-05 09:44:11

标签: c windows winapi handle

有没有办法检查CreateFile返回的句柄是否有效?

我遇到的问题是CreateFile返回的有效文件句柄(它不是INVALID_HANDLE_VALUE)导致WriteFile失败,而GetLastError声称它是由于句柄无效。

6 个答案:

答案 0 :(得分:2)

由于看起来你没有在关闭它之后将句柄值设置为INVALID_HANDLE_VALUE,我要做的是在HANDLE变量上设置一个读取观察点,这将导致调试器在每行访问HANDLE的值。您将能够看到访问变量的顺序,包括读取变量的时间,以便将其传递给CloseHandle

请参阅:Adding a watchpoint (breaking when a variable changes)

答案 1 :(得分:1)

您的问题很可能是由以下两种情况引起的:

  • 您可以关闭文件句柄,但仍然尝试使用它
  • 由于内存损坏而覆盖文件句柄

通常,将INVALID_HANDLE_VALUE分配给每个句柄是一种很好的做法,只要它不应包含任何有效的句柄值。 简单来说 - 当声明您的变量时 - 立即将其初始化为此值。并在关闭文件句柄后立即将此值写入变量。

这将显示(1) - 尝试使用已关闭(或尚未打开)的文件句柄

答案 2 :(得分:1)

检查手柄的有效性最好是创可贴。

您应该调试进程 - 在设置句柄的位置设置断点(文件打开),当您点击该代码并在设置句柄后,设置第二个conditional breakpoint以在触发时触发处理价值变化。

这应该使您能够找出根本原因,而不仅仅是检查句柄在每次访问时是否有效,这是不可靠的,代价高昂且在给定正确逻辑的情况下是不必要的。

答案 3 :(得分:1)

其他答案对您的特定问题都很重要。

但是,如果给你一个HANDLE并且只是想知道它是否确实是一个打开的文件句柄(而不是,例如,互斥锁或GDI对象的句柄等),那么是Windows API函数GetFileInformationByHandle

根据您的句柄授予您文件的权限,您还可以尝试使用ReadFile从中读取一些数据,或者使用WriteFile设置nNumberOfBytesToWrite来执行空写操作到0。

答案 4 :(得分:0)

Open-File在内核中作为数据结构保存,我认为没有正式的方法来检测文件句柄是否有效,只需使用它并将错误代码检查为INVALID_HANDLE。你确定没有其他线程关闭那个文件句柄吗?

答案 5 :(得分:0)

只需添加其他人的说法,请确保在致电CreateFile时检查返回值。 IIRC,它将在失败时返回INVALID_HANDLE_VALUE,此时您应致电GetLastError以找出原因。