関数/メッセージを使用して、ワークステーションがロックされているかどうかを確認しています。これで、アプリケーションはスタートアップフォルダーにあります。XP proでは問題なく動作しましたが、XPホームでプログラムを使用しているため、WTSRegisterSessionNotificationは起動時に約50%失敗しますが、システムが既に起動している場合は失敗しません。なぜこれが起こる可能性があるのか考えていますか?
2 に答える
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);
WTSRegisterSessionNotificationのMSDNのコメントセクションから読むと、
ターミナル サービスの依存サービスが開始される前にこの関数が呼び出されると、
RPC_S_INVALID_BINDINGエラー コードが返される場合があります。Global\TermSrvReadyEvent グローバル イベントが設定されると、すべての依存サービスが開始され、この関数を正常に呼び出すことができます。
そのため、 OpenEventを使用してGlobal\TermSrvReadyEventイベントへのハンドルを取得し、 WaitForSingleObject (から取得したハンドルと適切OpenEventなタイムアウトを使用) を使用して、ターミナル サービスが開始するのを待機し (ハンドルにシグナルが送信されるようにする) WTSRegisterSessionNotification、.
もちろん、最初に呼び出すこともできWTSRegisterSessionNotificationます。失敗した場合は、 を使用GetLastErrorして返さRPC_S_INVALID_BINDINGれたかどうかを確認し、返された場合は上記を実行します。