使用无效句柄调用SetEvent

我有一个应用程序,其中一个线程调用SetEvent,另一个线程等待该事件。 但是,CreateEvent从未被调用过。

SetEven返回false(ERROR_INVALID_HANDLE),WaitForSingleObject返回WAIT_FAILED

昨天,我们提交了一些显然不相关的东西:.rc从工具栏中删除按钮的两行代码。

突然,在realease-XP-32上, WaitForSingleObject返回WAIT_TIMEOUT

但我想知道:

1-为什么在资源中提交(显然不相关)确实改变了WaitForSingleObject的返回值?

2-当我从Visual Studio启动应用程序(XP32)时,我得到的行为与直接启动应用程序时不同。 WaitForSingleObject()返回WAIT_FAILED而不是超时。 任何想法为什么?


由于您从未调用CreateEvent ,因此您的SetEventWaitForSingleObject正在使用未初始化的变量。 未初始化的变量的内容是不确定的,所以你最终将一个未知的值传递给SetEventWaitForSingleObject 。 看起来,对于旧代码,内存使用模式恰巧会导致未初始化变量的值不是有效句柄,因此您得到了ERROR_INVALID_HANDLE 。 更改内存使用模式后,现在未初始化的变量的值恰好是有效的句柄,因此WaitForSingleObject函数会尽职尽责地等待它。 该句柄恰好指向一个没有信号的对象,所以WaitForSingleObject调用超时并返回WAIT_FAILED

换句话说,看似无关的变化暴露了一个预先存在的错误。 使用未初始化的数据会导致像这样的非局部效应。


如果您正在执行WaitForSingleObject(),那么调用实际上是否失败? 也许它会抛出无效的句柄错误,所以它看起来只是“接收事件”。 在更改RC文件之前,破解的CreateEvent()代码也不可能实际编译。 无论如何,在没有看到代码的情况下无法分辨。

链接地址: http://www.djcxy.com/p/30801.html

上一篇: Calling SetEvent with an invalid handle

下一篇: repeating WaitForSingleObject in messages between to applications