Visual Studio — Запустите приложение службы с помощью StartService в Stack Overflow

Я создал windows service приложение в C++ с помощью Visual Studio 2013, в main() вызовите другую функцию, тело которой содержит следующий код:

SERVICE_TABLE_ENTRY SerTable[] =
{
{ const_cast<char *>(ServiceName.c_str()), (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};
int res = StartServiceCtrlDispatcher(SerTable);
if (res == 0)
{
DEBUG_LOG(ServiceName+":StartServiceCtrlDispatcher failed", GetLastError());
return QERROR;
}

Моя функция main () также содержит system("start notepad");

Я могу успешно собрать программу, и исполняемый файл генерируется. Теперь я пытаюсь открыть этот exe из другой программы, используя OpenSCManager(), а также CreateService(), Этим сервис создан и перечислен под Services.msc, Я щелкнул правой кнопкой мыши и запустил сервис, и он показывает status как started, Но ничего не происходит ..

Теперь, если я дважды нажму на мой exe это показывает сообщение: error 1063: StartServiceControldispatcher Failed а затем открывает блокнот.

Почему блокнот не открывается при запуске службы под Services.msc?

0

Решение

Вы должны запустить блокнот с вашего ServiceMain не main, ServiceMain это функция, которая вызывается при запуске службы операционной системой, поэтому переместите system("start notepad") позвони своему ServiceMain,

БОЛЬШЕ РАЗЪЯСНЕНИЙ

В ответ на комментарий ОП — ошибка, которая сейчас происходит, составляет 1063 или ERROR_FAILED_SERVICE_CONTROLLER_CONNECT, Документация StartServiceCtrlDispatcher объясняет, что:

Эта ошибка возвращается, если программа запускается как консольное приложение, а не как служба.

Вот почему вы получаете ошибку при запуске исполняемого файла двойным щелчком — вы запускаете его как консольное приложение. Когда вы правильно запустите службу (из Панели управления, командной строки или WinAPI), эта функция будет выполнена успешно.

Когда диспетчер управления службами запускает процесс службы, он ожидает, пока процесс вызовет функцию StartServiceCtrlDispatcher. Основной поток сервисного процесса должен выполнить этот вызов как можно скорее после его запуска (в течение 30 секунд). Если StartServiceCtrlDispatcher завершается успешно, он подключает вызывающий поток к диспетчеру управления службами и не возвращается, пока все запущенные службы в процессе не перейдут в состояние SERVICE_STOPPED. Диспетчер управления службами использует это соединение для отправки запросов управления и запуска службы в основной поток процесса службы. Основной поток действует как диспетчер, вызывая соответствующую функцию HandlerEx для обработки управляющих запросов или создавая новый поток для выполнения соответствующей функции ServiceMain при запуске новой службы.

Так что да, после правильного запуска, ServiceMain будет называться.

1

Другие решения


По вопросам рекламы [email protected]