我的程序中有以下代码,它动态链接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,我在WinMain方法中调用RegisterSession()(按照1800的建议删除FreeLibrary)并在CALLBACK WindowProcedure函数的WM_DESTROY中调用UnRegisterSession()。但仍然应用程序挂起。
答案 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期间取消注册通知。