2

我正在使用该功能/消息来检查工作站是否被锁定。现在我的应用程序位于启动文件夹中。它在 XP pro 上运行没有任何问题,但由于我在 XP 主页上使用该程序 WTSRegisterSessionNotification 在启动时大约 50% 的时间失败,但在系统已经启动时它永远不会失败。知道为什么会发生这种情况吗?

4

2 回答 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 回答