第二个DeleteTimerQueueTimer()生成访问冲突或无效参数异常,或者根据上下文无限制地挂起。 Google测试代码:
HANDLE hTimer = NULL;
static VOID CALLBACK _TimerCallback(PVOID, BOOLEAN)
{
//::DeleteTimerQueueTimer(NULL, hTimer, NULL);
}
TEST(CTest, TimerQueue)
{
ASSERT_EQ(FALSE, ::DeleteTimerQueueTimer(NULL, hTimer, NULL));
ASSERT_EQ(TRUE, ::CreateTimerQueueTimer(&hTimer, NULL, &_TimerCallback, NULL, 40, 0, WT_EXECUTEONLYONCE));
ASSERT_TRUE(NULL != hTimer);
Sleep(100);
ASSERT_EQ(TRUE, ::DeleteTimerQueueTimer(NULL, hTimer, NULL));
// ******** next line produces SEH or deadlocks *************
ASSERT_EQ(FALSE, ::DeleteTimerQueueTimer(NULL, hTimer, NULL));
}
[RUN] CTest.TimerQueue 未知文件:错误:测试正文中抛出代码为0xc000000d的SEH异常。
答案 0 :(得分:2)
MSDN说:“Timer [in]:定时器队列定时器的句柄。这个句柄由CreateTimerQueueTimer函数返回。”
您正在为同一DeleteTimerQueueTimer
两次致电hTimer
。因此,在第二次调用DeleteTimerQueueTimer
时,您没有遵守函数规范,因为您传递了一些无效的HANDLE
。 Windows可能(在我看来应该)以比使用SEH或挂起更好的方式处理它,但是:垃圾进入,垃圾输出。