Winapi WTSRegisterSessionNotification不';有时在XP home启动时无法工作
我正在使用功能/消息检查工作站是否已锁定。现在,我的应用程序位于启动文件夹中。它在XP pro上运行没有任何问题,但由于我在XP home上使用该程序,WTSRegisterSessionNotification在启动时大约有50%的时间失败,但在系统已经启动时,它从未失败。知道为什么会发生这种情况吗?在XP上,服务在后台启动,不会阻止启动或登录。在调用WTSRegisterSessionNotification时,termsrv服务很可能未运行 您可以通过以下方式检查服务是否正在运行:Winapi WTSRegisterSessionNotification不';有时在XP home启动时无法工作,winapi,windows-xp,startup,Winapi,Windows Xp,Startup,我正在使用功能/消息检查工作站是否已锁定。现在,我的应用程序位于启动文件夹中。它在XP pro上运行没有任何问题,但由于我在XP home上使用该程序,WTSRegisterSessionNotification在启动时大约有50%的时间失败,但在系统已经启动时,它从未失败。知道为什么会发生这种情况吗?在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);
阅读MSDN备注部分的内容 如果在终端服务的从属服务启动之前调用此函数,则可能会返回
RPC\u S\u INVALID\u BINDING
错误代码。设置全局\TermSrvReadyEvent全局事件时,所有相关服务都已启动,可以成功调用此函数
因此,一个简洁的解决方案可能是获得Global\TermSrvReadyEvent
事件的句柄,然后在调用WTSRegisterSessionNotification
之前(使用从OpenEvent
获得的句柄和一个合理的超时)等待终端服务启动(使句柄发出信号)
当然,您也可以首先调用
WTSRegisterSessionNotification
,如果失败,请使用GetLastError
查看它是否返回RPC\u无效\u绑定
,如果返回,请执行上述操作。Ah。。。谢谢你们两位。我怀疑XP home是故障的原因。那只是个意外。。。欢呼声应该是“TermService”而不是“TermSrv”。