2

関数/メッセージを使用して、ワークステーションがロックされているかどうかを確認しています。これで、アプリケーションはスタートアップフォルダーにあります。XP proでは問題なく動作しましたが、XPホームでプログラムを使用しているため、WTSRegisterSessionNotificationは起動時に約50%失敗しますが、システムが既に起動している場合は失敗しません。なぜこれが起こる可能性があるのか​​考えていますか?

4

2 に答える 2

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);
于 2009-04-28T19:59:25.810 に答える
3

WTSRegisterSessionNotificationのMSDNのコメントセクションから読むと、

ターミナル サービスの依存サービスが開始される前にこの関数が呼び出されると、RPC_S_INVALID_BINDINGエラー コードが返される場合があります。Global\TermSrvReadyEvent グローバル イベントが設定されると、すべての依存サービスが開始され、この関数を正常に呼び出すことができます。

そのため、 OpenEventを使用してGlobal\TermSrvReadyEventイベントへのハンドルを取得し、 WaitForSingleObject (から取得したハンドルと適切OpenEventなタイムアウトを使用) を使用して、ターミナル サービスが開始するのを待機し (ハンドルにシグナルが送信されるようにする) WTSRegisterSessionNotification、.

もちろん、最初に呼び出すこともできWTSRegisterSessionNotificationます。失敗した場合は、 を使用GetLastErrorして返さRPC_S_INVALID_BINDINGれたかどうかを確認し、返された場合は上記を実行します。

于 2009-04-28T21:27:56.267 に答える