Udostępnij przez


Pisanie głównej funkcji programu usług

Główna funkcja programu usługi wywołuje funkcję StartServiceCtrlDispat cher, aby nawiązać połączenie z menedżerem kontroli usługi (SCM) i uruchomić wątek dyspozytora sterowania. Wątek dyspozytora pętli się, czekając na przychodzące żądania kontroli dla usług określonych w tabeli dyspozycji. Ten wątek zwraca się, gdy wystąpi błąd lub gdy wszystkie usługi w procesie zostaną zakończone. Po zakończeniu wszystkich usług w procesie program SCM wysyła żądanie kontroli do wątku dyspozytora, nakazując mu zakończyć działanie. Następnie ten wątek jest zwracany z wywołania StartServiceCtrlDispatcher, a proces może zakończyć się.

Poniższe definicje globalne są używane w tym przykładzie.

#define SVCNAME TEXT("SvcName")

SERVICE_STATUS          gSvcStatus; 
SERVICE_STATUS_HANDLE   gSvcStatusHandle; 
HANDLE                  ghSvcStopEvent = NULL;

Poniższy przykład może służyć jako punkt wejścia dla programu usługi obsługującego jedną usługę. Jeśli program usługi obsługuje wiele usług, dodaj nazwy dodatkowych usług do tabeli dyspozytorskiej, aby mogły być monitorowane przez wątek dyspozytora.

Funkcja _tmain jest punktem wejścia. Funkcja SvcReportEvent zapisuje komunikaty informacyjne i błędy w dzienniku zdarzeń. Aby uzyskać informacje na temat pisania funkcji SvcMain, zobacz Pisanie funkcji ServiceMain. Aby uzyskać więcej informacji na temat funkcji SvcInstall, zobacz Installing a Service. Aby uzyskać informacje na temat pisania funkcji SvcCtrlHandler, zobacz Pisanie funkcji obsługi kontrolek. Aby uzyskać pełną przykładową usługę, w tym źródło funkcji SvcReportEvent, zobacz 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")); 
    } 
} 

Poniżej przedstawiono przykład sample.h wygenerowany przez kompilator komunikatów. Aby uzyskać więcej informacji, zobacz 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)

Punkt Wejścia Usługi

Kompletny Przykład Usługi