ينقسم إنتاج Dll بشكل عام إلى الخطوات التالية:
1 اكتب إجراءً أو وظيفة في مشروع DLL
2 اكتب كلمة رئيسية للصادرات واكتب اسم الإجراء أسفلها. ليست هناك حاجة لكتابة المعلمات ولاحقات الاتصال.
مرت معلمتين
1 يجب أن يكون نوع المعلمة متوافقًا مع نوع معلمة النافذة C++. لا تستخدم نوع البيانات DELPHI.
2 من الأفضل أن تكون هناك قيمة إرجاع [حتى لو كانت إجراء] للإبلاغ عن نجاح أو فشل المكالمة، أو الحالة. يفضل أن تكون قيمة الإرجاع للنجاح أو الفشل 1 [نجاح] أو 0 [فشل]. باختصار، فهو متوافق مع Windows C++.
3 قم بتعريف اللاحقة باستخدام stdcall.
4 يفضل أن يكون حساسًا لحالة الأحرف.
5 ليست هناك حاجة لاستخدام لاحقة الاتصال البعيد، فهي فقط للتوافق مع برامج Windows 16 بت.
التهيئة والخروج من تنظيف ثلاث مكتبات DLL [إذا كانت التهيئة والخروج من التنظيف مطلوبة]
1 DLLPRoc [مؤشر وحدة SysUtils] هو المدخل إلى DLL. هنا يمكنك استبدال إدخاله بوظيفتك. لكن وظيفتك يجب أن تستوفي المتطلبات التالية [في الواقع وظيفة رد اتصال]. على النحو التالي:
الإجراء DllEnterPoint(dwReason: DWord);far;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 (nil) أثناء التهيئة؛
3 تأكد من أن DcomConnection.Connected:= خطأ عند الخروج، وتم إغلاق مجموعة البيانات. وإلا فإن العنوان المبلغ عنه خاطئ.
استخدام أربعة متغيرات عالمية
في برنامج 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);Far;external;
فار
تلميح: ثاندل؛
showform:mypointer;
يبدأ
Hinst:=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
فار
Form1: TForm1؛
ptr:PLongInt;
يبدأ
ptr:=@(Application.MainForm);// احفظ مقبض MainForm الخاص بملف dll أولاً، ليست هناك حاجة لتحريره، فقط استبدله
ptr^:=LongInt(mainForm);// استبدل النموذج الرئيسي لملف DLL بالنموذج الرئيسي لبرنامج الاتصال. MainForm عبارة عن نافذة خاصة تدير موارد النماذج في التطبيق على وجه التحديد.
// لماذا لا يكون Application.MainForm مباشرة:= mainForm، لأن Application.MainForm هو خاصية للقراءة فقط
Form1:=TForm1.Create(mainForm);//إنشاء باستخدام المعلمات
نهاية؛
ملاحظة: المعلمة هي Application.MainForm لبرنامج الاستدعاء
تسعة أمثلة:
كود مصدر DLL:
مشروع المكتبة 2؛
الاستخدامات
سيسوتيلس,
الطبقات،
الحوارات،
النماذج،
Unit2 في 'Unit2.pas' {Form2}؛
{$R *.RES}
فار
CCC:Pchar;
الإجراء OpenForm(mainForm:TForm);stdcall;
فار
Form1: TForm1؛
ptr:PLongInt;
يبدأ
ptr:=@(Application.MainForm);
ptr^:=LongInt(mainForm);
Form1:=TForm1.Create(mainForm);
نهاية؛
الإجراء InputCCC(Text: Pchar);stdcall;
يبدأ
نسخة نصية:= نص؛
نهاية؛
الإجراء ShowCCC;stdcall;
يبدأ
ShowMessage(String(ccc));
نهاية؛
صادرات
نموذج مفتوح؛
الإدخالCCC،
ShowCCC;
يبدأ
نهاية.
رمز مصدر المتصل:
الوحدة 1؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، الفئات، الرسومات، عناصر التحكم، النماذج، مربعات الحوار،
StdCtrls;
يكتب
TForm1 = الفئة (TForm)
Button1: TButton؛
Button2: TButton؛
تحرير 1: تحرير؛
الإجراء Button1Click(Sender: TObject);
الإجراء Button2Click(Sender: TObject);
خاص
{تصريحات خاصة}
عام
{التصريحات العامة}
نهاية؛
فار
Form1: TForm1؛
تطبيق
{$R *.DFM}
الإجراء OpenForm(mainForm:TForm);stdcall;External'project2.dll';
إجراء ShowCCC;stdcall;External'project2.dll';
الإجراء InputCCC(Text: Pchar);stdcall;External'project2.dll';
الإجراء TForm1.Button1Click(Sender: TObject);
فار
النص: بشار؛
يبدأ
نص := Pchar(Edit1.Text);
// OpenForm(Application.MainForm);//من أجل ضبط MDICHILD
InputCCC(Text);// من أجل تجربة ما إذا كانت المتغيرات العامة في DLL مشتركة بين التطبيقات المختلفة
نهاية؛
الإجراء TForm1.Button2Click(Sender: TObject);
يبدأ
ShowCCC;// يوضح هذا أن المتغيرات العامة في مكتبة الارتباط الحيوي (DLL) لتطبيق WINDOWS 32 بت موجودة أيضًا في مساحة عنوان التطبيق. قد يكون التطبيق 16 بت مختلفًا، ولم يتم إجراء أي تجارب.
نهاية؛