Menulis program layanan Win2000 menggunakan Delphi
Abstrak: Artikel ini memperkenalkan penggunaan Delphi untuk menulis program layanan Win2000 Kelas yang terlibat adalah TServiceApplicatoin, TService, TServiceThread, dll.
Kata Kunci : Pelayanan/pelayanan
1. Pengenalan layanan Win2000
Aplikasi layanan adalah program latar belakang yang berjalan di WinNT. Setiap aplikasi layanan mungkin berisi beberapa layanan, dan setiap layanan adalah salah satu thread (layanan juga dapat membuat beberapa sub-layanan thread). Dengan menggunakan layanan, aplikasi dapat memperoleh izin khusus, dan pengguna tidak akan langsung mengakhiri program melalui Win2000 Task Manager, sehingga layanan sering digunakan untuk mencapai beberapa tujuan khusus.
Melalui alat manajemen layanan di panel kontrol Win2000, kita dapat mengatur/melihat karakteristik layanan:
(1) Nama layanan; (2) Nama tampilan; (3) Deskripsi; (4) Jenis startup;
Diantaranya, nama layanan mengidentifikasi layanan tersebut.
Ambil program C:/WINNT/System32/services.exe dari Win2000 sebagai contoh. File Exe ini sesuai dengan Aplikasi Layanan dan merupakan entitas yang terlihat dari program layanan; Klien Dhcp (DHCP), Messenger, dll. Ketika kami mengakhiri suatu layanan, layanan lain dalam Aplikasi Layanan tempat layanan tersebut berada tidak dihentikan.
Di Delphi, insinyur Borland memberi kami TServiceApplication, TService, TServiceThread, dan kelas lainnya, yang merangkum sejumlah besar detail dan menyederhanakan pengembangan program layanan.
2. Aplikasi TService
Di Delphi, kelas TServiceApplication sesuai dengan ServiceApplication yang disebutkan di atas. Menggunakan lingkungan pengembangan Delphi, kami membuat Proyek Aplikasi Layanan baru dan membuat kelas yang diwarisi dari TService. Objek Aplikasi dalam file proyek adalah instance TServiceApplication. Setiap TServiceApplication berisi beberapa objek TService, yang persis sesuai dengan hubungan kuantitatif yang disebutkan di atas antara program layanan dan layanan.
Dengan membaca definisi kelas TServiceApplication dan TService, kita dapat mengetahui bahwa TServiceApplication mewarisi kelas TComponent, TService berasal dari kelas TDataModule, dan objek Aplikasi bertanggung jawab atas Pembuatan dan Penghancuran setiap objek TService. Lacak kode berikut
Aplikasi.CreateForm(TService1, Service1);
Dapat ditemukan bahwa pemilik objek TService yang dibuat adalah semua objek Aplikasi; di VCL FrameWork, Pemilik selalu bertanggung jawab untuk menghancurkan setiap objek Komponen (kelas TComponent VCL mengadopsi mode Komposit), sehingga TServiceApplication juga akan Menghancurkan setiap objek TService.
Mengikuti kode TServiceApplication.Run, Anda dapat menemukan bahwa TServiceApplication pertama-tama mem-parsing parameter yang berjalan dan mengimplementasikan Instal dan Hapus Instalasi layanan. Kemudian, inisialisasi array ServiceStartTable, yang berisi nama layanan dan entri yang berjalan dari setiap objek layanan; terakhir buat objek TServiceStartThread, yang merupakan objek thread, dan panggil API: StartServiceCtrlDispatcher dari thread untuk memulai beberapa layanan yang ditentukan dalam ServiceStartTable; Thread utama ServiceApplication terus mengulang dan memproses pesan, seperti menerima permintaan untuk menghentikan/menjeda layanan.
3. Layanan
Kelas TService mewarisi dari kelas TDataModule, yang berarti kita dapat menambahkan sejumlah besar kontrol VCL untuk mencapai fungsi yang kaya. Selain itu, kami juga dapat menangani OnStart, OnPause, OnStop, OnContinue, OnCreate, OnShutDown dan event lainnya. Yang perlu dijelaskan adalah: OnStop artinya layanan telah dihentikan; dan OnShutDown berarti ServiceApplication telah berhenti berjalan, artinya layanan lain juga telah dihentikan, arti keduanya berbeda.
Seperti disebutkan sebelumnya, ServiceApplication memulai setiap layanan dengan memanggil StartServiceCtrlDispatcher. StartServiceCtrlDispatcher memulai pintu masuk TService, yaitu TService.Main. TService.Main pertama-tama mendaftarkan layanan dan kemudian memanggil TService.DoStart. TService.DoStart membuat objek anggota TServiceThread internal, yang merupakan objek thread; dengan memeriksa TServiceThread.Execute, kita dapat mengetahui bahwa ketika kita memproses TService1.OnExecute, maka TService akan mendelegasikan semua permintaan ke objek anggota TServiceThread untuk diproses Metode default menangani semua permintaan.
TService.ServiceExecute adalah konten utama TService. Agar layanan dapat berjalan normal, selain menangani tujuan yang perlu difokuskan (seperti mendengarkan port tertentu, melakukan tugas tertentu, dll.), layanan juga perlu merespons perintah/permintaan eksternal: seperti sebagai mengakhiri, menjeda, dan melanjutkan layanan. Oleh karena itu, Anda dapat mempertimbangkan untuk membuat thread khusus untuk menyelesaikan tugas ini dan menangani perintah/permintaan eksternal di ServiceExecute. Jadi kodenya adalah sebagai berikut:
sementara tidak Diakhiri, mulailah
ServiceThread.ProcessRequests(Salah);
akhir;
Tentu saja, Anda juga dapat menangani tugas-tugas tertentu di OnExecute, seperti mendengarkan port tertentu, namun hal ini sering mengakibatkan Layanan tidak dapat merespons Stop/Pause dan permintaan lainnya secara tepat waktu. Ketika OnExecute selesai, layanan sebenarnya telah menyelesaikan tugasnya dan akan segera berakhir (terminate).
Referensi:
MSDN, kode sumber Delphi VCL, dokumentasi bantuan Delphi