Bagikan melalui


Startup Layanan

Untuk memulai layanan atau layanan driver, program kontrol layanan menggunakan fungsiStartService. 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 fungsiStartServiceuntuk menentukan array argumen yang akan diteruskan ke fungsiServiceMainlayanan. 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 berubah 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 turunan keluar (menunjukkan kegagalan) atau melaporkan status SERVICE_RUNNING.
  • Aplikasi ini melakukan inisialisasi yang sangat sederhana dan memanggil fungsiStartServiceCtrlDispatcher.
  • StartServiceCtrlDispatcher terhubung ke manajer kontrol layanan dan memulai utas kedua yang memanggil fungsiserviceMainuntuk layanan. ServiceMain harus melaporkan SERVICE_RUNNING sesegera mungkin.
  • Ketika manajer kontrol layanan diberi tahu bahwa layanan sedang berjalan, layanan akan merilis 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 kembali setelah driver perangkat menyelesaikan inisialisasinya.

Untuk informasi selengkapnya, lihat MemulaiLayanan .