Написание функции main служебной программы
Функция mainслужебной программы вызывает функцию StartServiceCtrlDispatcher для подключения к диспетчеру управления службами (SCM) и запуска потока диспетчера управления. Поток диспетчера выполняет циклы, ожидая входящих запросов управления для служб, указанных в таблице диспетчеризации. Этот поток возвращается при возникновении ошибки или при завершении работы всех служб в процессе. Когда все службы в процессе завершаются, SCM отправляет запрос на управление потоку диспетчера, сообщающий ему о выходе. Затем этот поток возвращается из вызова StartServiceCtrlDispatcher , и процесс может завершиться.
В этом примере используются следующие глобальные определения.
#define SVCNAME TEXT("SvcName")
SERVICE_STATUS gSvcStatus;
SERVICE_STATUS_HANDLE gSvcStatusHandle;
HANDLE ghSvcStopEvent = NULL;
Следующий пример можно использовать в качестве точки входа для служебной программы, поддерживающей одну службу. Если программа обслуживания поддерживает несколько служб, добавьте имена дополнительных служб в таблицу диспетчеризации, чтобы их можно было отслеживать с помощью потока диспетчера.
_tmain функция является точкой входа. Функция SvcReportEvent записывает информационные сообщения и ошибки в журнал событий. Сведения о написании функции SvcMain см. в статье Написание функции ServiceMain. Дополнительные сведения о функции SvcInstall см. в разделе Установка службы. Сведения о написании функции SvcCtrlHandler см. в статье Написание функции обработчика элемента управления. Полный пример службы, включая источник функции SvcReportEvent, см. в разделе Svc.cpp.
//
// Purpose:
// Entry point for the process
//
// Parameters:
// None
//
// Return value:
// None, defaults to 0 (zero)
//
int __cdecl _tmain(int argc, TCHAR *argv[])
{
// If command-line parameter is "install", install the service.
// Otherwise, the service is probably being started by the SCM.
if( lstrcmpi( argv[1], TEXT("install")) == 0 )
{
SvcInstall();
return;
}
// TO_DO: Add any additional services for the process to this table.
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ SVCNAME, (LPSERVICE_MAIN_FUNCTION) SvcMain },
{ NULL, NULL }
};
// This call returns when the service has stopped.
// The process should simply terminate when the call returns.
if (!StartServiceCtrlDispatcher( DispatchTable ))
{
SvcReportEvent(TEXT("StartServiceCtrlDispatcher"));
}
}
Ниже приведен пример Sample.h, созданный компилятором сообщений. Дополнительные сведения см. в разделе Sample.mc.
// The following are message definitions.
//
// Values are 32 bit values layed out as follows:
//
// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
// +---+-+-+-----------------------+-------------------------------+
// |Sev|C|R| Facility | Code |
// +---+-+-+-----------------------+-------------------------------+
//
// where
//
// Sev - is the severity code
//
// 00 - Success
// 01 - Informational
// 10 - Warning
// 11 - Error
//
// C - is the Customer code flag
//
// R - is a reserved bit
//
// Facility - is the facility code
//
// Code - is the facility's status code
//
//
// Define the facility codes
//
#define FACILITY_SYSTEM 0x0
#define FACILITY_STUBS 0x3
#define FACILITY_RUNTIME 0x2
#define FACILITY_IO_ERROR_CODE 0x4
//
// Define the severity codes
//
#define STATUS_SEVERITY_WARNING 0x2
#define STATUS_SEVERITY_SUCCESS 0x0
#define STATUS_SEVERITY_INFORMATIONAL 0x1
#define STATUS_SEVERITY_ERROR 0x3
//
// MessageId: SVC_ERROR
//
// MessageText:
//
// An error has occurred (%2).
//
//
#define SVC_ERROR ((DWORD)0xC0020001L)
Связанные темы