Bagikan melalui


LPSERVICE_MAIN_FUNCTIONA fungsi panggilan balik (winsvc.h)

Titik masuk untuk layanan.

Jenis LPSERVICE_MAIN_FUNCTION menentukan penunjuk ke fungsi panggilan balik ini. ServiceMain adalah tempat penampung untuk nama fungsi yang ditentukan aplikasi.

Sintaks

LPSERVICE_MAIN_FUNCTIONA LpserviceMainFunctiona;

void LpserviceMainFunctiona(
  [in] DWORD dwNumServicesArgs,
  [in] LPSTR *lpServiceArgVectors
)
{...}

Parameter

[in] dwNumServicesArgs

Jumlah argumen dalam array lpServiceArgVectors .

[in] lpServiceArgVectors

String argumen yang dihentikan null diteruskan ke layanan oleh panggilan ke fungsi StartService yang memulai layanan. Jika tidak ada argumen, parameter ini bisa NULL. Jika tidak, argumen pertama (lpServiceArgVectors[0]) adalah nama layanan, diikuti oleh argumen tambahan apa pun (lpServiceArgVectors[1] melalui lpServiceArgVectors[dwNumServicesArgs-1]).

Jika pengguna memulai layanan manual menggunakan snap-in Layanan dari Panel Kontrol, string untuk parameter lpServiceArgVectors berasal dari kotak dialog properti untuk layanan (dari snap-in Layanan, klik kanan entri layanan, klik Properti, dan masukkan parameter di Parameter mulai.)

Mengembalikan nilai

Tidak ada

Keterangan

Program layanan dapat memulai satu atau beberapa layanan. Proses layanan memiliki struktur SERVICE_TABLE_ENTRY untuk setiap layanan yang dapat dimulai. Struktur menentukan nama layanan dan penunjuk ke fungsi ServiceMain untuk layanan tersebut.

Ketika manajer kontrol layanan menerima permintaan untuk memulai layanan, manajer kontrol layanan memulai proses layanan (jika belum berjalan). Utas utama proses layanan memanggil fungsi StartServiceCtrlDispatcher dengan penunjuk ke array struktur SERVICE_TABLE_ENTRY . Kemudian manajer kontrol layanan mengirimkan permintaan awal ke dispatcher kontrol layanan untuk proses layanan ini. Dispatcher kontrol layanan membuat utas baru untuk menjalankan fungsi ServiceMain dari layanan yang sedang dimulai.

Fungsi ServiceMain harus segera memanggil fungsi RegisterServiceCtrlHandlerEx untuk menentukan fungsi HandlerEx untuk menangani permintaan kontrol. Selanjutnya, ini harus memanggil fungsi SetServiceStatus untuk mengirim informasi status ke manajer kontrol layanan. Setelah panggilan ini, fungsi harus menyelesaikan inisialisasi layanan. Jangan mencoba memulai layanan lain dalam fungsi ServiceMain .

Service Control Manager (SCM) menunggu hingga layanan melaporkan status SERVICE_RUNNING. Disarankan agar layanan melaporkan status ini secepat mungkin, karena komponen lain dalam sistem yang memerlukan interaksi dengan SCM akan diblokir selama waktu ini. Beberapa fungsi mungkin memerlukan interaksi dengan SCM baik secara langsung maupun tidak langsung.

SCM mengunci database kontrol layanan selama inisialisasi, jadi jika layanan mencoba memanggil StartService selama inisialisasi, panggilan akan diblokir. Ketika layanan melaporkan ke SCM bahwa layanan telah berhasil dimulai, layanan dapat memanggil StartService. Jika layanan mengharuskan layanan lain berjalan, layanan harus mengatur dependensi yang diperlukan.

Selain itu, Anda tidak boleh memanggil fungsi sistem apa pun selama inisialisasi layanan. Kode layanan harus memanggil fungsi sistem hanya setelah melaporkan status SERVICE_RUNNING.

Fungsi ServiceMain harus membuat peristiwa global, memanggil fungsi RegisterWaitForSingleObject pada peristiwa ini, dan keluar. Ini akan mengakhiri utas yang menjalankan fungsi ServiceMain , tetapi tidak akan menghentikan layanan. Ketika layanan berhenti, handler kontrol layanan harus memanggil SetServiceStatus dengan SERVICE_STOP_PENDING dan memberi sinyal peristiwa ini. Utas dari kumpulan utas akan menjalankan fungsi panggilan balik tunggu; fungsi ini harus melakukan tugas pembersihan, termasuk menutup peristiwa global, dan memanggil SetServiceStatus dengan SERVICE_STOPPED. Setelah layanan berhenti, Anda tidak boleh menjalankan kode layanan tambahan karena Anda dapat memperkenalkan kondisi balapan jika layanan menerima kontrol mulai dan ServiceMain dipanggil lagi. Perhatikan bahwa masalah ini lebih mungkin terjadi ketika beberapa layanan berbagi proses.

Contoh

Misalnya, lihat Menulis Fungsi ServiceMain.

Catatan

Header winsvc.h mendefinisikan LPSERVICE_MAIN_FUNCTION sebagai alias yang secara otomatis memilih versi ANSI atau Unicode dari fungsi ini berdasarkan definisi konstanta pra-prosesor UNICODE. Mencampur penggunaan alias encoding-netral dengan kode yang tidak mengodekan-netral dapat menyebabkan ketidakcocokan yang mengakibatkan kesalahan kompilasi atau runtime. Untuk informasi selengkapnya, lihat Konvensi untuk Prototipe Fungsi.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows XP [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2003 [hanya aplikasi desktop]
Target Platform Windows
Header winsvc.h (termasuk Windows.h)

Lihat juga

HandlerEx

RegisterServiceCtrlHandlerEx

RegisterWaitForSingleObject

SERVICE_TABLE_ENTRY

Fungsi Layanan

Fungsi ServiceMain Layanan

SetServiceStatus

StartServiceCtrlDispatcher