ไลบรารีลิงก์แบบไดนามิกคือชุดของขั้นตอนและฟังก์ชันที่แอปพลิเคชันและ DLL อื่นๆ สามารถเรียกใช้ได้ โดยประกอบด้วยรหัสสาธารณะหรือทรัพยากร เนื่องจากโค้ด DLL ใช้เทคโนโลยีการแบ่งปันหน่วยความจำ Windows จึงให้สิทธิ์ DLL ที่สูงขึ้นในบางที่ ดังนั้น DLL จึงสามารถใช้ฟังก์ชันบางอย่างที่ไม่สามารถทำได้โดยโปรแกรมทั่วไป เช่น การใช้ Windows HOOK, ISAPI เป็นต้น ในเวลาเดียวกัน DLL ยังมอบวิธีที่สะดวกในการแชร์โค้ดระหว่างภาษาต่างๆ ดังนั้น DLL จึงถูกนำมาใช้กันอย่างแพร่หลายในการเขียนโปรแกรม บทความนี้จะแนะนำวิธีการสร้างและใช้ DLL ใน Delphi
หนึ่ง. กลไกการแชร์หน่วยความจำไลบรารี DLL
จากมุมมองของการใช้งาน DLL และหน่วยมีความคล้ายคลึงกันมาก สามารถเรียกได้โดยโมดูลโครงการอื่น ๆ แต่มีความแตกต่างในกลไกการใช้งานภายใน หากโมดูลโปรแกรมใช้คำสั่งใช้เพื่ออ้างอิงหน่วย เมื่อคอมไพเลอร์คอมไพล์โมดูล มันจะคอมไพล์พร้อมกับหน่วยและเชื่อมโยงโค้ดปฏิบัติการที่คอมไพล์แล้วเข้ากับโมดูลโปรแกรม นี่คือสาเหตุที่โมดูลโปรแกรมสามารถเรียกใช้ได้ ขั้นตอนและฟังก์ชั่นในหน่วยอ้างอิง เมื่อหลายโครงการอ้างอิงหน่วยเดียวกัน แต่ละโครงการจะมีรหัสปฏิบัติการของหน่วย เมื่อมีการดำเนินการหลายโครงการที่มีหน่วยพร้อมๆ กัน รหัสปฏิบัติการของหน่วยจะได้รับการอัปเดตหลายครั้งด้วยโครงการที่แตกต่างกัน เข้าสู่หน่วยความจำทำให้สิ้นเปลืองทรัพยากรหน่วยความจำ DLL นั้นแตกต่างออกไป แม้ว่าจะถูกเรียกโดยบางโครงการ แต่ก็ยังคงเป็นอิสระหลังจากการคอมไพล์ กล่าวคือ หลังจากการคอมไพล์แล้ว ไลบรารี DLL จะสร้างไฟล์ปฏิบัติการแยกต่างหากและไม่ได้เชื่อมต่อกับไฟล์ปฏิบัติการอื่น ๆ ไลบรารี DLL ไม่อยู่ภายใต้โครงการใดโครงการหนึ่ง เมื่อหลายโครงการเรียกใช้ไลบรารี DLL เดียวกัน เฉพาะโครงการแรกเท่านั้นที่จะถ่ายโอนไลบรารี DLL ลงในหน่วยความจำ พื้นที่หน่วยความจำที่ใช้ร่วมกันเดียวกัน นอกจากนี้ รหัสการดำเนินการของ DLL จะถูกถ่ายโอนแบบไดนามิกในระหว่างการรันโปรแกรม แทนที่จะถูกถ่ายโอนไปยังหน่วยความจำพร้อมกับโครงการทั้งหมดเมื่อโปรแกรมกำลังทำงาน วิธีนี้สามารถขจัดข้อเสียของโค้ดเดียวกันซึ่งครอบครองหน่วยความจำในหลายตำแหน่งที่เกิดจากยูนิต
2. การสร้างไลบรารี DLL ใน Delphi
ในสภาพแวดล้อม Delphi การเขียน DLL ไม่ได้แตกต่างจากการเขียนแอปพลิเคชันทั่วไปมากนัก ที่จริงแล้ว การเขียนฟังก์ชัน DLL เป็นส่วนเนื้อหาหลักของ DLL ไม่จำเป็นต้องใช้วิธีพิเศษใดๆ ยกเว้นความแตกต่างในด้านการจัดการหน่วยความจำและทรัพยากร
รูปแบบของไฟล์โครงการทั่วไปคือ:
ชื่อโครงการโครงการ
ใช้ประโยค;
เนื้อความของโปรแกรม
รูปแบบของไฟล์โครงการ DLL คือ:
ชื่อโครงการห้องสมุด
ใช้ประโยค;
ข้อ exprots;
เนื้อความของโปรแกรม
มีความแตกต่างที่สำคัญสองประการระหว่างพวกเขา:
1. โดยทั่วไป ส่วนหัวของไฟล์โครงการจะใช้คำหลักของโปรแกรม ในขณะที่ส่วนหัวของไฟล์โครงการ DLL จะใช้คำหลักของไลบรารี คีย์เวิร์ดที่แตกต่างกันจะบอกคอมไพเลอร์ให้สร้างไฟล์ปฏิบัติการที่แตกต่างกัน คำหลักของโปรแกรมใช้เพื่อสร้างไฟล์ .exe และคำหลักของไลบรารีใช้เพื่อสร้างไฟล์ .dll
2. หาก DLL ต้องการส่งออกฟังก์ชันหรือขั้นตอนการใช้งานโดยแอปพลิเคชันอื่น ฟังก์ชันหรือขั้นตอนเหล่านี้จะต้องแสดงอยู่ในส่วนคำสั่งการส่งออก ฟังก์ชั่นหรือขั้นตอนเหล่านี้จะต้องรวบรวมโดยใช้คำสั่งการคอมไพล์การส่งออก
เลือกรายการใหม่... ในไฟล์เมนูหลักของ Delphi ดับเบิลคลิกที่ไอคอน DLL ในหน้าต่างป๊อปอัป จากนั้นเฟรมเวิร์กโมดูลซอร์ส DLL จะได้รับโดยอัตโนมัติ ดังนี้:
โครงการห้องสมุด1;
{...คำอธิบายประกอบ...}
การใช้งาน
SysUtils, คลาส;
เริ่ม
จบ.
จากนั้น คุณสามารถเพิ่มคำจำกัดความของขั้นตอนและฟังก์ชันที่คุณต้องการใช้ใน DLL ระหว่าง USES และ Start และใช้การส่งออกและส่งออกเพื่อส่งออกเพื่อให้โมดูลอื่นๆ สามารถอ้างอิงรหัสการเริ่มต้นและสิ้นสุดได้ ใช้เพื่อเริ่มต้นตัวแปร DLL ควรสังเกตว่าแม้ว่าจะไม่มีรหัสการเริ่มต้น ก็ไม่สามารถละเว้นเริ่มต้นและสิ้นสุดได้ ดังตัวอย่างต่อไปนี้:
ห้องสมุดขั้นต่ำ;
functionMin(X,Y:จำนวนเต็ม):จำนวนเต็ม;ส่งออก;
เริ่ม
ifX<YthenMin:=XelseMin:=Y;
จบ;
functionMax(X,Y:จำนวนเต็ม):จำนวนเต็ม;ส่งออก;
เริ่ม
ifX>YthenMax:=XelseMax:=Y;
จบ;
การส่งออก
มินิดัชนี1,
แม็กซ์อินเด็กซ์2;
เริ่ม
จบ.
หลังจากการคอมไพล์และบันทึกเป็น minmax.DLL ไฟล์ไลบรารี DLL จะถูกสร้างขึ้น
เข้าถึงไลบรารี DLL สามไลบรารี
มีสองวิธีในการเข้าถึงไลบรารี DLL วิธีแรกคือการอ้างอิงแบบคงที่ และอีกวิธีคือการอ้างอิงแบบไดนามิก
การโหลด DLL โดยใช้วิธีการอ้างอิงแบบคงที่จำเป็นต้องมีสองสิ่ง: การสร้างหน่วยอินพุตสำหรับไลบรารี DLL และการใช้ USES เพื่อเชื่อมต่อหน่วยอินพุตเข้ากับโมดูลโปรแกรมที่จะใช้ฟังก์ชัน DLL ข้อแตกต่างระหว่างหน่วยอินพุตที่สร้างขึ้นสำหรับไลบรารี DLL และหน่วยทั่วไปคือโพรซีเดอร์และฟังก์ชันที่ประกาศที่อินเทอร์เฟซไม่ได้ให้โค้ดการใช้งานจริงในส่วนการใช้งาน แต่ใช้คีย์เวิร์ดภายนอกเพื่อประกาศขั้นตอนและฟังก์ชัน รายละเอียดการใช้งานถูกกำหนดให้กับโมดูล DLL ภายนอก
ไวยากรณ์สำหรับการใช้คำสั่งภายนอกมีดังนี้:
ขั้นตอน/ฟังก์ชัน ขั้นตอน/ชื่อฟังก์ชัน ชื่อโมดูล externalDLL;
ต่อไปนี้เป็นไฟล์ต้นฉบับของหน่วยอินพุต testdll.pas ที่เขียนขึ้นสำหรับไลบรารี minmax.DLL ที่สร้างขึ้นด้านบน จากนั้นเราจะเห็นความแตกต่างบางประการระหว่างหน่วยอินพุตและหน่วยทั่วไป รหัสมีดังนี้:
unittestdll;
อินเตอร์เฟซ
การใช้งาน
functionMin(X,Y:จำนวนเต็ม):จำนวนเต็ม;
functionMax(X,Y:จำนวนเต็ม):จำนวนเต็ม;
การดำเนินการ
functionMin;external'minmax.DLL';
functionMax;external'minmax.DLL';
จบ.
หากแอปพลิเคชันต้องการเรียกใช้ฟังก์ชันใน minmax.DLL จะต้องเพิ่มหน่วย testdll ลงในคำสั่งการใช้งานเท่านั้น
การโหลด DLL แบบไดนามิกต้องใช้ฟังก์ชัน API สามฟังก์ชันของ Windows Loadlibrary, Freelibrary และ GetprocAddress ฟังก์ชัน loadlibrary ใช้เพื่อโหลดไลบรารี DLL รูปแบบการโทรมีดังนี้:
functionloadlobrary(DLLfileName:Pchar):THandle:
เมื่อไม่จำเป็นต้องใช้ไลบรารี DLL อีกต่อไป ควรเรียกฟังก์ชัน FreeLibrary เพื่อปล่อยไลบรารีดังกล่าวเพื่อเพิ่มทรัพยากรหน่วยความจำอันมีค่า รูปแบบการโทรจะเป็นดังนี้:
ขั้นตอน FreeLibrary (Libmodule: THandle)
Libmodule คือตัวจัดการไลบรารี DLL ที่ได้รับจากการเรียก LoadLibrary ในส่วนของโปรแกรมระหว่างการโหลดไลบรารี DLL ด้วยฟังก์ชัน loadlobrary และการเรียก FreeLibrary เพื่อปล่อยไลบรารี DLL คุณสามารถใช้ขั้นตอนและฟังก์ชันในไลบรารี DLL ได้ วิธีการใช้งานเฉพาะคือ: ใช้ฟังก์ชัน GetprocAddress เพื่อรับที่อยู่ของ ฟังก์ชันในไลบรารี DLL ส่งผ่านไปยังตัวแปรฟังก์ชันในโปรแกรม จากนั้นใช้ตัวแปรเพื่อเรียกใช้ฟังก์ชัน DLL ฟังก์ชัน GetprocAddress มีการประกาศดังนี้
functionGetprocAddress (Libmodule:THandle:procname:pchar):TFarProc:
ดังแสดงในตัวอย่างต่อไปนี้:
พิมพ์
TTimeRec=บันทึก
ประการที่สอง:จำนวนเต็ม;
นาที:จำนวนเต็ม;
ชั่วโมง:จำนวนเต็ม;
จบ;
TGetTime=ขั้นตอน(varTime:TTimeRec);
THandle=จำนวนเต็ม;
var
เวลา: TTimeRec;
ที่จับ: THandle;
GetTime:TGetTime;
-
เริ่ม
หมายเลขอ้างอิง: = LoadLibrary ('DATETIME.DLL');
ifHandle<>0แล้ว
เริ่ม
@GetTime:=GetProcAddress(จัดการ,'GetTime');
if@GetTime<>ไม่มีเลย
เริ่ม
GetTime(เวลา);
ด้วยไทม์โด
WriteLn('เวลาคือ',ชั่วโมง,':',นาที,':',วินาที);
จบ;
ห้องสมุดอิสระ(จัดการ);
จบ;
จบ;
เมื่อเรียกไลบรารีลิงก์แบบไดนามิก คุณควรทราบว่าไลบรารีลิงก์แบบไดนามิกที่จำเป็นต้องอยู่ในไดเร็กทอรีเดียวกันกับแอปพลิเคชันหรือในไดเร็กทอรี WindowsSystem
ไลบรารีลิงก์แบบไดนามิกเป็นวิธีสำคัญในการจัดระเบียบโปรแกรมภายใต้ Windows การใช้ไลบรารีลิงก์แบบไดนามิกสามารถปกป้องงานที่ทำโดยผู้ใช้ในเครื่องมือการพัฒนาที่แตกต่างกันและในเวลาที่ต่างกันได้อย่างมาก และปรับปรุงประสิทธิภาพการเขียนโปรแกรม