การเขียนโปรแกรมบริการ Win2000 โดยใช้ Delphi
บทคัดย่อ: บทความนี้แนะนำการใช้ Delphi ในการเขียนโปรแกรมเซอร์วิส Win2000 คลาสที่เกี่ยวข้อง ได้แก่ TServiceApplicatoin, TService, TServiceThread ฯลฯ
คำสำคัญ: บริการ/บริการ
1. ข้อมูลเบื้องต้นเกี่ยวกับบริการ Win2000
แอปพลิเคชันบริการเป็นโปรแกรมพื้นหลังที่ทำงานบน WinNT แอปพลิเคชันบริการแต่ละรายการอาจประกอบด้วยบริการหลายอย่าง และแต่ละบริการก็เป็นหนึ่งในเธรด (บริการนี้ยังสามารถสร้างบริการย่อยได้หลายรายการ) ด้วยการใช้บริการ แอปพลิเคชันสามารถรับสิทธิ์พิเศษได้ และผู้ใช้จะไม่จบโปรแกรมโดยตรงผ่าน Win2000 Task Manager ดังนั้น มักจะใช้บริการต่างๆ เพื่อให้บรรลุเป้าหมายพิเศษบางประการ
ด้วยเครื่องมือการจัดการบริการในแผงควบคุม Win2000 เราสามารถตั้งค่า/ดูคุณลักษณะของบริการได้:
(1) ชื่อบริการ (2) ชื่อที่แสดง; (4) ประเภทการเริ่มต้น;
ในบรรดาชื่อบริการจะระบุถึงบริการ
ใช้โปรแกรม C:/WINNT/System32/services.exe ของ Win2000 เป็นตัวอย่าง ไฟล์ exe นี้สอดคล้องกับแอปพลิเคชันบริการและเป็นเอนทิตีที่มองเห็นได้ของโปรแกรมบริการ ไคลเอนต์ Dhcp (DHCP), Messenger ฯลฯ เมื่อเราสิ้นสุดการบริการ บริการอื่นๆ ในแอปพลิเคชันบริการซึ่งเป็นที่ตั้งของบริการนั้นจะไม่ยุติลง
ใน Delphi วิศวกรของ Borland มอบ TServiceApplication, TService, TServiceThread และคลาสอื่นๆ ให้กับเรา ซึ่งสรุปรายละเอียดจำนวนมากและทำให้การพัฒนาโปรแกรมบริการง่ายขึ้น
2. แอปพลิเคชัน TService
ใน Delphi คลาส TServiceApplication สอดคล้องกับ ServiceApplication ที่กล่าวถึงข้างต้น ด้วยการใช้สภาพแวดล้อมการพัฒนา Delphi เราสร้างโครงการแอปพลิเคชันบริการใหม่และสร้างคลาสที่สืบทอดมาจาก TService วัตถุแอปพลิเคชันในไฟล์โครงการคืออินสแตนซ์ TServiceApplication TServiceApplication แต่ละรายการมีออบเจ็กต์ TService หลายรายการ ซึ่งสอดคล้องกับความสัมพันธ์เชิงปริมาณที่กล่าวถึงข้างต้นระหว่างโปรแกรมบริการและบริการทุกประการ
โดยการอ่านคำจำกัดความของคลาส TServiceApplication และ TService เราจะรู้ได้ว่า TServiceApplication สืบทอดมาจากคลาส TComponent, TService มาจากคลาส TDataModule และออบเจ็กต์ Application มีหน้าที่สร้างและทำลายออบเจ็กต์ TService แต่ละรายการ ติดตามโค้ดด้านล่าง
แอปพลิเคชัน CreateForm (TService1, Service1);
พบว่าเจ้าของวัตถุ TService ที่สร้างขึ้นนั้นเป็นวัตถุแอปพลิเคชันทั้งหมด ใน VCL FrameWork เจ้าของมีหน้าที่รับผิดชอบในการทำลายวัตถุแต่ละส่วนประกอบเสมอ (คลาส TComponent ของ VCL ใช้โหมดคอมโพสิต) ดังนั้น TServiceApplication จะทำลายวัตถุ TService แต่ละรายการด้วย
ตามโค้ดของ TServiceApplication.Run คุณจะพบว่า TServiceApplication แยกวิเคราะห์พารามิเตอร์ที่กำลังทำงานอยู่ก่อน และดำเนินการติดตั้งและถอนการติดตั้งบริการ จากนั้น เริ่มต้นอาร์เรย์ ServiceStartTable ซึ่งมีชื่อบริการและรายการที่กำลังรันอยู่ของแต่ละอ็อบเจ็กต์บริการ ในที่สุดก็สร้างอ็อบเจ็กต์ TServiceStartThread ซึ่งเป็นอ็อบเจ็กต์เธรด และเรียก API: StartServiceCtrlDispatcher จากเธรดเพื่อเริ่มบริการต่างๆ ที่ระบุใน ServiceStartTable เธรดหลักของ ServiceApplication จะวนซ้ำและประมวลผลข้อความ เช่น การรับคำขอให้หยุด/หยุดบริการชั่วคราว
3. ทีเซอร์วิส
คลาส TService สืบทอดมาจากคลาส TDataModule ซึ่งหมายความว่าเราสามารถเพิ่มการควบคุม VCL จำนวนมากเพื่อให้ได้ฟังก์ชันที่หลากหลาย นอกจากนี้เรายังสามารถจัดการ OnStart, OnPause, OnStop, OnContinue, OnCreate, OnShutDown และเหตุการณ์อื่น ๆ ได้อีกด้วย สิ่งที่ต้องอธิบายคือ: OnStop หมายความว่าบริการถูกหยุด และ OnShutDown หมายความว่า ServiceApplication หยุดทำงาน ซึ่งหมายความว่าบริการอื่น ๆ ก็ถูกยกเลิกเช่นกัน
ตามที่กล่าวไว้ก่อนหน้านี้ ServiceApplication เริ่มแต่ละบริการโดยการเรียก StartServiceCtrlDispatcher StartServiceCtrlDispatcher เริ่มทางเข้าของ TService ซึ่งก็คือ TService.Main TService.Main ลงทะเบียนบริการก่อนแล้วจึงเรียก TService.DoStart TService.DoStart สร้างวัตถุสมาชิก TServiceThread ภายในซึ่งเป็นวัตถุเธรด เมื่อตรวจสอบ TServiceThread.Execute เราจะรู้ได้ว่าเมื่อเราประมวลผล TService1.OnExecute แล้ว TService จะมอบหมายคำขอทั้งหมดให้กับวัตถุสมาชิก TServiceThread สำหรับการประมวลผล วิธีการเริ่มต้นจะจัดการคำขอทั้งหมด
TService ServiceExecute เป็นเนื้อหาหลักของ TService เพื่อให้บริการทำงานได้ตามปกติ นอกเหนือจากการจัดการกับเป้าหมายที่ต้องมุ่งเน้น (เช่น การฟังพอร์ตบางพอร์ต การปฏิบัติงานบางอย่าง เป็นต้น) ยังต้องตอบสนองต่อคำสั่ง/คำขอภายนอกด้วย: เช่น การยกเลิก การหยุดชั่วคราว และการกลับมาให้บริการอีกครั้ง ดังนั้น คุณสามารถพิจารณาสร้างเธรดเฉพาะเพื่อทำงานนี้ให้เสร็จสิ้น และจัดการคำสั่ง/คำขอภายนอกใน ServiceExecute ดังนั้นรหัสจึงเป็นดังนี้:
ในขณะที่ยังไม่ยุติให้เริ่มต้น
ServiceThread.ProcessRequests (เท็จ);
จบ;
แน่นอนว่า คุณยังสามารถจัดการงานบางอย่างใน OnExecute ได้ เช่น การฟังพอร์ตบางพอร์ต แต่บ่อยครั้งส่งผลให้บริการไม่สามารถตอบสนองต่อ Stop/Pause และคำขออื่นๆ ได้ทันเวลา เมื่อ OnExecute เสร็จสมบูรณ์ บริการได้เสร็จสิ้นงานจริงแล้ว และกำลังจะสิ้นสุด (ยุติ)
อ้างอิง:
MSDN, ซอร์สโค้ด Delphi VCL, เอกสารวิธีใช้ Delphi