小弟在做一个拦截SMS短信的功能。计划由外部调用dll中的以下函数:EXTERN_C BOOL SMSMessageAvailable (wchar_t *lpDestination, wchar_t *lpPhoneNr)
{
MessageBox(NULL,L"SMSMessageAvailable!",L"001",MB_ICONINFORMATION|MB_OK);     
WaitForSingleObject(g_hClientEvent, INFINITE);
.......
}在DLL中有一个函数会引发SetEvent(g_hClientEvent)
HRESULT CMailRuleClient::ProcessMessage(...)
{
...
SetEvent(g_hClientEvent);
...
}但实际运行时完全不行。首先在外部调用SMSMessageAvailable,运行至WaitForSingleObject(g_hClientEvent, INFINITE)这一行即被挂起。接收到短信后,ProcessMessage函数自动开始运行,运行至SetEvent(g_hClientEvent)后,SMSMessageAvailable函数仍被挂起,并未继续运行。请教各位高手,这到底是什么原因呢?

解决方案 »

  1.   

    1. g_hClientEvent 有没有问题? 如果g_hClientEvent的内存被破坏了,就永远不能被激活了.
    2. 换用 SleepConditionVariable   WakeConditionVariable试试(vista之后才有)
    3. 换用 semphore 信号量为1, 试试。
    4. 还有其他机制,都试试, 我想不起来了,关于同步的机制都试试。
      

  2.   

    你的是手动重置事件吧!每等待到一次事件,事件的计数就会加1,所以在等待到事件处理权后,要注意及时将计数减1.WaitForSingleObject函数是在计数为0的情况下才能返回事件处于有信号状态的。
    如果你在等待到事件信号后,没有将计数减1,那么WaitForSingleObject永远不会返回事件处于有信号状态。
      

  3.   

    WaitForSingleObject(g_hClientEvent, 5000);  判断下返回值  如果没等到 肯定是你程序的问题
      

  4.   

    可能的问题,1、多个不同地方在等待这个 event;2、把 MessageBox 去掉试一试;3、event 的 HANDLE 正确吗,输出一下看看;
      

  5.   

    调一下看看g_hClientEvent的值是否正确。