Startup Layanan

Untuk memulai layanan atau layanan driver, program kontrol layanan menggunakan fungsi StartService . Fungsi StartService gagal jika database dikunci. Jika ini terjadi, program kontrol layanan harus menunggu beberapa detik dan memanggil StartService lagi. Ini dapat memeriksa status kunci database saat ini dengan memanggil fungsi QueryServiceLockStatus .

Jika program kontrol layanan memulai layanan, program ini dapat menggunakan fungsi StartService untuk menentukan array argumen yang akan diteruskan ke fungsi ServiceMain layanan. Fungsi StartService kembali setelah utas baru dibuat untuk menjalankan fungsi ServiceMain . Program kontrol layanan dapat mengambil status layanan yang baru dimulai dalam struktur SERVICE_STATUS dengan memanggil fungsi QueryServiceStatus . Selama inisialisasi, anggota dwCurrentState harus SERVICE_START_PENDING. Anggota dwWaitHint adalah interval waktu, dalam milidetik, yang menunjukkan berapa lama program kontrol layanan harus menunggu sebelum memanggil QueryServiceStatus lagi. Ketika inisialisasi selesai, layanan mengubah dwCurrentState menjadi SERVICE_RUNNING.

Manajer kontrol layanan tidak mendukung meneruskan variabel lingkungan kustom ke layanan saat startup. Selain itu, manajer kontrol layanan tidak mendeteksi dan meneruskan perubahan pada variabel lingkungan saat layanan berjalan. Alih-alih membuat layanan bergantung pada variabel lingkungan, gunakan nilai registri atau argumen ServiceMain .

Berikut ini adalah gambaran umum yang disederhanakan tentang apa yang terjadi ketika layanan umum dimulai oleh manajer kontrol layanan:

  • SCM membaca jalur layanan dari registri dan bersiap untuk memulai layanan. Ini termasuk memperoleh kunci layanan. Setiap upaya untuk memulai layanan lain saat kunci layanan ditahan akan memblokir hingga kunci layanan dilepaskan.
  • SCM memulai proses dan menunggu hingga proses anak keluar (menunjukkan kegagalan) atau melaporkan status SERVICE_RUNNING.
  • Aplikasi ini melakukan inisialisasi yang sangat sederhana dan memanggil fungsi StartServiceCtrlDispatcher .
  • StartServiceCtrlDispatcher terhubung ke manajer kontrol layanan dan memulai utas kedua yang memanggil fungsi ServiceMain untuk layanan. ServiceMain harus melaporkan SERVICE_RUNNING sesegera mungkin.
  • Ketika manajer kontrol layanan diberi tahu bahwa layanan sedang berjalan, ia melepaskan kunci layanan.

Jika layanan tidak memperbarui statusnya dalam waktu 80 detik, ditambah petunjuk tunggu terakhir, manajer kontrol layanan menentukan bahwa layanan telah berhenti merespons. Manajer kontrol layanan akan mencatat peristiwa dan menghentikan layanan.

Jika program memulai layanan driver, StartService akan kembali setelah driver perangkat menyelesaikan inisialisasinya.

Untuk informasi selengkapnya, lihat Memulai Layanan.