РегистрацияWaitForSingleObject Windows 7 - PullRequest
1 голос
/ 17 августа 2011

Я использую RegisterWaitForSingleObject для ожидания событий последовательной связи, зарегистрированных с WaitCommEvent.

Код работает хорошо в Windows XP, однако всегда запускает исключение где-то в тредпуле при работе в Windows 7.

Трассировка стека показывает

ntdll.dll!_TppWaiterpThread@4()  + 0x3a7ee bytes    
kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes    
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes   
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes    

Есть ли способ заставить эту функцию работать правильно в Windows 7, или мне нужно будет переписать с поддержкой нового Функции пула потоков в Windows Vista / 7 .

Вот пример того, как я вызываю код.Как заявлено, это работает безупречно на XP

// Calback is on an object defined as a static function
class CommPortCallback
{
public:
    static void WINAPI serialLayerCallback( PVOID lpParameter, 
                                  BOOLEAN TimerOrWaitFired )
    {
        ....
    }
};

// wait is registered later as such
RegisterWaitForSingleObject(&pWaitData->callbackHandle, m_readOverlapped, 
        CommPortCallback::serialLayerCallback, pBaseCallback, 
        INFINITE, WT_EXECUTEONLYONCE) 

1 Ответ

2 голосов
/ 17 августа 2011

Показать код, вызывающий RegisterWaitForSingleObject.

Возможно, ваша функция обратного вызова имеет неправильное соглашение о вызовах или неправильные типы параметров, вы используете приведение указателя функции для отмены жалобы компилятора, а затемуказатель стека остается не выровненным после вызова.


С кодом причина теперь ясна: вы передаете указатель на структуру OVERLAPPED вместо дескриптора события.Похоже, что это никогда не должно было работать правильно на XP, но то, работает он или нет, молча, может зависеть от версии Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...