【发布时间】:2012-07-12 13:50:40
【问题描述】:
我的Windows服务在调用WTSEnumerateProcesses()时偶尔会报如下错误:
绑定句柄无效。
我怀疑这是由于终端服务服务不可用造成的,即使我已将终端服务服务注册为我的服务的依赖服务。
我相信即使终端服务服务正在运行,它还没有完成初始化(或正在关闭)并且无法为任何请求提供服务,从而导致错误。
我在WTSRegisterSessionNotification() 的参考文档中注意到以下内容:
当设置了Global\TermSrvReadyEvent全局事件后,所有依赖的服务都已启动,可以成功调用该函数。
这没有出现在WTSEnumerateProcesses() 的文档中,但它是否同样适用?意思是在Global\\TermSrvReadyEvent 上尝试OpenEvent() 将表明终端服务服务实际上可用?
平台:Windows XP、Windows Vista 和 Windows 7
【问题讨论】:
-
这个假设似乎是合理的,但您可能仍然应该等待事件的正确性,而不仅仅是检查它是否存在。
-
@0xC0000022L,是的,这就是我的意思。听起来好像是我,但我只是想确定一下。
-
@hmjd:只是好奇你是否曾在 XP 以外的操作系统上观察到这一点?在我的测试中,我只能在大多数 WTS* API 中在 Windows XP 上启动后立即看到此错误。这似乎已在 Vista 和更高版本的操作系统下得到修复。
-
@0xC0000022L:我的经验表明,依赖
Global\TermSrvReadyEvent事件导致的问题多于解决的问题。例如,如果您的流程在非管理员用户帐户下运行,您将无法打开该事件,这会产生额外的歧义。在我的测试中,最可靠的方法是在 WTS* API 失败后检查GetLastError,看看它是否是RPC_S_INVALID_BINDING,如果是,请等待一小段时间并再次重复调用(前提是没有超时)过期了。)也就是说,我很头疼!