مكتبة الارتباط الديناميكي عبارة عن مجموعة من الإجراءات والوظائف التي يمكن استدعاؤها بواسطة التطبيقات ومكتبات DLL الأخرى، وتحتوي على تعليمات برمجية أو موارد عامة. نظرًا لأن كود DLL يستخدم تقنية مشاركة الذاكرة، فإن Windows يمنح DLL أيضًا بعض الأذونات الأعلى في بعض الأماكن، بحيث يمكن لـ DLL تنفيذ بعض الوظائف التي لا يمكن تحقيقها بواسطة البرامج العادية، مثل تنفيذ Windows HOOK، وISAPI، وما إلى ذلك. وفي الوقت نفسه، يوفر DLL أيضًا طريقة ملائمة لمشاركة التعليمات البرمجية بين اللغات المختلفة. لذلك، يتم استخدام DLL على نطاق واسع في البرمجة. ستقدم هذه المقالة كيفية إنشاء DLL واستخدامها في دلفي.
واحد. آلية مشاركة ذاكرة مكتبة DLL
من وجهة نظر الاستخدام، فإن DLL والوحدة متشابهان جدًا ويمكن استدعاؤهما بواسطة وحدات المشروع الأخرى، ولكن هناك اختلافات في آليات التنفيذ الداخلية الخاصة بهما. إذا كانت وحدة البرنامج تستخدم عبارة استخدامات للإشارة إلى وحدة ما، فعندما يقوم المترجم بتجميع الوحدة، فإنه سيقوم بتجميعها مع الوحدة وربط التعليمات البرمجية القابلة للتنفيذ المترجمة بوحدة البرنامج، وهذه هي الطريقة التي يمكن بها لوحدة البرنامج تحديد سبب الاستدعاء الإجراءات والوظائف في الوحدة المشار إليها. عندما تتم الإشارة إلى نفس الوحدة من خلال مشاريع متعددة، يحتوي كل مشروع على الكود القابل للتنفيذ للوحدة. عند تنفيذ مشاريع متعددة تحتوي على الوحدة في نفس الوقت، سيتم تحديث الكود القابل للتنفيذ للوحدة عدة مرات مع نقل مشاريع مختلفة في الذاكرة، مما تسبب في إهدار موارد الذاكرة. DLL مختلف، حتى لو تم استدعاؤه بواسطة مشروع معين، فإنه لا يزال مستقلاً بعد التجميع، أي بعد التجميع، تشكل مكتبة DLL ملفًا منفصلاً قابلاً للتنفيذ ولا يرتبط بأي ملف قابل للتنفيذ آخر مكتبة DLL ليست تابعة لمشروع معين. عندما تستدعي مشاريع متعددة نفس مكتبة DLL، يقوم المشروع الأول فقط بنقل مكتبة DLL إلى الذاكرة. لا تقوم المشاريع الأخرى بنقل نفس مكتبة DLL إلى الذاكرة بشكل متكرر، ولكن يتم قراءتها من الذاكرة نفس منطقة الذاكرة المشتركة. علاوة على ذلك، يتم نقل كود تنفيذ DLL ديناميكيًا أثناء تشغيل البرنامج، بدلاً من نقله إلى الذاكرة مع المشروع بأكمله عند تشغيل البرنامج. يمكن أن يؤدي ذلك إلى التخلص من العيوب التي تسببها الوحدة حيث يشغل نفس الرمز الذاكرة في أماكن متعددة.
2. إنشاء مكتبة DLL في دلفي
في بيئة دلفي، لا تختلف كتابة ملف DLL كثيرًا عن كتابة تطبيق عام. في الواقع، كتابة DLL تعمل باعتبارها الجسم الرئيسي لـ DLL ولا تتطلب أي وسائل خاصة أخرى باستثناء الاختلافات في الذاكرة وإدارة الموارد.
تنسيق ملفات المشروع العامة هو:
عنوان مشروع البرنامج؛
جملة الاستخدامات؛
هيئة البرنامج
تنسيق ملفات مشروع DLLs هو:
عنوان مشروع المكتبة؛
جملة الاستخدامات؛
شرط الصادرات؛
هيئة البرنامج
هناك نوعان من الاختلافات الرئيسية بينهما:
1. بشكل عام، يستخدم رأس ملفات المشروع الكلمة الأساسية للبرنامج، بينما يستخدم رأس ملفات مشروع DLL الكلمة الأساسية للمكتبة. تخبر الكلمات الرئيسية المختلفة المترجم بإنشاء ملفات قابلة للتنفيذ مختلفة. يتم استخدام الكلمة الأساسية للبرنامج لإنشاء ملف .exe، ويتم استخدام الكلمة الأساسية للمكتبة لإنشاء ملف .dll؛
2. إذا أراد DLL تصدير وظائف أو إجراءات لاستخدامها بواسطة تطبيقات أخرى، فيجب إدراج هذه الوظائف أو الإجراءات في بند التصدير. يجب تجميع هذه الوظائف أو الإجراءات نفسها باستخدام توجيه تجميع التصدير.
حدد العنصر الجديد... في ملف قائمة دلفي الرئيسية، وانقر نقرًا مزدوجًا فوق أيقونة DLL في النافذة المنبثقة، وسيتم توفير إطار عمل وحدة مصدر DLL تلقائيًا، كما يلي:
Libraryproject1;
{...تعليق...}
الاستخدامات
سيسوتيلس،فئات؛
يبدأ
نهاية.
بعد ذلك، يمكنك إضافة تعريفات الإجراءات والوظائف التي تريد تنفيذها في مكتبة الارتباط الحيوي (DLL) بين الاستخدامات والبدء، واستخدام التصدير والتصدير لتصديرها حتى تتمكن الوحدات الأخرى من الرجوع إليها. أضف رمز التهيئة بين رمز البداية والنهاية يستخدم لتهيئة متغيرات DLL. تجدر الإشارة إلى أنه حتى في حالة عدم وجود رمز التهيئة، لا يمكن حذف البداية والنهاية، كما في المثال التالي:
Libraryminmax;
functionMin(X,Y:Integer):Integer;export;
يبدأ
ifX<YthenMin:=XelseMin:=Y;
نهاية؛
functionMax(X,Y:Integer):Integer;export;
يبدأ
ifX>YthenMax:=XelseMax:=Y;
نهاية؛
صادرات
مينيندكس1،
ماكسيندكس2؛
يبدأ
نهاية.
بعد التجميع والحفظ بتنسيق minmax.DLL، يتم إنشاء ملف مكتبة DLL.
الوصول إلى ثلاث مكتبات DLL
هناك طريقتان للوصول إلى مكتبة DLL، إحداهما مرجع ثابت والأخرى مرجع ديناميكي.
يتطلب تحميل DLL باستخدام أسلوب مرجعي ثابت شيئين: إنشاء وحدة إدخال لمكتبة DLL، واستخدام USES لتوصيل وحدة الإدخال بوحدة البرنامج التي تستخدم وظائف DLL. الفرق الوحيد بين وحدة الإدخال التي تم إنشاؤها لمكتبة DLL والوحدة العادية هو أن الإجراءات والوظائف المعلنة في واجهتها لا تعطي رمز التنفيذ الحقيقي في جزء التنفيذ الخاص بها، وبدلاً من ذلك، يتم استخدام الكلمة الأساسية الخارجية للإعلان عن الإجراءات و يتم تفويض تفاصيل التنفيذ إلى وحدات DLL الخارجية.
بناء جملة استخدام الأمر الخارجي كما يلي:
الإجراء/الوظيفة الإجراء/اسم الوظيفة الخارجية؛
فيما يلي الملف المصدر لوحدة الإدخال testdll.pas المكتوب لمكتبة minmax.DLL التي تم إنشاؤها أعلاه، ومن خلاله يمكننا رؤية بعض الاختلافات بين وحدة الإدخال والوحدة العامة، كما يلي:
Unittestdll;
واجهة
الاستخدامات
functionMin(X,Y:Integer):Integer;
functionMax(X,Y:Integer):Integer;
تطبيق
functionMin;external'minmax.DLL';
functionMax;external'minmax.DLL';
نهاية.
إذا أراد أحد التطبيقات استدعاء وظيفة في minmax.DLL، فهو يحتاج فقط إلى إضافة وحدة testdll إلى بيان الاستخدامات الخاص به.
يتطلب تحميل DLL ديناميكيًا ثلاث وظائف API لنظام التشغيل Windows. مكتبة التحميل والمكتبة المجانية وGetprocAddress. يتم استخدام وظيفة Loadlibrary لتحميل مكتبة DLL ويكون تنسيق الاتصال الخاص بها كما يلي:
functionloadlobrary(DLLfileName:Pchar):المعالج:
عندما لا تكون هناك حاجة إلى مكتبة DLL، يجب استدعاء وظيفة FreeLibrary لتحريرها لتحرير موارد الذاكرة القيمة، ويكون تنسيق الاستدعاء كما يلي:
الإجراءFreeLibrary(Libmodule:Thandle)
Libmodule هو مؤشر مكتبة DLL الذي تم الحصول عليه عن طريق استدعاء LoadLibrary. في مقطع البرنامج بين تحميل مكتبة DLL باستخدام وظيفة Loadlobrary واستدعاء FreeLibrary لتحرير مكتبة DLL، يمكنك استخدام الإجراءات والوظائف في مكتبة DLL. طريقة الاستخدام المحددة هي: استخدم وظيفة GetprocAddress للحصول على عنوان الدالة الموجودة في مكتبة DLL. قم بتمريرها إلى متغير دالة في البرنامج، ثم استخدم المتغير لاستدعاء الدالة DLL. يتم تعريف الدالة GetprocAddress على النحو التالي،
وظيفةGetprocAddress(Libmodule:Thandle:procname:pchar):TFarProc:
كما هو موضح في المثال التالي:
يكتب
TTimeRec=سجل
الثاني: عدد صحيح؛
الدقيقة: عدد صحيح؛
الساعة: عدد صحيح؛
نهاية؛
TGetTime=procedure(varTime:TTimeRec);
Thandle=Integer;
فار
الوقت: TTimeRec؛
المقبض: المقبض؛
GetTime:TGetTime;
...
يبدأ
Handle:=LoadLibrary('DATETIME.DLL');
ifHandle<>0ثم
يبدأ
@GetTime:=GetProcAddress(Handle,'GetTime');
if@GetTime<>nilthen
يبدأ
GetTime(Time);
com.withTimedo
WriteLn('Thetimeis',Hour,':',Minute,':',Second);
نهاية؛
FreeLibrary(Handle);
نهاية؛
نهاية؛
عند استدعاء مكتبة الارتباط الديناميكي، يجب ملاحظة أن مكتبة الارتباط الديناميكي المطلوبة يجب أن تكون في نفس دليل التطبيق أو في دليل WindowsSystem.
تعد مكتبات الارتباط الديناميكي طريقة مهمة لتنظيم البرامج ضمن Windows. يمكن أن يؤدي استخدام مكتبات الارتباط الديناميكي إلى حماية العمل الذي يقوم به المستخدمون بشكل كبير في أدوات التطوير المختلفة والفترات المختلفة وتحسين كفاءة البرمجة.