使用无效句柄调用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
,因此您的SetEvent
和WaitForSingleObject
正在使用未初始化的变量。 未初始化的变量的内容是不确定的,所以你最终将一个未知的值传递给SetEvent
和WaitForSingleObject
。 看起来,对于旧代码,内存使用模式恰巧会导致未初始化变量的值不是有效句柄,因此您得到了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