WTSRegisterSessionNotification有时在启动XP Home时不起作用

时间:2009-04-28 19:51:48

标签: winapi windows-xp startup

我正在使用函数/消息检查工作站是否已锁定。现在我的应用程序位于启动文件夹中。它在XP专业版上没有任何问题,但由于我在XP上使用该程序,WTSRegisterSessionNotification在启动时大约有50%的时间失败,但是当系统启动时它永远不会失败。知道为什么会这样吗?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

WTSRegisterSessionNotification 的MSDN备注部分阅读

  

如果在终端服务的从属服务启动之前调用此函数,则可能会返回RPC_S_INVALID_BINDING错误代码。设置Global \ TermSrvReadyEvent全局事件后,所有相关服务都已启动,并且可以成功调用此函数。

所以一个简洁的解决方案可能是使用OpenEvent来获取Global\TermSrvReadyEvent事件的句柄然后使用 WaitForSingleObject (使用从OpenEvent获得的句柄和合理的超时)在调用WTSRegisterSessionNotification之前等待终端服务启动(导致句柄发出信号)。

当然,您可能也可以先致电WTSRegisterSessionNotification,如果失败,请使用GetLastError查看是否返回RPC_S_INVALID_BINDING,如果是,请执行以上操作。< / p>