ไลบรารี dll ใดที่คัดลอกเมื่อติดตั้ง delphi การสร้างตัวแปรของไลบรารีไดนามิก (DLL) ใน Delphi การตรวจสอบฟังก์ชันการร้องเพลง DLL

โกลอฟนา / รายชื่อผู้ติดต่อ

DLL- ไดนามิกลิงค์ไลบรารี่ยังเชื่อมต่อกับไลบรารีไดนามิกอีกด้วย เนื่องจากมันทำให้คุณสามารถหยุดฟังก์ชั่นของคุณเองในโปรแกรมต่างๆ ได้ มันเป็นเรื่องจริงที่จะหยิบหยิบหยิบขึ้นมาหยิบมือหนึ่ง ที่สำคัญกว่านั้นเมื่อห้องสมุดถูกเขียนขึ้นแล้ว ก็สามารถเขียนด้วยโปรแกรมที่หลากหลายได้ ในบทเรียนวันนี้ เรามาฝึกปฏิบัติ dllและแน่นอน สร้างมันขึ้นมา!
มาทำกัน!

สำหรับ cob มาสร้าง Persha Dynamic Link Library ของเรากันเถอะ! Virushaemo ใน เดลฟีและใช้งานได้ทันทีในเมนู File->New->Other
ก่อนหน้าเราเป็นแกนเดียวกันในที่สุด:

เลือกจากรายการไลบรารี Dynamic-Link (สำหรับรุ่นน้อง 2009 เดลฟีรายการเรียกว่าตัวช่วยสร้าง DLL)

เป็นผลให้เรามีน้อยกว่าหน้าต่างที่มีรหัส เคารพรูปแบบที่เราไม่มีที่นี่!
ตอนนี้naytsіkavіsheกำลังซ่อมอยู่ มาเขียนขั้นตอนแรกของเราที่ห้องสมุดกัน

โครงการห้องสมุด2;
// คุณคนเดียวจำได้ว่าโปรแกรมถูกแทนที่
// เมื่อ dll ถูกสร้างขึ้น ไลบรารีคำจะถูกเรียก
// ห้องสมุดหมายความว่าอย่างไร
ใช้
Sysutils กล่องโต้ตอบ
ชั้นเรียน; // เคารพ! อย่าลืมระบุโมดูล
// มิฉะนั้นรหัสจะไม่สามารถปฏิบัติได้

($R*.res)
(QIU CHASTIN มีรหัส DLL)

ขั้นตอนแรกโทร; stdcall; ส่งออก;
//Stdcall - พารามิเตอร์ของตัวดำเนินการใดที่วางอยู่บน stack
// ขวา ซ้าย และกลับค่ามาตรฐาน
//สามารถละเว้นการส่งออกจากหลักการได้แทนเพื่อความกระจ่าง
//ขั้นตอนการส่งออกหรือฟังก์ชัน

เริ่ม
แสดงข้อความ(" ขั้นตอนแรกของฉันใน dll");

จบ;

DoubleProcedureCall; stdcall; ส่งออก;
เริ่ม
แสดงข้อความ(" ขั้นตอนเพื่อนของฉัน");
//คลิกที่หน้าจอ
จบ;

ส่งออก FirstCall, DoubleCall;
//รายการองค์ประกอบที่ส่งออกจะถูกเก็บไว้ในการส่งออก
// วิธีการนำเข้าเป็นโปรแกรม.

เริ่ม
จบ.

บน tsomu mi เรายังคง sho zupinimsya เพราะ เพื่อบั้นท้ายธรรมดาซึ่งจะเพียงพอ ทันทีที่เราบันทึกโครงการของเรา โดยเฉพาะอย่างยิ่งฉันบันทึกมันไว้ภายใต้ชื่อ Project2.dll และกดแป้น CTRL+F9 ร่วมกันเพื่อคอมไพล์ไลบรารี พ่อที่คุณบันทึกไฟล์ dpr มีความผิดในการมีไฟล์ที่มีนามสกุล dll ซึ่งเป็นไลบรารี่ที่เราสร้างขึ้นมาอย่างดี ฉันมีมันชื่อ Project2.dll

ทีนี้มาจัดการกับวงจรของขั้นตอนของห้องสมุดกัน เราสร้างโปรแกรมใหม่ที่อยู่เบื้องหลังรูปแบบมาตรฐาน ต่อหน้าเรานั้นไม่มีอะไรพิเศษ เป็นเพียงรูปแบบ นำภาคผนวกใหม่ไปที่โฟลเดอร์ Yakus І ในโฟลเดอร์ qiu w ฉันจะคัดลอกมัน ห้องสมุด dll. ทูบโต ใน ก้นนี้ Project2.dll

ตอนนี้ก็ขึ้นอยู่กับคุณแล้วว่าจะเรียกฟังก์ชันต่างๆ ของไลบรารี่อย่างไร เราใช้สองวิธีและ vikliku

วิธี #1
อาจเป็นวิธีที่ง่ายที่สุดในการเรียกคืนขั้นตอนที่พบในห้องสมุด
เหมาะสำหรับคนงานที่มีห้องสมุดเพียงแห่งเดียว

เอาล่ะ ไปกันเถอะ...
หลังจากคีย์เวิร์ดการใช้งานแล้ว โค้ดถัดไปจะถูกเขียนขึ้น:

ขั้นตอนแรกโทร; stdcall; ภายนอก "Project2.dll";
// แทนที่ Project2.dll อาจเป็นชื่อไลบรารี

DoubleProcedureCall; stdcall; ภายนอก "Project2.dll";

ที่นี่ตามที่คุณเดาได้ร้องเพลงแล้ว เรากำลังเตือนโปรแกรมให้ตั้งชื่อขั้นตอนของเราและเราบอกว่ากลิ่นเหม็นอยู่ใน ห้องสมุด dllในความคิดของฉันกับชื่อ Project2.dll

ทีนี้ เพื่อที่จะเรียกโพรซีเดอร์เหล่านี้ เราเพียงแค่ใส่ชื่อของพวกเขาลงในตำแหน่งในโค้ด ซึ่งเราสามารถตั้งชื่อได้ทันที เราโยนองค์ประกอบ 2 ปุ่มบนแบบฟอร์มจากแท็บมาตรฐานและสร้างบนตัวอย่างสกินภายใต้ OnClick

OnClick ของปุ่มแรก:


เริ่ม
โทรครั้งแรก;
จบ;

OnClick ปุ่มอื่น:


เริ่ม
โทรสองครั้ง; // ฉันเป็นขั้นตอนที่อยู่ใน dll
จบ;

จากฉันทั้งหมด!

วิธี #2:
การพับจะลดลงก่อน แต่ก็มีข้อดีและมีความหนักแน่นมากกว่าซึ่งเหมาะสำหรับปลั๊กอิน
สำหรับศาสโตสุวรรณยะ วิธีที่กำหนดให้เราหูหนวกจากการเปลี่ยนแปลงทั่วโลก:

วาร์
LibHandle: Hโมดูล; //ส่งไปที่โมดูลห้องสมุด
FirstCall: ขั้นตอน; stdcall;
//ชื่อขั้นตอนของเราที่อยู่ในห้องสมุด

DoubleCall: ขั้นตอน; stdcall;

จากนั้น หลังจากใช้งานคีย์เวิร์ด เราจะเขียนขั้นตอนเพื่อเข้าควบคุมห้องสมุดของเรา:

โหลด ProcedureMyLibrary (ชื่อไฟล์: สตริง);
เริ่ม
LibHandle:= LoadLibrary(PWideChar(ชื่อไฟล์));
//รับห้องสมุด!
// เคารพ! PChar สำหรับเวอร์ชันที่ต่ำกว่า 2009 Delphi
ถ้า LibHandle = 0 ให้เริ่ม
กล่องข้อความ(0,"",0,0);
ทางออก;
จบ;
FirstCall:= GetProcAddress(LibHandle,"FirstCall");
//Otrimuemo avka_vnik บนวัตถุ
//พารามิเตอร์แรกที่ส่งไปยังโมดูลไลบรารี
//พารามิเตอร์ที่ 2 ของชื่ออ็อบเจ็กต์ใน dll

DoubleCall:= GetProcAddress(LibHandle,"DoubleCall");
ถ้า @FirstCall = ไม่มี ให้เริ่ม

กล่องข้อความ(0," เป็นไปไม่ได้ที่จะเข้าครอบครองห้องสมุด",0,0);
ทางออก;
จบ;
ถ้า @DoubleCall = nil ให้เริ่ม
// ทบทวนการมีอยู่ของฟังก์ชันนี้ในไลบรารี
กล่องข้อความ(0," เป็นไปไม่ได้ที่จะเข้าครอบครองห้องสมุด",0,0);
ทางออก;
จบ; จบ;

หากมีการสร้างบางสิ่งในแบบฟอร์ม ตัวอย่างของ OnCreate pod ซึ่งสำหรับความช่วยเหลือของขั้นตอนที่สร้างขึ้นอย่างดี ห้องสมุด

ขั้นตอน TForm1.FormCreate(ผู้ส่ง: TObject);
เริ่ม
LoadMyLibrary("Project2.dll");
จบ;

ตอนนี้ฉันกำลังทำอีกครั้ง เพื่อเรียกขั้นตอนที่จำเป็นจากห้องสมุดของเรา เราไม่จำเป็นต้องใส่ชื่อของพวกเขาในที่ใด ๆ ในโค้ด สำหรับสิ่งนี้ เราสามารถโยน 2 องค์ประกอบของปุ่มบนแบบฟอร์มจากแท็บมาตรฐาน และสร้างมันบนตัวอย่างสกินภายใต้ OnClick

OnClick ของปุ่มแรก:

ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject);
เริ่ม
โทรครั้งแรก; // ฉันเป็นขั้นตอนที่อยู่ใน dll
จบ;

OnClick ปุ่มอื่น:

ขั้นตอน TForm1.Button2Click (ผู้ส่ง: TObject);
เริ่ม
โทรสองครั้ง; // ฉันเป็นขั้นตอนที่อยู่ใน dll
จบ;

เรากำลังสร้างสำเนาของ OnDestroy ในแบบฟอร์มในรูปแบบที่มีชีวิตชีวา ห้องสมุด dllจากความทรงจำ

ขั้นตอน TForm1.FormDestroy(ผู้ส่ง: TObject);
เริ่ม
FreeLibrary (LibHandle);
//มองไปยังคลังความจำ
จบ;

จากฉันทั้งหมด! อีกวิธีในการเขียนที่ยุ่งยาก แต่ยังเป็นข้อดีในวัตถุที่ชี้แจงซึ่งรวบรวมไว้ในห้องสมุด

ป.ล. หากคุณต้องการส่งต่อผลงานอื่นๆ ทั้งหมดไปยังไซต์ ให้ใช้บทเรียนวิดีโอสด พอดคาสต์เสียง บทความจาก Delphi
มีส่วนร่วมในการแข่งขันและเข้าร่วมทีมของเราทีละขั้นตอน!
สมัครสมาชิกโดยตรงเพื่อสมัครสมาชิกมัลติมีเดียฟรีที่เว็บไซต์
เรามีอยู่แล้วมากกว่า 3500 คน!

DLL ตัวแปรในDelphi
  • แนวคิด DLL
  • การสร้าง Delphi DLL (ส่งออก)
  • Delphi DLL wiki (นำเข้า)
  • DLL ที่แฮ็กวัตถุ VCL เพื่อทำงานกับ data
  • ตำหนิสถานการณ์ใน DLL
  • แนวคิด DLL

มาดูขั้นตอนการเขียนโปรแกรมใน DOS กัน การแปลงข้อความเอาท์พุตของโปรแกรมเป็นรหัสเครื่อง รวมถึงสองกระบวนการ - การคอมไพล์และการเชื่อมโยง ในขั้นตอนของการเชื่อมโยง ตัวแก้ไขของลิงค์ สิ่งที่เขียน โมดูลOkremіโปรแกรมโดยการวางโค้ดของโปรแกรมเป็นฟังก์ชันและขั้นตอนแบบเปิด และโค้ดใหม่ คุณเตรียมโปรแกรมหนึ่งในลักษณะนี้ อีกโปรแกรมหนึ่งในสาม ... ฉันคัดลอกโค้ดของฟังก์ชันเงียบเอง วางลงในโปรแกรมอีกครั้ง

Program1 Program2: : MyFunc(:) MyFunc(:) : : รหัสฟังก์ชัน MyFunc รหัสฟังก์ชัน MyFunc รหัสฟังก์ชันอื่น รหัสฟังก์ชันอื่น

สำหรับสื่อที่มีงานมั่งคั่ง พิดฮิดดังกล่าวไม่ประมาท เห็นได้ชัดว่าจำนวนที่เท่ากันและฟังก์ชันเดียวกันนั้นยอดเยี่ยม ซึ่งคู่ควรกับองค์ประกอบที่หลากหลายในส่วนต่อประสานของคอริสทูวาค สำหรับการเข้าถึงทรัพยากรระบบ และอื่นๆ ซ้ำซ้อน b povnistyu ที่ภาคผนวกทั้งหมดซึ่งจะนำไปสู่การใช้ทรัพยากรที่แพงที่สุดในสวีเดน - หน่วยความจำในการดำเนินงาน แนวคิดของการเชื่อมโยงแบบไดนามิกได้รับการเผยแพร่บนแพลตฟอร์มที่เหมือน UNIX ซึ่งเป็นจุดสุดยอดของปัญหา เช่นเดียวกับ Vinyl (รูปที่ 2)

แต่ทำไม Dynamic Link Library (DLL) ถึงดูเหมือนโปรแกรมที่ยอดเยี่ยม? เพื่อให้เข้าใจสิ่งนี้ จำเป็นต้องชี้แจงความเข้าใจในงาน (งาน) อินสแตนซ์ (สำเนา) ของโปรแกรม (อินสแตนซ์) และโมดูล (โมดูล)

เมื่อเปิดใช้หลายอินสแตนซ์ของโปรแกรมเดียว Windows zavantazhu ใน หน่วยความจำในการทำงานรหัสและทรัพยากรเพียงสำเนาเดียว - โมดูลโปรแกรมที่สร้างรายการกลุ่มข้อมูล okremih สแต็กและรายการรายละเอียด (div. รูปที่ 3) สกินซึ่งเป็นชุดของงานในrozumіnі วินโดว์. สำเนาโปรแกรมเป็นบริบทที่โมดูลโปรแกรมตั้งอยู่

DLL - ไลบรารีเป็นโมดูลเช่นกัน มันจะถูกเก็บไว้ในหน่วยความจำในอินสแตนซ์เดียวและแทนที่ส่วนรหัสของทรัพยากรนั้น เช่นเดียวกับส่วนข้อมูล (div. รูปที่ 4)

DLL - ห้องสมุด ฟังก์ชันที่วางไว้ใน DLL จะถูกวางไว้ในบริบทของโปรแกรม ซึ่งเรียกโดยสแต็ก Ale t іnіkіїї vykoristovuyut ส่วน danih scho nabіbrіtetsіไม่ใช่โปรแกรมkopiї

โดยอาศัยอำนาจตามองค์กรนี้ ประหยัดหน่วยความจำ DLL ถึงบัญชีที่ทั้งหมด รันโปรแกรมแฮ็กโมดูล DLL หนึ่งโมดูล ไม่รวมโมดูลทั้งหมด ฟังก์ชันมาตรฐานไปที่คลังสินค้าของโมดูล

บ่อยครั้งในฐานะ DLL มีเพียงชุดของฟังก์ชันที่จัดกลุ่มไว้หลังเครื่องหมายตรรกะเดียวกันหรืออื่นๆ คล้ายกับวิธีที่โมดูล (นั่นคือหน่วย) มีการวางแผนตามแนวคิดใน Pascal โปรดทราบว่าฟังก์ชันจากโมดูล Pascal มีการเชื่อมโยงแบบสแตติก - ที่ขั้นตอนการลิงก์ และฟังก์ชันจาก DLL จะถูกเชื่อมโยงแบบไดนามิก จากนั้นในรันไทม์

การสร้าง Delphi DLL (ส่งออก)

ในการตั้งโปรแกรม Delphi DLL คุณต้องมี series คำสำคัญที่ปกครองไวยากรณ์ Golovne - DLL ของ Delphi เป็นโครงการดังกล่าวเช่นเดียวกับโปรแกรม

มาดูเทมเพลต DLL:


ไฟล์โครงการสำหรับเทมเพลตดังกล่าวสามารถเป็น MYDLL.DPR

ขออภัย Delphi IDE ไม่ได้สร้างโครงการโปรแกรมโดยอัตโนมัติ ดังนั้นคุณต้องเตรียมโครงการ DLL ด้วยตนเอง ใน Delphi 2.0 ความทึบถูกลบออก

เช่นเดียวกับในโปรแกรม ใน DLL การแจกจ่ายปัจจุบันใช้ Initsializatsiyna เป็นส่วนหนึ่งของ neobov'yazkovaya ในการกระจายการส่งออก ฟังก์ชันจะกลับกัน การเข้าถึงจะถูกตำหนิสำหรับความผันผวนของภาคผนวกภายนอก

ฟังก์ชันการส่งออก (และขั้นตอน) สามารถทำได้หลายวิธี:

  • ตามหมายเลข (ดัชนี)
  • โดยชื่อ

มีไวยากรณ์ที่แตกต่างกันในลักษณะต่อไปนี้:


เนื่องจาก Windows เข้าใจ "ฟังก์ชันประจำ" ของ DLL ดังนั้นฟังก์ชันเหล่านี้ ซึ่งเป็นที่รู้จักในหน่วยความจำเป็นเวลานาน มีฐาน DLL ในหน่วยความจำ Delphi จึงมีเครื่องมือสำหรับจัดระเบียบการส่งออกประเภทนี้:


จากนั้นการสร้างดัชนีของฟังก์ชันที่ส่งออกจะถูกแยกย่อยโดย Delphi โดยอัตโนมัติ และการส่งออกดังกล่าวจะถือเป็นการส่งออกตามชื่อ ซึ่งตรงกับชื่อของฟังก์ชัน อย่างไรก็ตาม ฟังก์ชันเสียงที่นำเข้าในโปรแกรมอาจถูกแทนที่ด้วยชื่อของฟังก์ชันที่เปล่งเสียงใน DLL สำหรับคำสั่งที่ซ้อนทับกับฟังก์ชันซึ่งนำเข้าแล้วเราจะพูดถึงด้านล่าง

Delphi DLL wiki (นำเข้า)

สำหรับองค์กรของการนำเข้า tobto. การเข้าถึงฟังก์ชันที่ส่งออกจาก DLL ดังนั้นเช่นเดียวกับการส่งออก Delphi ใช้เครื่องมือมาตรฐาน

สำหรับแอปพลิเคชันเพิ่มเติม โปรแกรมของคุณควรระบุฟังก์ชันที่นำเข้าจาก DLL ตามลำดับนี้:


วิธีนี้เรียกว่าการนำเข้าแบบคงที่

อย่างที่คุณจำได้ นามสกุลของไฟล์ที่จะล้างแค้น DLL นั้นไม่ได้ระบุไว้ - สำหรับการโปรโมต ไฟล์ *.DLL และ *.EXE จะถูกโยนทิ้งไป อย่างไรก็ตาม หากไฟล์สามารถขยายได้อีก (เช่น COMPLIB.DCL ใน Delphi) หรือหากคุณต้องการ DLL ที่กำหนดแบบไดนามิกและฟังก์ชันที่นำเข้า (เช่น โปรแกรมของคุณทำงานร่วมกับ รูปแบบกราฟิกและสำหรับผิว z พวกเขาіsnuє okrema DLL.)?

ในการแก้ปัญหาดังกล่าว คุณสามารถไปที่ Windows API ได้โดยตรง โดยเรียกการนำเข้าแบบไดนามิกดังนี้:


ใช้ WinTypes, WinProcs, ...; พิมพ์ TMyProc = ขั้นตอน ; varที่จับ: THandle; MyImportProc: TMyProc; เริ่มหมายเลขอ้างอิง:= LoadLibrary("MYDLL"); ถ้าจัดการ >= 32 แล้ว (ถ้า เริ่ม@MyImportProc:= GetProcAddress (แฮนเดิล "MYEXPORTPROC"); ถ้า MyImportProc ไม่มี แล้ว ... (โดยใช้ขั้นตอนการนำเข้า) จบ; FreeLibrary (จัดการ); จบ;

ไดอะแกรมไวยากรณ์สำหรับการส่งออก/นำเข้าเสียงอึกทึก การเปลี่ยนจุดทางออก DLL และแอปพลิเคชันอื่นๆ 21 วัน"

ถ้าคุณไม่พูดถึงการสร้างโค้ดคอมไพเลอร์ (มีการเพิ่มประสิทธิภาพเพิ่มเติมในเวลาเดียวกัน) กฎไวยากรณ์ทั้งหมดก็จะหายไปเช่นเดียวกับใน Borland Pascal 7.0

DLL ที่แฮ็กวัตถุ VCL เพื่อทำงานกับ data

เมื่อคุณสร้างไลบรารีไดนามิกของคุณเอง คุณสามารถทวีตฟังก์ชันของ DLL อื่นๆ ได้ ตัวอย่างของ DLL ดังกล่าวจัดทำโดย Delphi (X:\DELPHI\DEMOS\BD\BDEDLL) DLL นี้มีรูปแบบที่แสดงข้อมูลจากตารางและอนุญาตให้เข้าถึงได้โดยวัตถุ VCL (TTable, TDBGrid, TSession) ซึ่งเรียกฟังก์ชัน BDE ด้วยวิธีของตัวเอง วิธีตะโกนใส่ความคิดเห็นที่ก้นแรกสำหรับ DLL є obmezhennya: їїสามารถ vikoristovuvavat kіlka zavdan หนึ่งชั่วโมงได้หนึ่งชั่วโมง โปรดทราบว่าวัตถุ Session ซึ่งสร้างขึ้นโดยอัตโนมัติเมื่อเชื่อมต่อโมดูล DB ได้รับการเตรียมข้อมูลเบื้องต้นสำหรับโมดูล ไม่ใช่สำหรับงาน หากคุณพยายามคว้า DLL ด้วยโปรแกรมอื่น โปรดให้อภัย สำหรับzabіgannyaหนึ่งชั่วโมง zavantazhennuyu DLL dekіlkom zavdannym จำเป็นต้องzdіysniti deakіdії นอกจากนี้ยังมีขั้นตอนสำหรับตรวจสอบว่า DLL ใดถูกเลือกสำหรับงานอื่นๆ ในปัจจุบัน

ตำหนิสถานการณ์ใน DLL

สถานการณ์ที่ผิดพลาดใน DLL ที่สร้างขึ้นใน Delphi นั้นเกิดขึ้นก่อนสถานการณ์ที่ผิดพลาดในทุกโปรแกรม ดังนั้นสถานการณ์จึงไม่ถูกทำให้เป็นภาพรวมในช่วงกลางของ DLL เพื่อให้มีความจำเป็นต้องถ่ายโอนการปฏิเสธที่เป็นไปได้ทั้งหมดในขณะที่พัฒนา DLL คุณสามารถแนะนำให้หมุนผลลัพธ์ของฟังก์ชันที่เลือกซึ่งกำลังนำเข้าเพื่อดูแถวหรือหมายเลข i หากจำเป็นให้คำนวณสถานการณ์ผู้กระทำผิดในโปรแกรมอีกครั้ง


การทำงาน MyFunc: สตริง; เริ่ม พยายาม (รหัสฟังก์ชันที่ชัดเจน) ยกเว้น บน EResult: ข้อยกเว้น ทำผลลัพธ์:=รูปแบบ (DllErrorViewingTable, ) อื่นผลลัพธ์:= รูปแบบ (DllErrorViewingTable, ["ข้อผิดพลาดที่ไม่รู้จัก"]); จบ; จบ;

รหัสโปรแกรม:


StrResult:= MyFunc; ถ้าผลลัพธ์ "" แล้ว ยก Exception.Create(StrResult);

สัตตยา DLL ตัวแปรในDelphiแจกจ่าย ระบบไฟล์ DLL และปลั๊กอินสามารถใช้สำหรับผู้ค้าปลีก Delphi และ FreePascal

ตัวย่อ DLLหมายถึง "ห้องสมุดที่เคลื่อนไหวแบบไดนามิก" Dll ใน Delphi tse ไฟล์ที่จำเป็นสำหรับการทำงาน คอมพิวเตอร์ซอฟแวร์ขั้นตอนและหน้าที่ซึ่งโปรแกรมหยุดอยู่ที่ขั้นตอนของ vikonannya

มันถูกกำหนดว่าโปรแกรมย่อยที่จำเป็นทั้งหมดสามารถอธิบายได้ในประเภทโปรแกรม ตอนนี้จำเป็นต้องสร้างเพิ่มเติม dll ไฟล์สัทนูวาทิสยะที่อยู่กับเขาเป็นเวลาหนึ่งชั่วโมงของวิโคนันทยา? เสื้อคลุมสำหรับ gnuchkost เพิ่มเติม โปรแกรมที่สร้างขึ้น. เมื่อเวลาผ่านไป อัลกอริธึมการประมวลผลข้อมูลบางอย่างสามารถเปลี่ยนแปลงได้ เนื่องจากขั้นตอนการประมวลผลจะลดลงในประเภทโปรแกรม คุณจะต้องคอมไพล์ใหม่และส่งไฟล์ไปยังเครื่องรับอีกครั้ง ถ่ายโอนไฟล์ dll ขนาดเล็ก ซึ่งสามารถทำได้โดยใช้ขั้นตอนน้อยกว่าสองสามขั้นตอน ซึ่งง่ายกว่ามากและทำงานในโหมดอัตโนมัติ

นอกจากนี้หุ่นยนต์ของไลบรารี dll zovsіmไม่สามารถอยู่ในภาษาของโปรแกรมซึ่งมันจะถูกสร้างขึ้น ดังนั้นการสร้าง dll สำหรับโปรแกรมของเราสามารถมอบความไว้วางใจให้กับผู้ค้าปลีกบุคคลที่สามโดยไม่ต้องคำนึงถึงภาษาการเขียนโปรแกรมที่มีกลิ่นเหม็น เห็นได้ชัดว่าเร่งรีบสร้างการถ่ายโอนนั้นไปยังเจ้าหน้าที่ของโครงการที่เสร็จแล้ว

การสร้าง DLL

การสร้าง dll ใน Delphiไม่พับสำหรับการสร้างโมดูลเพิ่มเติม พิมพ์คำสั่ง File -> New -> -> Other... ที่กล่องโต้ตอบที่ปรากฏขึ้น ให้เลือกไอคอน DLL Wisard ด้วยเหตุนี้ Delphi จะสร้างโครงการไลบรารี DLL:

ห้องสมุดโครงการ1;

( หมายเหตุสำคัญเกี่ยวกับการจัดการหน่วยความจำ DLL: ShareMem ต้องเป็น
หน่วยแรกใน "s USES clause และโครงการของคุณ" ของไลบรารีของคุณ (select
Project-View Source) ใช้คำสั่งย่อยหาก DLL ของคุณส่งออกขั้นตอนใด ๆ หรือ
ฟังก์ชันที่ส่งผ่านสตริงคือพารามิเตอร์หรือฟังก์ชันผลลัพธ์ นี้
นำไปใช้กับสตริงทั้งหมดที่ส่งผ่านไปยังและจาก DLL ของคุณ - แม้กระทั่งสตริงที่
ถูกซ้อนอยู่ในเร็กคอร์ดและคลาส ShareMem เป็นหน่วยอินเตอร์เฟสของ
BORLNDMM.DLL ตัวจัดการหน่วยความจำที่ใช้ร่วมกันซึ่งต้องปรับใช้พร้อมกัน
ด้วย DLL ของคุณ เพื่อเน้น BORLNDMM.DLL ให้ส่งผ่านข้อมูลสตริง
พารามิเตอร์ PChar และ ShortString )

ใช้
ซิสซูทิล,
ชั้นเรียน;

($R*.res)

เริ่ม
จบ
.

เลือกชื่อสำหรับไลบรารี dll ใหม่และบันทึกในโฟลเดอร์ okrem โดยพิมพ์คำสั่ง ไฟล์ -> บันทึกเป็น... paps มี 4 ไฟล์ จะไม่มีไฟล์ dll ตรงกลาง ฟังดูง่าย ไฟล์ข้อความจะทำอย่างไรกับคำอธิบายของโครงการ ในการสร้างไฟล์ sub-bag ของไลบรารี dll จำเป็นต้องคอมไพล์โปรเจ็กต์ วิคทีม โครงการ -> รวบรวมโครงการ. เป็นผลให้ไฟล์ dll จะปรากฏในโฟลเดอร์ของเราและจะโหลดโปรแกรมหลัก

ห้องสมุดยังว่าง

...ขณะนี้ข้อความอยู่ในขั้นตอนแก้ไข...



รายการ

ในการเชื่อมต่อกับการพัฒนาที่เพิ่มขึ้นของเทคโนโลยีการเขียนโปรแกรม ผู้คนจำนวนมากขึ้นเรื่อย ๆ กำลังดิ้นรนกับปัญหาในการเพิ่มความเป็นไปได้ของโปรแกรมของพวกเขา บทความนี้อุทิศให้กับพลังและเพื่อตัวเอง - การเขียนโปรแกรม DLL จาก Borland Delphi นอกจากนี้ ในขณะที่เรากำลังผลักดันพลังของไลบรารี DLL บางตัว เรากำลังผลักดันการนำเข้าฟังก์ชันจาก DLL ของบุคคลอื่นพร้อมกัน (รวมถึงไลบรารี่ของระบบ เช่น WinAPI)

DLL Stuck Areas

Otzhe ตอนนี้คุณต้องการไลบรารี DLL และกลิ่นเหม็น vikoristovuyutsya หรือไม่? Pererakhuemo พื้นที่deakі z น้อยกว่าїх zastosuvannya:

ห้องสมุดOkremі ฟังก์ชั่นเพิ่มเติม. ตัวอย่างเช่น ฟังก์ชันสำหรับการทำงานในแถว หรือไลบรารีการพับสำหรับการแปลงรูปภาพ DLL ขุมทรัพย์ทรัพยากรสามารถใช้เป็นฟังก์ชันของโปรแกรมและทรัพยากรต่างๆ ได้ เช่น ไอคอน ตัวเล็กๆ อาร์เรย์แถว เมนู ฯลฯ รองรับไลบรารี ตัวอย่างเช่น คุณสามารถเพิ่มไลบรารีของแพ็คเกจดังกล่าว เช่น DirectX, ICQAPI (API สำหรับ ICQ), OpenGL ได้เช่นกัน ส่วนของโปรแกรม ตัวอย่างเช่น จาก DLL คุณสามารถบันทึกหน้าต่างโปรแกรม (แบบฟอร์ม) ได้เช่นกัน ปลั๊กอิน ปลั๊กอินเป็นส่วนเสริมของโปรแกรมที่ขยายขีดความสามารถ ตัวอย่างเช่น ในบทความ เราสามารถพิจารณาทฤษฎีการสร้างปลั๊กอินสำหรับโปรแกรมโฮสต์ การแชร์ทรัพยากร DLL (Dynamic Link Library) สามารถแบ่งออกเป็นหลาย ๆ ครั้งโดยโปรแกรมหรือกระบวนการ (เรียกว่าการแชร์ - ทรัพยากรที่แชร์)

คำอธิบายสั้นๆ ของฟังก์ชันและแอปพลิเคชันสำหรับ DLL . ของหุ่นยนต์

แล้วคุณยอมรับฟังก์ชั่นนั้นอย่างไร? มาดูวิธีการนำเข้าฟังก์ชันจากไลบรารีสองวิธี:

1 วิธี การผูก DLL กับโปรแกรม

วิธีที่ง่ายที่สุดและง่ายที่สุดในการค้นหาฟังก์ชันที่นำเข้าจาก DLL อย่างไรก็ตาม (เพื่อความระมัดระวัง) วิธีนี้อาจจะดูคลุมเครือมากกว่า เช่น ไลบรารี่ เหมือนโปรแกรมวิซาร์ด ถ้าไม่พบ โปรแกรมก็ไม่เริ่มทำงาน เห็นการให้อภัย และเตือนเกี่ยวกับทรัพยากร DLL ไม่พบ และค้นหาไลบรารีเพื่อทราบ: สำหรับการสตรีมแคตตาล็อก สำหรับแคตตาล็อกซอฟต์แวร์ สำหรับแคตตาล็อก WINDOWS\SYSTEM ฯลฯ Otzhe สำหรับซัง - รูปแบบที่ฉันจะยอมรับ:


FunctionName (หรือ ProcedureName) - ชื่อของฟังก์ชัน (หรือขั้นตอน) ตามที่จะแสดงในโปรแกรมของคุณ Par1, Par2, ... ชื่อของพารามิเตอร์ในฟังก์ชันของโพรซีเดอร์ Par1Type, Par2Type, ... ประเภทของพารามิเตอร์ในฟังก์ชันหรือขั้นตอน (เช่น Integer); ประเภทค่า ReturnType ที่จะหมุน (ฟังก์ชันเท่านั้น); stdcall directive ซึ่งเป็นความผิดของ spіvpadati z vikoristovuvanoy ใน DLL เอง คำสั่ง "DLLNAME.DLL" ภายนอกที่ระบุชื่อของ DLL ที่มีอยู่ ซึ่งในกรณีนี้ฟังก์ชันหรือขั้นตอนจะถูกนำเข้า (ใน ถึงประเภทนี้โดยเฉพาะ- DLLNAME.DLL); ชื่อคำสั่ง "FunctionName" ("ProcedureName") ที่ระบุชื่อที่แน่นอนของฟังก์ชันใน DLL เอง นี่เป็นคำสั่งของ neobov'yazkova เพราะมันช่วยให้คุณชนะฟังก์ชันโปรแกรม ซึ่งฉันสามารถตั้งชื่อได้ เพื่อดูว่ามันเป็นจริง (เหมือนในห้องสมุด) ดัชนี FunctionIndex (ProcedureIndex) คำสั่งที่ระบุหมายเลขลำดับของฟังก์ชันหรือขั้นตอนใน DLL Tse ยังสั่ง neobov'yazkova

นี่เป็นวิธีการพับอย่างหรูหรา เบียร์เอล และสง่างาม สัมปทานกับวิธีแรก สิ่งเดียวที่ยอมรับไม่ได้คือรหัสที่จำเป็นสำหรับการนำการยอมรับนี้ไปใช้ และความซับซ้อนของข้อเท็จจริงที่ว่าฟังก์ชันที่นำเข้าจาก DLL จะพร้อมใช้งานก็ต่อเมื่อ DLL ถูกจับและอยู่ในหน่วยความจำ ... ดังนั้น ไกล - คำอธิบายสั้น wicking cims โดยใช้วิธีฟังก์ชัน WinAPI:

LoadLibrary(LibFileName: PChar) ดึงไลบรารี LibFileName ที่ระบุจากหน่วยความจำ เมื่อเสร็จสิ้นสำเร็จ ฟังก์ชันจะหมุนหมายเลขอ้างอิง (THandle) DLL ไปยังหน่วยความจำ GetProcAddress(Module: THandle; ProcName: PChar) อ่านที่อยู่ของฟังก์ชันไลบรารีที่ส่งออก เมื่อเสร็จสิ้นสำเร็จ ฟังก์ชันจะเปลี่ยนหมายเลขอ้างอิง (TFarProc) ของฟังก์ชันให้เป็น DLL ที่จับได้ FreeLibrary(LibModule: THandle) เพื่อทำงานกับ Undead LibModule และอย่าลืมจำไว้ ขั้นตอนต่อไปคือการระบุว่าหลังจากการเรียกไปยังขั้นตอนการทำงานของไลบรารีจะไม่สามารถใช้งานได้อีกต่อไป

ฝึกก้นนั้น

ถึงเวลาแล้วที่จะนำเสนอตัวอย่างวิธีการและแนวทางปฏิบัติที่ดีที่สุดสองสามตัวอย่าง:

ตัวอย่างที่ 1 การผูก DLL กับโปรแกรม


ตอนนี้เหมือนกัน แต่ในวิธีที่แตกต่าง - ด้วยความสนใจแบบไดนามิก:


บันทึก:

เลื่อนให้ตรงกับประเภทสตริงในฟังก์ชันไลบรารีเพราะ เมื่อโยคะvikoristannііsnuyutปัญหา z "หน่วยความจำrozpodіl" คุณสามารถอ่านรายงานเกี่ยวกับเรื่องนี้ (จริง ภาษาอังกฤษ) ในข้อความว่างของโครงการ DLL ที่ Delphi กำลังสร้าง (ไฟล์ -> ใหม่ -> DLL) ดังนั้นคุณจึงสามารถแปลง PChar ได้อย่างรวดเร็ว จากนั้นหากจำเป็น ให้แปลงเป็นฟังก์ชันสตริง StrPas

ทีนี้มาดูไลบรารี DLL กัน:

กรณีที่ 3 อ้างอิงถึงโครงการ MYDLL.DPR


ตำแหน่งในทรัพยากรและแบบฟอร์ม DLL

DLL สามารถวางเป็นฟังก์ชันและเคอร์เซอร์ ตัวเล็ก ไอคอน เมนู บรรทัดข้อความ เราจะไม่บ่นในสิ่งที่เป็นเรา ฉันค่อนข้างจะเคารพว่าทรัพยากรจำเป็นต้องจับ DLL, buv, ลบ descriptor, - จับทรัพยากรด้วยฟังก์ชันที่คล้ายกัน (LoadIcon, LoadCursor เป็นต้น) สำหรับผู้ที่ได้แจกจ่ายตำแหน่งในไลบรารี DLL ของโปรแกรม vicon มากกว่าเล็กน้อย (แบบฟอร์มเหล่านี้อยู่ใน Delphi)

สำหรับผู้ที่คุณต้องการสร้าง DLL ใหม่และเพิ่มแบบฟอร์มใหม่เข้าไป (ไฟล์ -> ใหม่ -> DLL จากนั้น - ไฟล์ -> แบบฟอร์มใหม่) Dalіเช่นเดียวกับแบบฟอร์มคือหน้าต่างโต้ตอบ (รูปแบบโมดอล (bsDialog)) จากนั้นเพิ่มลงใน DLL มาทำหน้าที่(สมมติว่าแบบฟอร์มเรียกว่า Form1 คลาสนั้นคือ TForm1):

ตัวอย่างที่ 4 การวางแบบฟอร์มที่ DLL


ในการเพิ่มรูปแบบที่ไม่ใช่โมดอลให้กับ DLL จำเป็นต้องเพิ่มสองฟังก์ชัน - แบบฟอร์มเปิดและปิด เมื่อใดก็ตามที่คุณต้องการเปลี่ยน DLL ให้จำหมายเลขอ้างอิงของแบบฟอร์ม

การสร้างปลั๊กอิน

ที่นี่เราดูรายละเอียดปลั๊กอินเพราะ การชี้ให้เห็นจะช่วยให้คุณนำทางไปยังด้านซ้ายของการเขียนโปรแกรม DLL ได้อย่างง่ายดาย ฉันเดาว่าปลั๊กอินเป็นส่วนเสริมของโปรแกรมที่ขยายขีดความสามารถ ในกรณีนี้ ตัวโปรแกรมเองสามารถ obov'yazkovo โอนการมีอยู่ของส่วนเพิ่มเติมดังกล่าว และอนุญาตให้ vikonuvat คำสารภาพของพวกเขา

Tobto ตัวอย่างเช่นเพื่อสร้างปลั๊กอินก่อน ตัวแก้ไขกราฟิกเมื่อคุณแปลงรูปภาพแล้ว คุณต้องโอนอย่างน้อยสองฟังก์ชันในปลั๊กอิน (แน่นอนว่าเป็นการเรียกใช้ฟังก์ชันในโปรแกรม) ซึ่งเป็นฟังก์ชันที่เปลี่ยนปลั๊กอิน b im'ya (ประเภท i/หรือ io) เพื่อเพิ่ม ปลั๊กอินนี้ไปที่เมนู (หรือในแถบเครื่องมือ) plus ฟังก์ชั่นหลัก- การส่งและรับภาพ ทูบโต โปรแกรมค้นหาปลั๊กอินตั้งแต่เริ่มต้น จากนั้นพบสกินที่เราคลิกบนฟังก์ชันจากชื่อของชื่อ (เช่น GetPluginName) และเพิ่มรายการที่ต้องการในเมนู จากนั้นโดยเร็วที่สุด โดยการเลือกรายการนี้ - เรียกใช้ฟังก์ชันอื่นราวกับว่าส่งไฟล์อินพุต I, ภาพ scho tse) และฟังก์ชั่นนี้แก้ไขภาพและหมุนในรูปลักษณ์ใหม่ด้วยวิธีของตัวเอง (มิฉะนั้นจะเป็นไฟล์ที่มี ภาพใหม่) Axis และแก่นแท้ทั้งหมดของปลั๊กอิน...

Epilog

ในบทความนี้ จะแสดงประเด็นหลักของการเลือกไลบรารี DLL จาก Borland Delphi หากคุณมีอาหาร - ส่งมาให้ฉันทาง E-mail:

ตรงกลาง การเขียนโปรแกรม Delphiถ่ายโอนไปยังการสร้างไลบรารี DLL ของสวีเดน

มาสร้างห้องสมุดร้องเพลงล้างแค้นกันเถอะ

GetArea(a, b, c: REAL): จริง

สำหรับวัตถุประสงค์ของการทำงานนั้น tricoutnik ทั้งสองด้านจะถูกเสิร์ฟที่ทางเข้า ฟังก์ชั่นหมุนพื้นที่ของ tricot ที่กำหนด:

พี:=(a+b+c)/2;

ผลลัพธ์:=SQRT(p*(p-a)*(p-b)*(p-c))

เริ่มDเอลฟีแต่ระยะทางไม่ธรรมดา เลือกรายการเมนู Fileนู๋ewอู๋นั้น, ที่vіknі, scho vіdkrylos, บนบุ๊คมาร์ค Newคลิกที่ไอคอน DLL Wizard. (อัลกอริธึมในการฝากเงินในเวอร์ชัน)

ผู้สร้างไฟล์การเตรียมไลบรารี DLL Vіnนั้นคล้ายกับโมดูลที่ยิ่งใหญ่ที่สุดอยู่แล้ว (หน่วย) ดเอลฟี, ขึ้นอยู่กับตัวดำเนินการเท่านั้นห้องสมุด. บันทึกโครงการเพื่อประโยชน์ของมันในอนาคตเราจะใช้ไลบรารี DLL สมมติว่าได้รับ. ชื่อGetAreaมันเป็นไปไม่ได้ที่จะชนะ - มันถูกครอบครองโดยหน้าที่ของพวกเขาแล้ว

ตอนนี้หลังจากโอเปอเรเตอร์ใช้เราเขียนข้อความของฟังก์ชันของเรา แต่มีการเปลี่ยนแปลงในชื่อ:

ฟังก์ชัน GetArea(a, b, c:REAL):REAL;ส่งออก;

คีย์เวิร์ด EXPORT ระบุว่าฟังก์ชันนี้ถูกเอ็กซ์พอร์ตและจะมองเห็นได้จากโปรแกรมที่มีอยู่

หลังจากกำหนดข้อความของฟังก์ชันแล้ว

GetArea;

ในคำสั่ง EXPORTS ขั้นตอนและฟังก์ชันทั้งหมดที่ส่งออกจากไลบรารีจะถูกแลก นี่คือแคตตาล็อกประเภทหนึ่งของห้องสมุดของเรา

เป็นไปไม่ได้ที่จะเปิดตัวไลบรารี่บน vikonannya เนื่องจากคุณสามารถคอมไพล์ได้เท่านั้น เราสามารถเลือกรายการเมนู Project → Build เมื่อทุกอย่างถูกสร้างขึ้นอย่างถูกต้อง ไฟล์ชื่อ geta.dll จะถูกสร้างขึ้นบนดิสก์ไดเร็กทอรีสตรีมมิ่ง ห้องสมุด Tse i

ขอแสดงความนับถือหมายเหตุ: ความละเอียดอ่อนที่เป็นประโยชน์เมื่อส่งขั้นตอนและฟังก์ชันที่อยู่ในไลบรารี พารามิเตอร์ของประเภท STRING

เพื่อให้สามารถส่งผ่านพารามิเตอร์ไปยังประเภท STRING ในคำสั่ง USES และไลบรารี และโปรแกรมที่เรียกใช้ ให้เขียนการเชื่อมต่อของโมดูล ShareMem ลากภาษาเพื่อให้โมดูลเป็นโมดูลแรกในรายการ ยิ่งไปกว่านั้น คุณสามารถเพิ่มไฟล์ borlndmm.dll จากไลบรารี่ได้ (รวมอยู่ในการนำส่ง Delphi) ง่ายที่จะกำจัดสถานการณ์นี้: ทำตามพารามิเตอร์ของประเภทข้อความเพื่อให้ตรงกับประเภทข้อมูล ShortString (แถวหลักหรือไม่เกิน 255 อักขระ) และ PChar (ตัวบ่งชี้สำหรับแถวข้อความ)

Viklik dll

อธิบายสองวิธีในการเรียกโพรซีเดอร์และฟังก์ชันจาก DLL ประการแรก เราล้าหลังมาก ในขั้นตอนของการพัฒนาโปรแกรม เรารู้ว่าเราจะเชื่อมต่อ DLL กับมัน (ส่วนใหญ่เราสร้างเองและสร้าง DLL) ในอีกทางหนึ่ง เราเชื่อมต่อกับห้องสมุดที่ค่อนข้างใหญ่ รวมทั้ง "ต่างประเทศ"

การโทรแบบคงที่

สำหรับการดำเนินการตามวิธีแรกเรียกว่า การโทรแบบคงที่สร้างโปรแกรมเริ่มต้นใหม่ วางสามช่องป้อนข้อมูล LabeledEdit1…LabeledEdit3 บนแบบฟอร์ม ปุ่ม และองค์ประกอบ Tlabel หลังจากคำสั่ง IMPLEMENTATION ให้เพิ่มบรรทัดเพื่อให้แน่ใจว่ามีการนำเข้าฟังก์ชัน GetArea จากไลบรารี geta.dll:

ฟังก์ชัน GetArea(a, b, c: จริง): REAL; ไกล; ภายนอก "GETA";

คำว่า EXTERNAL ระบุว่าเนื้อหาของฟังก์ชันสามารถพบได้ในไลบรารีและจากชื่อที่กำหนด และคำว่า FAR ระบุที่อยู่ chotiribayte "double" ของ zastosuvannya ซึ่งจำเป็น หน้าจอของโปรแกรมที่เรียกว่า อยู่ด้านเดียวกัน ห้องสมุด - ในภาษาอื่นๆ อย่างที่คุณเห็น ไฟล์ geta.dll จะต้องอยู่ในไดเร็กทอรีเดียวกันกับไฟล์โปรแกรมสตรีมทั้งหมด

ในรูทีนการกดปุ่ม คุณต้องสร้างอาร์เรย์และส่งต่อไปยังฟังก์ชันไลบรารี และแสดงผลบนหน้าจอ:

ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject);

© 2022 androidas.ru - ทั้งหมดเกี่ยวกับ Android