Проблема со службой Windows (C ++, WinAPI) - PullRequest
1 голос
/ 21 ноября 2011

У меня проблема со службами Windows, мое приложение регистрирует службу Windows, но когда я пытаюсь запустить службу, я получаю следующую ошибку: «Ошибка 1053: служба не ответила на запрос запуска или управления всвоевременная мода ".Следующий код отвечает за регистрацию сервиса (я получил его от MSDN).

SC_HANDLE schSCManager;
SC_HANDLE schService;

path modulePath("some path to executable");

std::string moduleName = narrow(modulePath.native());

if(!GetModuleFileNameA(NULL, &moduleName[0], MAX_PATH))
{
 throw std::runtime_error("Cannot register service, error code: " +    boost::lexical_cast<std::string>(GetLastError()));
}

// Get a handle to the SCM database. 
   schSCManager = OpenSCManager(NULL,                   // local computer
                                NULL,                   // ServicesActive database 
                                SC_MANAGER_ALL_ACCESS); // full access rights 

   if(!schSCManager) 
   {
      throw std::runtime_error("OpenSCManager failed: " + boost::lexical_cast<std::string>(GetLastError()));
   }

   // Create the service
   schService = CreateServiceA( 
        schSCManager,              // SCM database 
        "name",                  // name of service 
        "displayname",                  // service name to display 
        SERVICE_ALL_ACCESS,        // desired access 
        SERVICE_WIN32_OWN_PROCESS, // service type 
        SERVICE_AUTO_START,        // start type 
        SERVICE_ERROR_NORMAL,      // error control type 
        narrow(modulePath.native()).c_str(), // path to service's binary 
        NULL,                      // no load ordering group 
        NULL,                      // no tag identifier 
        NULL,                      // no dependencies 
        NULL,                      // LocalSystem account 
        NULL);                     // no password 

   if(!schService) 
   {
      CloseServiceHandle(schSCManager);

      throw std::runtime_error("CreateService failed: " + boost::lexical_cast<std::string>(GetLastError()));
   }
   else
   {
      //std::cout << "\nService installed successfully\n";
   } 

   CloseServiceHandle(schService); 
   CloseServiceHandle(schSCManager);   

Не могли бы вы помочь исправить это?

1 Ответ

6 голосов
/ 21 ноября 2011

В случае, если данный код - единственное, что вы попробовали, вам не хватает некоторых важных требований для службы Windows.Пожалуйста, посмотрите на документацию

Вам нужна как минимум основная функция обслуживания (которая отличается от основного метода!) И обработчик управления функция , поскольку вы не можете обработать команду «пуск», если не зарегистрирована функция обработчика элемента управления (которая выполняется в главной службе)

Для правильной работы вам необходимо:

  1. обычный основной метод , чтобы определить, хотите ли вы установить службу или иным образом запустить диспетчер управления службами со службами SERVICE_TABLE_ENTRY
    эта таблица содержит в двух словах имя процесса и функциюуказатель на его основную функцию службы
  2. вам нужна основная функция службы , которая регистрирует функцию обработчика управления службами функций и затем запускает функцию кода службы
  3. службу функция кода содержит код, относящийся к работе службы, это сердце службы
  4. вам нужна служба cфункция управления Hander .он вызывается из диспетчера управления службами Windows, всякий раз, когда контрольный код отправляется службе ... это метод, который получает команду "стоп" ... и если эта функция не существует или не зарегистрирована должным образому вас может получиться ошибка, подобная упомянутой ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...