Создание службы (SERVICE_ACCEPT_SESSIONCHANGE) - PullRequest
2 голосов
/ 27 апреля 2010

Я пытаюсь создать сервис по примеру, приведенному в ссылке ниже: http://msdn.microsoft.com/en-us/library/bb540475(v=VS.85).aspx

Что меня интересует, так это возможность улавливать пользовательские события «блокировка» и «разблокировка» рабочей станции.

Используя код из предоставленного примера, я изменил следующее:

Строка 15:

Оригинал:

VOID WINAPI SvcCtrlHandler( DWORD );

Изменен:

DWORD WINAPI SvcCtrlHandler( DWORD, DWORD, LPVOID, LPVOID );

Строка 141:

Оригинал:

gSvcStatusHandle = RegisterServiceCtrlHandler( SVCNAME, SvcCtrlHandler);

Изменено:

gSvcStatusHandle = RegisterServiceCtrlHandlerEx( SVCNAME, SvcCtrlHandler, NULL);

Строка 244:

Оригинал:

gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;

Изменено:

gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SESSIONCHANGE;

Строка 266:

Оригинал:

VOID WINAPI SvcCtrlHandler( DWORD dwCtrl )
{
   // Handle the requested control code. 

   switch(dwCtrl) 
   {  
      case SERVICE_CONTROL_STOP: 
         ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);

         // Signal the service to stop.

         SetEvent(ghSvcStopEvent);
         ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);

         return;

      case SERVICE_CONTROL_INTERROGATE: 
         break; 

      default: 
         break;
   }    
}

Изменен:

DWORD WINAPI SvcCtrlHandler( DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext )
{
   DWORD dwErrorCode = NO_ERROR;

   switch(dwControl) 
   {  
      case SERVICE_CONTROL_STOP: 
         ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);

         // Signal the service to stop.

         SetEvent(ghSvcStopEvent);
         ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
   break;

      case SERVICE_CONTROL_INTERROGATE: 
         break; 

      case SERVICE_CONTROL_SESSIONCHANGE:
 ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
 break;

      default:
 break;
   }

   return dwErrorCode;   
}

С изменениями, указанными выше, моя служба скомпилирована и установлена ​​нормально.

Я пытаюсь запустить свой сервис на компьютере с Windows 7, он запустится нормально (но я не смогу остановить, приостановить или сделать что-нибудь для сервиса, так как все опции будут отключены).

Я также попробовал свой сервис на моем компьютере с Windows 2000, он даже не запускается (он будет зависать в состоянии «запуска»)

Моя главная задача - заставить сервис работать должным образом в среде Windows 7, а обратная совместимость в Windows 2000 будет бонусом.

Может кто-нибудь пожалуйста посоветовать? Заранее спасибо,

Рон

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

У меня есть тестовая служба, которая принимает события смены сеанса и прекрасно работает в Windows 7. Она поддерживает все возможные уведомления и корректно разрешает остановки и паузы и обрабатывает события смены сеанса.

Не очень полезно, я знаю, но, по крайней мере, вы знаете, что вы должны иметь возможность заставить его работать так, как это задокументировано ... Мой сервисный код значительно сложнее, чем основной пример, который у вас есть, поэтому я не вижу с первого взгляда, какую ошибку ты совершаешь.

Поскольку вы не видите остановку, доступную в качестве опции, я проверю, правильно ли вы устанавливаете принятые элементы управления, или просто измените обратно на остановку и убедитесь, что вы видите остановку в качестве опции после запуска служба ...

1 голос
/ 27 апреля 2010

MSDN говорит : SERVICE_ACCEPT_SESSIONCHANGE: «Windows 2000: это значение не поддерживается.»

Не уверен, является ли это реальной причиной, по которой служба застревает на начальной стадии.

Редактировать: Альтернативные способы получения событий сеанса в Windows 2000:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...