Schreiben der Standard-Funktion eines Dienstprogramms
Die Standard Funktion eines Dienstprogramms ruft die Funktion StartServiceCtrlDispatcher auf, um eine Verbindung mit dem Dienststeuerungs-Manager (SCM) herzustellen und den Steuerungsverteilerthread zu starten. Die Verteilerthreadschleifen, die auf eingehende Steuerungsanforderungen für die in der Verteilertabelle angegebenen Dienste warten. Dieser Thread gibt zurück, wenn ein Fehler vorliegt oder wenn alle Dienste im Prozess beendet wurden. Wenn alle Dienste im Prozess beendet wurden, sendet der SCM eine Steuerungsanforderung an den Verteilerthread, der ihn zum Beenden angibt. Dieser Thread wird dann vom StartServiceCtrlDispatcher-Aufruf zurückgegeben, und der Prozess kann beendet werden.
In diesem Beispiel werden die folgenden globalen Definitionen verwendet.
#define SVCNAME TEXT("SvcName")
SERVICE_STATUS gSvcStatus;
SERVICE_STATUS_HANDLE gSvcStatusHandle;
HANDLE ghSvcStopEvent = NULL;
Das folgende Beispiel kann als Einstiegspunkt für ein Dienstprogramm verwendet werden, das einen einzelnen Dienst unterstützt. Wenn Ihr Dienstprogramm mehrere Dienste unterstützt, fügen Sie der Dispatchtabelle die Namen der zusätzlichen Dienste hinzu, damit sie vom Verteilerthread überwacht werden können.
Die _tmain-Funktion ist der Einstiegspunkt. Die SvcReportEvent-Funktion schreibt Informationsmeldungen und Fehler in das Ereignisprotokoll. Informationen zum Schreiben der SvcMain-Funktion finden Sie unter Schreiben einer ServiceMain-Funktion. Weitere Informationen zur SvcInstall-Funktion finden Sie unter Installieren eines Diensts. Informationen zum Schreiben der SvcCtrlHandler-Funktion finden Sie unter Schreiben einer Steuerelementhandlerfunktion. Den vollständigen Beispieldienst, einschließlich der Quelle für die SvcReportEvent-Funktion, finden Sie unter 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"));
}
}
Im Folgenden finden Sie ein Beispiel sample.h, das vom Nachrichtencompiler generiert wird. Weitere Informationen finden Sie unter 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)
Zugehörige Themen