الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعلم استخدام مكتبات الربط الديناميكية DLL

مغلق
بدأه أبو ديلفي في 29 يناير 2003 · 7 رد · 1,279 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مكتبات الربط الديناميكية

dll

........................

مكتبات الربط الديناميكية هي موارد منفصلة ومستقلة ... يمكن استخدامها في أي لغة برمجة , وعادة ما تستخدم لتزويد برامجنا التنفيذية بالتوابع والإجراءات التي نكتبها بها .وما قصدتة بعبارة أنها موارد مستقلة يعني أن المكتبات التي نصممها باستخدام ديلفي يمكن استخدامها في أي لغة برمجة أخرى c++ مثلا وبالعكس كذلك .

فنقوم مثلا بكتابة مكتبة ربط تحتوي على جميع التوابع الرياضية : كتابع التربيع و تابع

الجذر و .. و .... الخ ثم نستخدمها في برامجنا المختلفة

لن أتكلم عن فوائد هذة المكتبات وفوائد فصل الإجرائيات عن البرنامج الأساسي وسوف اتكلم بإيجاز عن كيفية بنائها واستدعائها من ديلفي . وأتمنا من باقي الأخوة أن يساهمو في إفادتنا بما يعرفون عن هذا الموضوع.

1- انشاء مكتبة ربط ديناميكية :

file -> new -> other -> dllwizard .

:سوف ترى الوحدة بالشكل

...........................................................................

library Project2;

uses

SysUtils,

Classes;

{$R *.res}

begin

end.

.................................................................................

تقوم باضافة الوحدات التي سوف تستخدمها في برنامجك ثم تجري بعض التعديلات والإضافات وهي :

1- احذف عبارة begin في اخر الشفرة . وابدأ بدلا عن ذلك بكتابة التوابع والإجراءات من هذة النقطة كما في البرنامج العادي تماما,

2- بعد الانتهاء من كتابة التوابع أضف العبارة exports بمعنى تصدير وأضف بعدها اسماء التوابع والاجراءات التي تريد أن تراها البرامج الأخرى .. أي التي سوف نستخدمها في برنامجنا وبشكل مبدأي سوف نضيف أسماء كل التوابع التي كتبناها . والمهم أننا نضيف اسم التابع فقط ولا نضيف أي كلمة اخرى . كما هو موضح بالمثال التالي :

.................................................................................

library dllfile;

uses

SysUtils,dialogs, // استخدمنا الوحدة

Classes; //dialogs

// من أجل التابع

//showmessage

{$R *.res}

procedure hello; // نكتب الإجراءات والتوابع التي نريدها مثل العادة .

begin

showmessage('hello world . . . ');

end;

exports

hello ; // لاحظ اننا لم نضع الا اسم التابع

end.

....................................................................................

ثم من

Project -> compile

Project -> build

<><><><><><><><><><><><><><><><>

2- استدعاء المكتبة من البرنامج

نستطيع ببساطة استدعاء توابع المكتبة التي صنعناها في أي مكان من الشفرة ولكن علينا أولا التصريح أن هذة التوابع موجودة في ملف خارجي هو مكتبة الربط الديناميكية بالشكل التالي :

...................................................................................

implementation

{$R *.dfm}

procedure hello ; external 'dllfile.dll'; // نضيف التعريف عن رأس التابع

procedure TForm1.Button1Click(Sender: TObject);

begin

hello;

end;

end.

.................................................................................

حيث قمنا باستدعاء التابع hello أثناء الضغط على الزر بعد أن عرفنا أن التابع موجود في الملف dllfile وذلك باستخدام الكلمة المحجوزة external

الملف المرفق بحجم 211 كيلو بايت

مضغوط باستخدام وين زيب

يحوي الأمثلة مع الشفرة للمكتبة و الملف .

dll.zip

#2

#-

شكرا على هذا الشرح الجيد (f)

لي ملاحظات بسيطه

اقتباس
1- احذف عبارة begin  في اخر الشفرة

لا داعي لحذف عباره Begin . احيانا ستحتاج لكتابه Library initialization code بعد هذه العباره , راجع Delphi Help .

اقتباس
والمهم أننا نضيف اسم التابع فقط ولا نضيف أي كلمة اخرى

في قسم exports تكتب اسماء التوابع او الدوال متبوعه بقائمه العناصر(parameter list) التابع لها - هذا في حاله وجود overlad للتوابع , ان لم يوجد overload فلا تكتب القائمه- . أضف الى ذلك انه يمكن - شئ اختياري Optional - اضافه عباره name متبوعه بـ string constant ولمعرفه الفائده من هذا راجع Delphi Help . ايضا يمكن اضافه العباره Index متبوعه برقم بين 1 الى 2,147,483,647 راجع Delphi Help .

اقتباس
uses

 SysUtils,dialogs, // استخدمنا الوحدة

 Classes;           //dialogs

                    // من أجل التابع

                    //showmessage

لم تكن هناك اي ضروره لاستخدام SysUtils , Classes .( اعلم ان قصدك وضع مثال فقط لكن لابد من الحرص في هذه الامور ). اضف الى هذا ان استعمال MessageBox افضل من showmessage ( مشكله حجم الملف المتكون 373kb و 9.5kb ).

اقتباس
procedure hello ; external 'dllfile.dll';       // نضيف التعريف عن رأس التابع

هذه الطريقه تدعى Static loading هناك طريقه اخرى Dynamic Loading باستخدام التابعين LoadLibrary و GetProcAddress , الطريقه مشروحه في Delphi Help .

+++++

لاحظت وجود موضوع يطالب فيه بشرح عن مكتبات DLL واستغربت لهذا فهناك معلومات كثيره في Delphi Help عن كيفيه التعامل مع dll , أضف الى ذلك ان الكثير من الكتب تشرح ذلك منها على سبيل المثال Mastering Delphi .

في Delphi Help :

Contents بعد ذلك Object Pascal Reference ثم Libraries and Packages .

-#

#3

صديقي العزيز hurricane عليك سلام الله وبركاتة

شكرا لك على إفاداتك الجيدة وشكرا على محاولتك المشاركة والنقاش .

بالنسبة لملاحظاتك كلها على الراس والعين , وكلها جيدة وممتازة... وأنا انوة أني شرحت أبسط أنواع الأمثلة وكما هو واضح أردت تبيان سهولة الموضوع بالدرجة الاولى ,فاستخدمت أبسط مثال رأيتة في بعض المواقع الشهيرة على الانترنت بعد أن اضفت لة بعض التعليقات.. وكان بامكاني اختيار الأصعب . على كل إذا لم يعجبك المثال بإمكانك أن تشترك بمثال تراة أكثر مناسبة .

صديقي العزيز : بالطبع لن توضع begin في الشفرة إذا كنا لن نستخدمها في بعض الحالات ؟؟ ! .

وكذلك يتبع اسم التابع بالمتغيرات اللازمة طبعا ....

وإذا حذفنا الوحدتين classes ,sysunit الموجودتين تلقائيا في الشفرة سيكون أفضل .

ولكن يا صديقي الهدف من هذا المنتدى هو الإفادة ,, ولها شروط عديدة لتتحقق , وهذا المثال موجة للذين لا يملكون اضطلاع أولي على الموضوع بعد . صدقني لست مقتنعا بطريقتك بالتعليم بشكل كامل . فلا أظن أنة من الحكمة زج أكبر كمية من المعلومات في أول مثال ومن أول مرة ,

وليس الغرض عرض العضلات ,,,عذرا ,,,

ولا ان نقدم مرجعية علمية دقيقة وكاملة عن الموضوع "على الأقل في البداية " .إنما أردت أن ابسط خطوات العمل في هذا المثال قدر المستطاع بحيث نساعد الاخوة المهتمين بالموضوع بطريقة سهلة ويسيرة بالقليل الذي نملكة . محاولا أن اقلد بذلك ما بدأة الاخوة sum و madi و الأخ المشرف بحيث نبدأ على الطريق ويستطيع كل واحد أن يطور نفسة شيئا فشيئا .

بالنسبة للاضطلاع على ملفات المساعدة المرفقة مع ديلفي صدقني لم تأتي بجديد يا صديقي .

أما عن استغرابك لطرح موضوع مكتبات ال DLL وهو برأيي موضوع جيد فأظن أنك تستغرب إذا كل المنتدى ومعظم المناقشات الموضوعة فية .....؟ ليش .

ولكن على كل حال كلامك صحيح مئة بالمئة , وأقول أنك قدمت الفائدة والمعرفة بلا شك ولواختلفت معك في وجهات النظر.

شكرا لك أخي مجددا , أتمنى أن لا يكون كلامي ذو وقع ثقيل عليك , ولكن لي ثقة برحابة صدرك فأنت بلا شك , لم تتعلم كل ذلك دفعة واحدة . وأتمنى أن تستمر بمساعدتنا وتوجيهنا , وكما طلبت ذلك مسبقا فأنا اعيدة أتمنى منك ومن كل الاخوة الذين يعرفون حول هذا الموضوع أن يقدموا الإفادة والدعم لي وللاخوة .

شكرا وسلام

#4

#-

يبدو انه حدث سوء تفاهم(f)(f)(f)

لم اقصد زج المعلومات كلها مره واحده فهذا شئ خاطئ كما تفضلت .

لكن هناك بعض أمور لا يجب اغفالها وكان من الافضل الاشاره الى ان هناك حالات اخرى سيتم شرحها لاحقا -حتى لا يظن القارئ انه لا توجد حالات اخرى-.

بالنسبه للمثال , فلم اقل بانه سئ , هو فعلا جيد لكن كانت النقطه التي نبهت اليها هي ان استعمال MessageBox أفضل من ShowMessage ذلك انه باستعمال الاولى فقط سنضيف windows الى uses اما باستخدام الثانيه فسنضيف dialogs التي بدورها تستخدم العديد من delphi units (جرب الطريقتين ولاحظ الفرق في حجم الملف المتكون ). سبب ذكري لهذه النقطه ايضا هو التنبيه لمحاوله استخدام قدر أقل من delphi units في مكتبه dll , فحجم المكتبه مهم جدا .( اتمنى ان تكون وجه نظري وصلت).

بالنسبه لموضوع مكتبات ال DLL كان الغرض الاساسي من ردي ان بعض الاخوه يسأل احيانا قبل ان يقرأ delphi help بل يسأل دون ان يكون لديه كتاب ( الكتب الالكترونيه تملأ الانترنت ). أقصد انه لو تم الاطلاع على Writing dynamically loadable libraries الموجود في delphi help سيتم أخذ فكره بسيطه عن مكتبات dll وان كان الشرح غير واضح يمكن الاطلاع على كتاب ما مثل Mastering Delphi ( في موضوع مثبت فيه وصله لتحميل e-book ) -الكتاب خير صديق - , و ان وجدت صعوبه فالسؤال في المنتدى سيوضح الموضوع اكثر .

أتمنى ان وجه نظري وصلت بشكل سليم واعتذر ان كان ردي سبب لك ضيق .

وهذه لك (f)

-#

#5

السلام عليكم....طولوا ...بالكم....ياشباب....:mad::mad:

أظن ..انكم ..على معرفة ..بالمكاتب الدينامكية........;)

وأظـــن ...أن كل من شاهد ..التصويت .....في المنتدى عن موضوع الدورة

لم يصوت ..لانه لايعرف ...بل لكي يعرف ..جميعنا...:o:o

أختلفتما ..على showmessage...و ...messagebox...:mad::mad:

فأتركــوا الأمــور ...للأساتذة .....(gift)(f)(f)

أعرف جيدا ..أنكما ..نحاولان المساعدة...مشكورين;) ..من المشرفين

المنتدى ...نيابة عنهم ..((أختبارات وما غيره)).:P...ومني ..ومن كل زائر

الهدف ...هو الحصول على المعلومة ..الأدق...بالوقت المناسب...

وبالطريقة المثالية......:eek::eek:

أرجــــــو ..أن تكون وصلت الفكرة ...وأتمنى ..المشاركة الفعالة...بالدورة

القادمة,,,,بالأسئلة ...الصعبة ,,في الموضوع ذاته.......(clock)(clock)

أخـــــــــــــوكم....:cool::cool:

#6

#-

اعتذر من الجميع ان كان في ردي شئ ضايقكم . لم أقصد عرض العضلات او المعلميه كما اسميتمونها . كنت فقط اود التنبيه الى اللجوء الى الكتاب كمرجع اول وأساسي , لكن يبدو اني لم استطع توصيل مقصدي بشكل سليم .

اقتباس
أختلفتما ..على showmessage...و ...messagebox...

اخي العزيز لم يكن خلافا :) , أشرت الى الفرق في ردي وأوضحت وجه نظري .

كنت في ردي مراعيا روح النقاش ولم اكن اقصد شيئا اخر .على العموم ان كان النقاش غير مسموح به فاعتذر .

-#

#7

كلامك صحيح مئة بالمئة أيها الأخ القدير hurrican

فالموضوع ليس بهذا الشكل ... وتبادل وجهات النظر ليس حراما .

شكرا لك على توضيح مرادك , والله انك تتكلم الصواب , وكنت محقا في ملاحظاتك .

وكل ما أريدة اعتبار مشاركتي السابقة عبارة عن أبسط (وأسرع ) مثال ممكن , وأسهل طريقة لمبتدء لبناء مكتبة بسيطة .

دعونا نعود الى موضوع ال DLL بمشاركتكم بامثلة و شروحات متقدمة . تفيدوني و الأخوة بها ....

#8

الله يديم الوفاق والمحبة بين جميع الأخوة(f)

لنصل إلى المستوى المطلوب إن شاء الله

وشكرا للجميع

هذا الموضوع مغلق.

مواضيع مشابهة