โดยทั่วไปการผลิต Dll จะแบ่งออกเป็นขั้นตอนต่อไปนี้:
1 เขียนขั้นตอนหรือฟังก์ชันในโครงการ DLL
2 เขียนคำสำคัญการส่งออกและเขียนชื่อของขั้นตอนด้านล่าง ไม่จำเป็นต้องเขียนพารามิเตอร์และเรียกส่วนต่อท้าย
ผ่านพารามิเตอร์สองตัวแล้ว
1 ประเภทพารามิเตอร์ควรสอดคล้องกับประเภทพารามิเตอร์ของหน้าต่าง C++ อย่าใช้ชนิดข้อมูล DELPHI
2 วิธีที่ดีที่สุดคือต้องมีค่าส่งคืน [แม้ว่าจะเป็นขั้นตอน] เพื่อรายงานความสำเร็จหรือความล้มเหลวของการโทร หรือสถานะ ค่าที่ส่งคืนของความสำเร็จหรือความล้มเหลวควรเป็น 1 [ความสำเร็จ] หรือ 0 [ความล้มเหลว] กล่าวคือ เข้ากันได้กับ Windows C++
3 ประกาศส่วนต่อท้ายด้วย stdcall
4 ควรพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
5 ไม่จำเป็นต้องใช้ส่วนต่อท้าย Far Calling เพียงเพื่อความเข้ากันได้กับโปรแกรม Windows 16 บิตเท่านั้น
การเริ่มต้นและออกจากการล้างข้อมูลของ DLL สามตัว [หากจำเป็นต้องเริ่มต้นและออกจากการล้างข้อมูล]
1 DLLPRoc [ตัวชี้ของหน่วย SysUtils] คือทางเข้าสู่ DLL ที่นี่คุณสามารถแทนที่รายการด้วยฟังก์ชันของคุณได้ แต่ฟังก์ชันของคุณจะต้องเป็นไปตามข้อกำหนดต่อไปนี้ [จริงๆ แล้วเป็นฟังก์ชันโทรกลับ] ดังต่อไปนี้:
ขั้นตอน DllEnterPoint (dwReason: DWord); ไกล stdcall;
พารามิเตอร์ dwReason มีสี่ประเภท:
DLL_PROCESS_ATTACH: เมื่อกระบวนการเข้าสู่
DLL_PROCESS_DETACH เมื่อกระบวนการออก
DLL_THREAD_ATTACH เมื่อเธรดเข้าสู่
DLL_THREAD_DETACH เมื่อเธรดออก
ในส่วนการเริ่มต้นให้เขียน:
DLLProc := @DLLEnterPoint;
DllEnterPoint(DLL_PROCESS_ATTACH);
2 หากมีส่วนประกอบ TdcomConnection บนแบบฟอร์ม ให้ใช้ Uses Activex และเขียน CoInitialize (ไม่มี) ระหว่างการเริ่มต้น
3 ตรวจสอบให้แน่ใจว่า DcomConnection.Connected := False เมื่อออก และชุดข้อมูลถูกปิดแล้ว มิฉะนั้น ที่อยู่ที่รายงานไม่ถูกต้อง
การใช้ตัวแปรโกลบอลสี่ตัว
ในโปรแกรม Widnows 32 บิต ช่องว่างที่อยู่ของแอปพลิเคชันทั้งสองจะไม่เกี่ยวข้องกัน แม้ว่า DLL จะเป็นสำเนาในหน่วยความจำ ตัวแปรจะอยู่ในพื้นที่ที่อยู่ของแต่ละกระบวนการ ดังนั้นคุณจึงไม่สามารถใช้ตัวแปรส่วนกลางของ dll เพื่อถ่ายโอนข้อมูลระหว่างสองแอปพลิเคชันได้ เว้นแต่คุณจะใช้ไฟล์อิมเมจหน่วยความจำ
5. เรียกการโหลดแบบคงที่
1 การประกาศฟังก์ชันไคลเอ็นต์:
1) คำนึงถึงขนาดตัวพิมพ์
2) เช่นเดียวกับการประกาศใน DLL
เช่น: showform(form:Tform);Far;external'yproject_dll.dll';
3) ประเภทพารามิเตอร์ที่ส่งผ่านเมื่อโทรควรเหมือนกับ Windows C++
4) เมื่อทำการเรียก DLL จะต้องอยู่ในเส้นทางการค้นหาของ windows ลำดับคือ: ไดเรกทอรีปัจจุบัน เส้นทางของ windows;
การเรียกหกครั้งเพื่อการโหลดแบบไดนามิก
1 สร้างประเภทขั้นตอน [หากคุณมีความชัดเจนเกี่ยวกับลักษณะของตัวแปรประเภทขั้นตอนที่เป็นเพียงตัวชี้ คุณจะรู้ว่าเกิดอะไรขึ้น] ชอบ:
พิมพ์
mypointer=procedure(form:Tform);ไกล;ภายนอก;
var
คำแนะนำ:ธันเดิล;
รูปแบบการแสดง:mypointer;
เริ่ม
คำแนะนำ:=loadlibrary('yproject_dll');//โหลด Dll และค้นหาโดยใช้ชื่อไฟล์
showform:=getprocaddress(Hinst,'showform');//ค้นหาด้วยชื่อฟังก์ชัน คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ สิ่งนี้ชัดเจนหากคุณทราบธรรมชาติของออบเจ็กต์ระบบอัตโนมัติ
showform(application.mainform);//ถูกเรียกเมื่อค้นหาตัวชี้รายการฟังก์ชัน
ห้องสมุดเสรี (คำแนะนำ);
จบ;
7. สร้าง TForM ใน DLL
1 ใช้แบบฟอร์มของคุณเป็น Dll และหน่วยที่เกี่ยวข้องที่ใช้โดยแบบฟอร์มของคุณจะต้องใช้ใน [นี่เป็นจุดที่ลำบากที่สุด เนื่องจากแบบฟอร์มของคุณอาจใช้หน่วยหรือฟังก์ชันพิเศษจำนวนมาก]
2 ส่งพารามิเตอร์แอปพลิเคชันและใช้เพื่อสร้างแบบฟอร์ม
8. สร้าง TMDIChildForM ใน DLL
1 MDIForm.FormStyle ใน Dll ไม่จำเป็นต้องเป็น fmMDIChild
2 เขียนสองประโยคต่อไปนี้หลัง CreateForm:
ฟังก์ชัน ShowForm(mainForm:TForm):จำนวนเต็ม;stdcall
var
แบบฟอร์ม 1: TForm1;
ptr:PLongInt;
เริ่ม
ptr:=@(Application.MainForm);//บันทึกตัวจัดการ MainForm ของ dll ก่อน ไม่จำเป็นต้องปล่อย เพียงแทนที่มัน
ptr^:=LongInt(mainForm);//แทนที่ MainForm ของ DLL ด้วย mainForm ของโปรแกรมที่เรียก MainForm เป็นหน้าต่างพิเศษที่จัดการทรัพยากรแบบฟอร์มในแอปพลิเคชันโดยเฉพาะ
//ทำไมไม่โดยตรง Application.MainForm := mainForm เพราะ Application.MainForm เป็นคุณสมบัติแบบอ่านอย่างเดียว
Form1:=TForm1.Create(mainForm);//สร้างด้วยพารามิเตอร์
จบ;
หมายเหตุ: พารามิเตอร์คือ Application.MainForm ของโปรแกรมที่เรียก
เก้าตัวอย่าง:
ซอร์สโค้ด DLL:
โครงการห้องสมุด2;
การใช้งาน
SysUtils,
ชั้นเรียน
กล่องโต้ตอบ
แบบฟอร์ม
Unit2 ใน 'Unit2.pas' {Form2};
{$อาร์ *.เรส}
var
ซีซีซี:พชาร์;
ขั้นตอน OpenForm(mainForm:TForm);stdcall;
var
แบบฟอร์ม 1: TForm1;
ptr:PLongInt;
เริ่ม
ptr:=@(Application.MainForm);
ptr^:=LongInt(ฟอร์มหลัก);
Form1:=TForm1.Create(ฟอร์มหลัก);
จบ;
ขั้นตอน InputCCC (ข้อความ: Pchar); stdcall;
เริ่ม
ซีซีซี := ข้อความ;
จบ;
ขั้นตอน ShowCCC;stdcall;
เริ่ม
ShowMessage(สตริง(ซีซีซี));
จบ;
การส่งออก
โอเพ่นฟอร์ม;
อินพุตCCC,
โชว์ซีซีซี;
เริ่ม
จบ.
รหัสที่มาของผู้โทร:
หน่วย หน่วยที่ 1;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ,
StdCtrls;
พิมพ์
TForm1 = คลาส (TForm)
Button1: T ปุ่ม;
Button2: T ปุ่ม;
แก้ไข 1: TEdit;
ขั้นตอน Button1Click (ผู้ส่ง: TObject);
ขั้นตอน Button2Click (ผู้ส่ง: TObject);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
จบ;
var
แบบฟอร์ม 1: TForm1;
การดำเนินการ
{$R *.DFM}
ขั้นตอน OpenForm(mainForm:TForm);stdcall;External'project2.dll';
ขั้นตอน ShowCCC;stdcall;External'project2.dll';
ขั้นตอน InputCCC (ข้อความ: Pchar); stdcall; External'project2.dll';
ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject);
var
ข้อความ: พชาร์;
เริ่ม
ข้อความ := Pchar(Edit1.Text);
// OpenForm(Application.MainForm);//เพื่อปรับ MDICHILD
InputCCC(Text);//เพื่อทดลองว่าตัวแปรโกลบอลใน DLL จะถูกแชร์ระหว่างแอพพลิเคชั่นต่างๆ หรือไม่
จบ;
ขั้นตอน TForm1.Button2Click (ผู้ส่ง: TObject);
เริ่ม
ShowCCC;//สิ่งนี้แสดงให้เห็นว่าตัวแปรส่วนกลางใน DLL ของแอปพลิเคชัน WINDOWS 32 บิตนั้นอยู่ในพื้นที่ที่อยู่ของแอปพลิเคชันด้วย แอปพลิเคชัน 16 บิตอาจแตกต่างกันและไม่มีการทดลองใด ๆ เกิดขึ้น
จบ;