Bagikan melalui


Menulis Fungsi utama Program Layanan

Fungsi utamaprogram layanan memanggil fungsi StartServiceCtrlDispatcher untuk terhubung ke manajer kontrol layanan (SCM) dan memulai utas dispatcher kontrol. Perulangan utas dispatcher, menunggu permintaan kontrol masuk untuk layanan yang ditentukan dalam tabel pengiriman. Utas ini kembali ketika ada kesalahan atau ketika semua layanan dalam proses telah dihentikan. Ketika semua layanan dalam proses telah dihentikan, SCM mengirim permintaan kontrol ke utas dispatcher yang memberi tahunya untuk keluar. Utas ini kemudian kembali dari panggilan StartServiceCtrlDispatcher dan prosesnya dapat dihentikan.

Definisi global berikut digunakan dalam sampel ini.

#define SVCNAME TEXT("SvcName")

SERVICE_STATUS          gSvcStatus; 
SERVICE_STATUS_HANDLE   gSvcStatusHandle; 
HANDLE                  ghSvcStopEvent = NULL;

Contoh berikut dapat digunakan sebagai titik masuk untuk program layanan yang mendukung satu layanan. Jika program layanan Anda mendukung beberapa layanan, tambahkan nama layanan tambahan ke tabel pengiriman sehingga dapat dipantau oleh utas dispatcher.

Fungsi _tmain adalah titik masuk. Fungsi SvcReportEvent menulis pesan informasi dan kesalahan ke log peristiwa. Untuk informasi tentang menulis fungsi SvcMain, lihat Menulis Fungsi ServiceMain. Untuk informasi selengkapnya tentang fungsi SvcInstall, lihat Menginstal Layanan. Untuk informasi tentang menulis fungsi SvcCtrlHandler, lihat Menulis Fungsi Handler Kontrol. Untuk contoh layanan lengkap, termasuk sumber untuk fungsi SvcReportEvent, lihat 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")); 
    } 
} 

Berikut ini adalah contoh Sample.h seperti yang dihasilkan oleh pengkompilasi pesan. Untuk informasi selengkapnya, lihat 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)

Titik Masuk Layanan

Sampel Layanan Lengkap