Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сервис C++

23K
30 декабря 2012 года
1_2
34 / / 09.01.2012
Доброго времени суток!
В сети нашёл пример сервера на C++, сделал его, но почему-то после регистрации он не запускается. Помогите, пожалуйста, найти ошибку. Вот код:

Код:
#include <windows.h>
#include <winsvc.h>

SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle;

int addLogMessage(char *a)
{
    printf("%s", a);
    return 1;
}

void ServiceMain(int argc, char** argv)
{
      int error;
      int i = 0;

      serviceStatus.dwServiceType    = SERVICE_WIN32_OWN_PROCESS;
      serviceStatus.dwCurrentState    = SERVICE_START_PENDING;
      serviceStatus.dwControlsAccepted  = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
      serviceStatus.dwWin32ExitCode   = 0;
      serviceStatus.dwServiceSpecificExitCode = 0;
      serviceStatus.dwCheckPoint     = 0;
      serviceStatus.dwWaitHint      = 0;

      serviceStatusHandle = RegisterServiceCtrlHandler(TEXT("SampleService"), /*(LPHANDLER_FUNCTION)ControlHandler*/NULL);
      if (serviceStatusHandle == (SERVICE_STATUS_HANDLE)0) {
        return;
      }

//    error = InitService();
      if (error) {
        serviceStatus.dwCurrentState    = SERVICE_STOPPED;
        serviceStatus.dwWin32ExitCode   = -1;
        SetServiceStatus(serviceStatusHandle, &serviceStatus);
        return;
      }
     
      serviceStatus.dwCurrentState = SERVICE_RUNNING;
      SetServiceStatus (serviceStatusHandle, &serviceStatus);

      while (serviceStatus.dwCurrentState == SERVICE_RUNNING)
      {
        char buffer[255];
        sprintf_s(buffer, "%u", i);
        int result = addLogMessage(buffer);
        if (result)  {
          serviceStatus.dwCurrentState    = SERVICE_STOPPED;
          serviceStatus.dwWin32ExitCode   = -1;
          SetServiceStatus(serviceStatusHandle, &serviceStatus);
          return;
        }
        i++;
      }

      return;
}

void ControlHandler(DWORD request)
{
      switch(request)
      {
        case SERVICE_CONTROL_STOP:
          addLogMessage("Stopped.");

          serviceStatus.dwWin32ExitCode = 0;
          serviceStatus.dwCurrentState = SERVICE_STOPPED;
          SetServiceStatus (serviceStatusHandle, &serviceStatus);
          return;

        case SERVICE_CONTROL_SHUTDOWN:
          addLogMessage("Shutdown.");

          serviceStatus.dwWin32ExitCode = 0;
          serviceStatus.dwCurrentState = SERVICE_STOPPED;
          SetServiceStatus (serviceStatusHandle, &serviceStatus);
          return;
       
        default:
          break;
      }

      SetServiceStatus (serviceStatusHandle, &serviceStatus);

      return;
}

int InstallService() {
      SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
      if(!hSCManager) {
        addLogMessage("Error: Can't open Service Control Manager");
        return -1;
      }
     
      SC_HANDLE hService = CreateService(
         hSCManager,
         TEXT("SampleService"),
         TEXT("SampleService"),
         SERVICE_ALL_ACCESS,
         SERVICE_WIN32_OWN_PROCESS,
         SERVICE_DEMAND_START,
         SERVICE_ERROR_NORMAL,
         TEXT("C:\\Service\\"),
         NULL, NULL, NULL, NULL, NULL
      );

      if(!hService) {
        int err = GetLastError();
        switch(err) {
          case ERROR_ACCESS_DENIED:
            addLogMessage("Error: ERROR_ACCESS_DENIED");
            break;
          case ERROR_CIRCULAR_DEPENDENCY:
            addLogMessage("Error: ERROR_CIRCULAR_DEPENDENCY");
            break;
          case ERROR_DUPLICATE_SERVICE_NAME:
            addLogMessage("Error: ERROR_DUPLICATE_SERVICE_NAME");
            break;
          case ERROR_INVALID_HANDLE:
            addLogMessage("Error: ERROR_INVALID_HANDLE");
            break;
          case ERROR_INVALID_NAME:
            addLogMessage("Error: ERROR_INVALID_NAME");
            break;
          case ERROR_INVALID_PARAMETER:
            addLogMessage("Error: ERROR_INVALID_PARAMETER");
            break;
          case ERROR_INVALID_SERVICE_ACCOUNT:
            addLogMessage("Error: ERROR_INVALID_SERVICE_ACCOUNT");
            break;
          case ERROR_SERVICE_EXISTS:
            addLogMessage("Error: ERROR_SERVICE_EXISTS");
            break;
          default:
            addLogMessage("Error: Undefined");
        }
        CloseServiceHandle(hSCManager);
        return -1;
      }
      CloseServiceHandle(hService);
     
      CloseServiceHandle(hSCManager);
      addLogMessage("Success install service!");
      return 0;
    }

int RemoveService() {
      SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
      if(!hSCManager) {
         addLogMessage("Error: Can't open Service Control Manager");
         return -1;
      }
      SC_HANDLE hService = OpenService(hSCManager, TEXT("SampleService"), SERVICE_STOP | DELETE);
      if(!hService) {
         addLogMessage("Error: Can't remove service");
         CloseServiceHandle(hSCManager);
         return -1;
      }
     
      DeleteService(hService);
      CloseServiceHandle(hService);
      CloseServiceHandle(hSCManager);
      addLogMessage("Success remove service!");
      return 0;
    }

int StartService() {
      SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
      SC_HANDLE hService = OpenService(hSCManager, TEXT("SampleService"), SERVICE_START);
      if(!StartService(hService, 0, NULL)) {
        CloseServiceHandle(hSCManager);
        addLogMessage("Error: Can't start service");
        return -1;
      }
     
      CloseServiceHandle(hService);
      CloseServiceHandle(hSCManager);
      return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char * servicePath =  "C:\\Service\\";

  if(argc - 1 == 0) {
    SERVICE_TABLE_ENTRY ServiceTable[1];
    ServiceTable[0].lpServiceName = TEXT("SampleService");
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

    if(!StartServiceCtrlDispatcher(ServiceTable)) {
      addLogMessage("Error: StartServiceCtrlDispatcher");
    }
  } else if( wcscmp(argv[argc-1], _T("install")) == 0) {
    InstallService();
  } else if( wcscmp(argv[argc-1], _T("remove")) == 0) {
    RemoveService();
  } else if( wcscmp(argv[argc-1], _T("start")) == 0 ){
    StartService();
  }

    return 0;
}
7
30 декабря 2012 года
@pixo $oft
3.4K / / 20.09.2006
Пробовали включить и выключить отлаживать? Какие результаты?
23K
30 декабря 2012 года
1_2
34 / / 09.01.2012
Я не очень разбираюсь в отладке, тем более не могу послать значение в argv (через отладчик)(.
1
30 декабря 2012 года
kot_
7.3K / / 20.01.2000
Цитата: 1_2
Я не очень разбираюсь в отладке, тем более не могу послать значение в argv (через отладчик)(.


ну значит, придется начать в этом разбираться. Самое время. Потому как за тебя этого никто делать не будет.
И кстати, какие ошибки в журналах Win?

11K
30 декабря 2012 года
xAtom
65 / / 17.01.2011
Везде где есть проверка на валидность или отрицательный результат получи код функцией GetLastError далеее для получения описания ошибки передай код функции FormatMessage.
1
31 декабря 2012 года
kot_
7.3K / / 20.01.2000
Цитата: xAtom
Везде где есть проверка на валидность или отрицательный результат получи код функцией GetLastError далеее для получения описания ошибки передай код функции FormatMessage.


ну у него вообщето практически все ошибки и без того обрабатываются - для этого достаточно посмотреть код.
Практически все проблемы должны быть видны в журналах системы.

23K
31 декабря 2012 года
1_2
34 / / 09.01.2012
В системном журнале (eventvwr.msc) по поводу сервиса почему-то нет никаких отметок.
414
31 декабря 2012 года
CassandraDied
763 / / 24.05.2012
Цитата:
Error: Can't open Service Control Manager


ERROR_ACCESS_DENIED.

23K
01 января 2013 года
1_2
34 / / 09.01.2012
Это что получается... не хватает прав? И как тогда запустить от имени обычного пользователя?
414
01 января 2013 года
CassandraDied
763 / / 24.05.2012

И так запускается от обычного. Чтобы установить, необходимо запускать студию от администратора. Но не гарантирую, что что-то будет работать. Код кривой.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог