WTSRegisterSessionNotification иногда не работает при запуске с XP home - PullRequest
2 голосов
/ 28 апреля 2009

Я использую функцию / сообщение, чтобы проверить, заблокирована ли рабочая станция. Теперь мое приложение находится в папке автозагрузки. Это работало без проблем на XP pro, но поскольку я использую программу на XP home, WTSRegisterSessionNotification завершается сбоем около 50% времени при запуске, но никогда не происходит, когда система уже загружена. Есть идеи, почему это могло произойти?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2009

Чтение из раздела замечаний MSDN для WTSRegisterSessionNotification это говорит

Если эта функция вызывается до запуска зависимых служб служб терминалов, может быть возвращен код ошибки RPC_S_INVALID_BINDING. Когда установлено глобальное событие Global \ TermSrvReadyEvent, все зависимые службы запущены, и эту функцию можно успешно вызвать.

Таким образом, можно использовать OpenEvent для получения дескриптора события Global\TermSrvReadyEvent, затем использовать WaitForSingleObject (с дескриптором, полученным из OpenEvent и разумным тайм-аутом ) ждать запуска служб терминала (вызывая сигнализацию дескриптора) перед вызовом WTSRegisterSessionNotification.

Конечно, вы, вероятно, также могли бы начать с WTSRegisterSessionNotification, а затем, если это не удалось, использовать GetLastError, чтобы увидеть, вернул ли он RPC_S_INVALID_BINDING, и, если это так, сделать выше.

3 голосов
/ 28 апреля 2009

В XP службы запускаются в фоновом режиме и не блокируют загрузку или вход в систему. Скорее всего, служба termrv не будет запущена к тому времени, когда вы вызываете WTSRegisterSessionNotification.

Вы можете проверить, работает ли служба:

// 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);
...