Доброго времени суток форумчане. Столкнулся с такой проблемой. Создаю службу CreateService и запускаю её StartService. Но происходит ошибка ERROR_SERVICE_REQUEST_TIMEOUT. Вот собственно вопрос, что означает эта ошибка и как её забороть? Нашёл описание ошибки: То есть получается что exe, имя которой передаётся в параметре lpBinaryPathName функции CreateService должна вызвать StartServiceCtrlDispatcher в своём коде? Другими словами cmd.exe не можеть быть службой чтоли?
Что внезапного-то и смешного? cmd.exe не цель запуска как службы с правами system, (есть более элегантные способы), а как пример exe, который не вызывает функцию StartServiceCtrlDispatcher, но "хочет быть" сервисом.
Можно, конешно, инжектировать в cmd.exe кот, который вызывает StartServiceCtrlDispatcher. Можно поковыряться в едре и объявить произвольный процесс сервисом. Но нормального способа не существует.
inshade Пусть запустит сам себя. Винда ждет некоторое время ответа от сервиса, если не дожидается, то завершает. За это время файл запускает сам себя (или другой файл).
Дык я понял что служба должна вызывать у себя в коде StartServiceCtrlDispatcher. Проблема решена, просто прочитав про параметр lpBinaryPathName думал что любое exe может стать службой. Мне легальная служба нужна, а так канешь чиб-чё есть 30 секунд на выполнение. Ursus Самый простой способ - это поправить в реестре ключи, отвечающие за восстановление службы, на запуск программы с параметрами и "уронить" спулера через AddPrintProvidorW Ещё раз повторюсь мне нужна легальная служба, и ответ от K10 #2 - самый информативный. up: Такой вопрос:"Подскажите почему MessageBox не выводит окошко, если она (функция) выполняется в коде службы?"
inshade Сервисы работают на своем отдельном рабочем столе. Для того, чтобы взаимодейсвовать с десктопом пользователя нужно либо в коде к нему подключаться (SetProcessWindowStation, SetThreadDesktop), либо при установке службы установить параметр dwServiceType (в свойствах службы называется "Разрешить взаимодействие с рабочим столом"). Код (Text): SC_HANDLE CreateService( SC_HANDLE hSCManager, // handle to service control manager database LPCTSTR lpServiceName, // pointer to name of service to start LPCTSTR lpDisplayName, // pointer to display name DWORD dwDesiredAccess, // type of access to service DWORD dwServiceType, // type of service DWORD dwStartType, // when to start service DWORD dwErrorControl, // severity if service fails to start LPCTSTR lpBinaryPathName, // pointer to name of binary file LPCTSTR lpLoadOrderGroup, // pointer to name of load ordering group LPDWORD lpdwTagId, // pointer to variable to get tag identifier LPCTSTR lpDependencies, // pointer to array of dependency names LPCTSTR lpServiceStartName, // pointer to account name of service LPCTSTR lpPassword // pointer to password for service account );