Явное связывание DLL и зависаний программы - PullRequest
1 голос
/ 07 октября 2009

В моей программе есть следующий фрагмент кода, который динамически связывает файл wtsapi32.dll для уведомлений о сеансах, таких как WTS_SESSION_LOCK и WTS_SESSION_UNLOCK, и работает в фоновом режиме. После первой блокировки / разблокировки программа зависает и не отвечает.

Это правильный способ делать явные ссылки?

    void RegisterSession(HWND hwnd) 
    {
        typedef DWORD (WINAPI *tWTSRegisterSessionNotification)( HWND,DWORD );

        tWTSRegisterSessionNotification pWTSRegisterSessionNotification=0;
        HINSTANCE handle = ::LoadLibrary("wtsapi32.dll");
        pWTSRegisterSessionNotification = (tWTSRegisterSessionNotification) :: GetProcAddress(handle,"WTSRegisterSessionNotification");
        if (pWTSRegisterSessionNotification)
        {
            pWTSRegisterSessionNotification(hwnd,NOTIFY_FOR_THIS_SESSION);
        }
        ::FreeLibrary(handle);
        handle = NULL;
     }

Отредактировано:

У меня есть другой метод UnRegisterSession (), который вызывает WTSUnRegisterSessionNotification, я вызываю RegisterSession () в методе WinMain (удалено FreeLibrary, как предложено 1800) и вызываю UnRegisterSession () в WM_DESTROY функции CALLBACK WindowProcedure. Но все равно приложение зависает.

Ответы [ 3 ]

4 голосов
/ 07 октября 2009

Я бы сказал, что вы, вероятно, не можете безопасно вызывать FreeLibrary таким образом - вы будете выгружать код, который хотите, чтобы вам звонили. Вы, вероятно, должны убедиться, что не освобождаете dll, пока не закончите получать уведомления.

0 голосов
/ 07 октября 2009

Согласно документации (http://msdn.microsoft.com/en-us/library/aa383841(VS.85).aspx):

"Когда окну больше не требуются эти уведомления, оно должно вызвать WTSUnRegisterSessionNotification перед уничтожением."

Я бы попытался отменить регистрацию уведомления во время WM___CLOSE вместо WM_DESTROY.

0 голосов
/ 07 октября 2009

Документация MS предполагает, что вы должны вызвать WTSUnRegisterSessionNotification перед перерегистрацией сеанса - поскольку это происходит только при вашей второй попытке заблокировать его, возможно, это ваша проблема?

С 1800 по бесплатной библиотеке - вы должны держать эту библиотеку загруженной, пока вы ее используете.

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