Есть у меня сервис и запускалка сервиса находятся в разных exe файла. Хочу с сырца сделать всё в одном exe файле. Делаю так: SERVICE_TABLE_ENTRY servicetable[]= { {L"ControlService", (LPSERVICE_MAIN_FUNCTION)StartServiceThread}, {NULL,NULL} }; StartServiceCtrlDispatcher(servicetable); InstallService("ControlService") StartService("ControlService"); В итоге когда запускается поток в сервисе, он начинает выполнятся, и сразу выкидает в ошибку иногда сервис вообще находится в состоянии запуска. Помогите разобраться в чем тут проблема.
там все просто, смотри в чужие срц. обычно делают так, добавляют парам, и когда есть парам стартуют как сервис, без парама стартут как инсталер, и потом через диспатчер стартуют сервис.
А "не обычно" - проверяют имя программы запустившей сервис. Если services.exe - запуск сервиса, иначе конфигурирование.
Забыл добавить, желательно ещё проверить местонахождение иайденого services.exe Если SystemRoot - однозначно запуск сервиса.
Если сервис запускается под учеткой SYSTEM (как по дефолту, если не указывать явно), тогда достаточно проверить SeTcbPrivilege. Код (Text): #define RUNNING_IN_SERVICE 1 #define RUNNING_IN_APP 0 #define RUNNING_DETECT_ERROR ((UCHAR)-1) UCHAR InServiceProcess () { HANDLE hToken; if (!OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &hToken)) { return RUNNING_DETECT_ERROR; } PRIVILEGE_SET tp; tp.PrivilegeCount = 1; tp.Privilege[0].Attributes = 0; tp.Control = 0; if (!LookupPrivilegeValue (NULL, SE_TCB_NAME, &tp.Privilege[0].Luid)) { CloseHandle (hToken); return RUNNING_DETECT_ERROR; } BOOL Result; BOOL Status; Status = PrivilegeCheck (hToken, &tp, &Result); CloseHandle (hToken); if (!Status) return RUNNING_DETECT_ERROR; return Result; }
Сделал всё норм работает. Теперь другая проблема. Когда в поток сервиса добавляю много кода, сам сервис вешается. Разве есть какие-то ограничения на время выполнения потока?
serega28 В какой поток? Инициализация? Если да - то есть. http://www.rsdn.ru/article/baseserv/svcadmin-1.xml http://www.rsdn.ru/article/baseserv/svcadmin-2.xml