Winapi WTSRegisterSessionNotification不';有时在XP home启动时无法工作

Winapi WTSRegisterSessionNotification不';有时在XP home启动时无法工作,winapi,windows-xp,startup,Winapi,Windows Xp,Startup,我正在使用功能/消息检查工作站是否已锁定。现在,我的应用程序位于启动文件夹中。它在XP pro上运行没有任何问题,但由于我在XP home上使用该程序,WTSRegisterSessionNotification在启动时大约有50%的时间失败,但在系统已经启动时,它从未失败。知道为什么会发生这种情况吗?在XP上,服务在后台启动,不会阻止启动或登录。在调用WTSRegisterSessionNotification时,termsrv服务很可能未运行 您可以通过以下方式检查服务是否正在运行: //

我正在使用功能/消息检查工作站是否已锁定。现在,我的应用程序位于启动文件夹中。它在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”。