我正在使用该功能/消息来检查工作站是否被锁定。现在我的应用程序位于启动文件夹中。它在 XP pro 上运行没有任何问题,但由于我在 XP 主页上使用该程序 WTSRegisterSessionNotification 在启动时大约 50% 的时间失败,但在系统已经启动时它永远不会失败。知道为什么会发生这种情况吗?
问问题
2888 次
2 回答
3
在 XP 上,服务在后台启动,不会阻止引导或登录。在您调用 WTSRegisterSessionNotification 时,termsrv 服务很可能没有运行。
您可以通过以下方式检查服务是否正在运行:
// Error handling omitted for brevity
SC_HANDLE scm = OpenSCManager(NULL, NULL, GENERIC_READ);
SC_HANDLE svc = OpenService(scm, L"TermSrv", SERVICE_QUERY_STATUS);
SERVICE_STATUS status;
QueryServiceStatus(svc, &status);
if (status.dwCurrentSTate != SERVICE_RUNNING) {
// Try to start, wait and try again, etc.
}
CloseServiceHandle(svc);
CloseServiceHandle(scm);
于 2009-04-28T19:59:25.810 回答
3
从WTSRegisterSessionNotification的 MSDN 备注部分阅读它说
如果在终端服务的依赖服务启动之前调用该函数,
RPC_S_INVALID_BINDING
可能会返回错误码。Global\TermSrvReadyEvent 全局事件设置后,所有依赖的服务都已启动,可以成功调用该函数。
因此,一个巧妙的解决方案可能是使用OpenEvent获取Global\TermSrvReadyEvent
事件的句柄,然后使用WaitForSingleObject(使用从获取的句柄OpenEvent
和合理的超时)等待终端服务启动(导致句柄被发出信号),然后再调用WTSRegisterSessionNotification
.
当然,您也可以调用WTSRegisterSessionNotification
以 then 开头,如果失败,则使用GetLastError
查看它是否返回RPC_S_INVALID_BINDING
,如果是,则执行上述操作。
于 2009-04-28T21:27:56.267 回答