|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Writing a Service Program's main Function
The main function of a service program calls the StartServiceCtrlDispatcher function to connect to the SCM and start the control dispatcher thread. The dispatcher thread loops, waiting for incoming control requests for the services specified in the dispatch table. This thread does not return until there is an error or all of the services in the process have terminated. When all services in a process have terminated, the SCM sends a control request to the dispatcher thread telling it to shut down. The thread can then return from the StartServiceCtrlDispatcher call and the process can terminate.
The following example is a service process that supports only one service. It takes two parameters: a string that can contain one formatted output character and a numeric value to be used as the formatted character. The SvcDebugOut function prints informational messages and errors to the debugger.
SERVICE_STATUS MyServiceStatus; SERVICE_STATUS_HANDLE MyServiceStatusHandle; VOID MyServiceStart (DWORD argc, LPTSTR *argv); VOID MyServiceCtrlHandler (DWORD opcode); DWORD MyServiceInitialization (DWORD argc, LPTSTR *argv, DWORD *specificError); VOID _CRTAPI1 main( ) { SERVICE_TABLE_ENTRY DispatchTable[] = { { TEXT("MyService"), MyServiceStart }, { NULL, NULL } };
if (!StartServiceCtrlDispatcher( DispatchTable)) { SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError()); } } VOID SvcDebugOut(LPSTR String, DWORD Status) { CHAR Buffer[1024]; if (strlen(String) < 1000) { sprintf(Buffer, String, Status); OutputDebugStringA(Buffer); } }
If your service program supports multiple services, the implementation of the main function will differ slightly. The names of the additional services should be added to the dispatch table so they can be monitored by the dispatcher thread.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Сочинение Программной основной Функции Услуги
Основная функция программы услуги называет функцию StartServiceCtrlDispatcher, чтобы подключать к SCM и запускать управляющую резьбу диспетчера. Резьба диспетчера зацикливает, ждя поступающее управление просится об услугах определенных на столе отправки. Эта резьба не возвращается до есть ошибка или все услуги в процессе завершились. Когда все услуги в процессе завершили, SCM посылает управлению просьбу в резьбу диспетчера, сообщающую, что это отключает. Резьба может затем возвращаться с вызова StartServiceCtrlDispatcher и процесс может завершиться.
Следующий пример является процессом услуги, который поддерживает только один услуга. Это берет два параметра: строка, которая может содержать один отформатировавшее выходной символ и числовая величина, которые нужно использовать как форматированный символ. Функция SvcDebugOut печатает информационные сообщения и ошибки отладчику.
SERVICE_STATUS MyServiceStatus; SERVICE_STATUS_HANDLE MyServiceStatusHandle; АННУЛИРУЙТЕ MyServiceStart (DWORD argc, LPTSTR *argv); АННУЛИРУЙТЕ MyServiceCtrlHandler (DWORD opcode); DWORD MyServiceInitialization (DWORD argc, LPTSTR *argv, DWORD *specificError); ПУСТОТА _CRTAPI1 основа( ) { SERVICE_TABLE_ENTRY DispatchTable[] = { { ТЕКСТ("MyService"), MyServiceStart }, { НЕДЕЙСТВИТЕЛЬНЫЙ, НЕДЕЙСТВИТЕЛЬНЫЙ } };
если (!StartServiceCtrlDispatcher( DispatchTable)) { SvcDebugOut(" [MY_SERVICE] ОШИБКА = StartServiceCtrlDispatcher %d\n", GetLastError()); } } ПУСТОТА SvcDebugOut(LPSTR Строки, Статус DWORD) { СИМВОЛ Буферизует[1024]; если (strlen(Строка) < 1000) { sprintf(Буфер, Строка, Статус); OutputDebugStringA(БУФЕР); } }
Если ваша программа услуги поддерживает многочисленные услуги, реализация основной функции отличится немного. Имена дополнительных услуг должны быть добавлены к столу отправки, так что они могут быть проверены резьбой диспетчера.
|
|
|
|
| |