Sdílet prostřednictvím


Psaní hlavní funkce servisního programu

Hlavní funkce programu služby volá funkci StartServiceCtrlDispatcher, která se připojí ke správci řízení služeb (SCM) a spustí vlákno kontrolního dispečera. Smyčka vlákna dispečeru čeká na příchozí žádosti o řízení pro služby zadané v tabulce dispečer. Toto vlákno se vrátí, pokud dojde k chybě nebo když se ukončí všechny služby v procesu. Když se všechny služby v procesu ukončily, SCM odešle žádost o řízení do vlákna dispečera s oznámením, že se má ukončit. Toto vlákno pak vrátí výsledek z volání StartServiceCtrlDispatcher a proces se může ukončit.

V této ukázce se používají následující globální definice.

#define SVCNAME TEXT("SvcName")

SERVICE_STATUS          gSvcStatus; 
SERVICE_STATUS_HANDLE   gSvcStatusHandle; 
HANDLE                  ghSvcStopEvent = NULL;

Následující příklad lze použít jako vstupní bod pro program služby, který podporuje jednu službu. Pokud váš program služeb podporuje více služeb, přidejte do tabulky dispečerů názvy dalších služeb, aby je bylo možné monitorovat pomocí vlákna dispečera.

Funkce _tmain je vstupním bodem. Funkce SvcReportEvent zapisuje informační zprávy a chyby do protokolu událostí. Informace o zápisu funkce SvcMain naleznete v tématu Zápis funkce ServiceMain. Další informace o funkci SvcInstall naleznete v tématu Instalace služby. Informace o zápisu funkce SvcCtrlHandler naleznete v tématu Zápis funkce obslužné rutiny ovládacího prvku. Kompletní ukázkovou službu, včetně zdroje pro funkci SvcReportEvent, najdete v tématu 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")); 
    } 
} 

Následuje příklad Sample.h vygenerovaný kompilátorem zpráv. Další informace naleznete v tématu 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)

Vstupní bod služby

kompletní ukázku služby