Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        5年前关闭。
                                                                                            
                
        
根据上下文,第二个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));
}


[运行] CTest.TimerQueue
未知文件:错误:在测试主体中引发了代码为0xc000000d的SEH异常。

最佳答案

MSDN说:“计时器[输入]:计时器队列计时器的句柄。该句柄由CreateTimerQueueTimer函数返回。”

您为相同的DeleteTimerQueueTimer两次调用hTimer。因此,在第二次调用DeleteTimerQueueTimer时,您未遵循函数规范,因为您传递了一些无效的HANDLE。 Windows可能(我认为应该)比SEH或挂起更好的方式来处理该问题,但是:进站,出站。

10-04 13:34