显式链接DLL和程序挂起

时间:2009-10-07 06:53:38

标签: c++ dll winapi

我的程序中有以下代码,它动态链接wtsapi32.dll文件以获取WTS_SESSION_LOCKWTS_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,我在WinMain方法中调用RegisterSession()(按照1800的建议删除FreeLibrary)并在CALLBACK WindowProcedure函数的WM_DESTROY中调用UnRegisterSession()。但仍然应用程序挂起。

3 个答案:

答案 0 :(得分:4)

我说你可能无法安全地调用FreeLibrary - 你将卸载你想给你打电话的代码。在收到通知之前,您应该确保不要释放dll。

答案 1 :(得分:0)

MS文档建议您在重新注册会话之前必须调用WTSUnRegisterSessionNotification - 因为它只会在您第二次尝试锁定它时发生,这可能是您的问题?

使用1800 wrt的免费库 - 您必须在使用它时加载此库。

答案 2 :(得分:0)

根据文件(http://msdn.microsoft.com/en-us/library/aa383841(VS.85).aspx):

“当一个窗口不再需要这些通知时,它必须在被销毁之前调用WTSUnRegisterSessionNotification。”

我会尝试在WM___CLOSE而非WM_DESTROY期间取消注册通知。