有没有办法检查CreateFile返回的句柄是否有效?
我遇到的问题是CreateFile返回的有效文件句柄(它不是INVALID_HANDLE_VALUE)导致WriteFile失败,而GetLastError声称它是由于句柄无效。
答案 0 :(得分:2)
由于看起来你没有在关闭它之后将句柄值设置为INVALID_HANDLE_VALUE
,我要做的是在HANDLE
变量上设置一个读取观察点,这将导致调试器在每行访问HANDLE
的值。您将能够看到访问变量的顺序,包括读取变量的时间,以便将其传递给CloseHandle
。
答案 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
以找出原因。