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

سلسلة بوليسية شيقة حول DLL, لا تتردد بالدخول

مغلق
بدأه Wael Dalloul في 10 نوفمبر 2006 · 41 رد · 13,243 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

مقدمة:

في هذه السلسلة البوليسية :D التي تعرض على شاشة العرب تيم, سوف يتم استعراض كل الامور التي تخص او لها علاقة من قريب او من بعيد بشيئ اسمه DLL, اذا كنت لم تتعرض لهذا المفهوم من قبل, او سمعت به و لكن لا تعرف كثيرا عنه ابقى معنا فهناك الكثير الكثير لتتعلمه و تستفيد منه و لكنه هناك امور متقدمة بعض الشيئ يمكنك تجاهلها الان, و إن كنت تعاملت به من قبل و تعرف عنه بعض المعلومات ابقى معنا فهناك الكثير من المفاهيم الجديدة سوف تمر عليك و تستفيد منها بشكل كبير, و إن كنت خبير في التعامل مع DLL ايضا ابقى معنا لتراجع معلوماتك و لتفيدنا بنقاشك القيّم.

لمن هذا السلسلة:

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

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

جميع الامثلة التي سوف يتم طرحها في هذه السلسلة سوف تكون بلغة دلفي, وذلك لانه ليس لدي الوقت لعملها بلغات اخرى فذلك يشق علي, و لكن اذا كان هناك متطوع يقوم بكتابة الامثلة بلغة C++ فارحب به و اشكره.

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

المراجع التي سوف يتم الاعتماد عليها في تقديم هذه السلسلة:

كتاب

Delphi 5 Developer’s Guide by Xavier Pacheco and Steve Teixeira

و هو كتاب رائع جدا متقدم قليلا

كتاب Inside Delphi 2006 و هو كتاب مبتدأ قليلا و بسيط جدا

كتاب Mastering Delphi 7 و هو كتاب غني عن التعريف

بعض المقالات من الانترنت, و القليل من المعلومات من خادمكم تكونت لدي كخبرة.

ملاحظات هامة لي لكل من يقرأ هذا الموضوع:

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

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

امل في لهذه السلسلة ان تنجح و ان تحصل ارباح هائلة في المبيعات و هي ان تدعوا لي في ظهر الغيب فقط و ليس هنا, فهنا ليس هو المكان المخصص لذلك.

يمكنكم اعتبار ما سبق هو شارة للسلسلة البوليسية و سوف نبدأ العمل من الحلقة الاولى ترقبوها بعد قليل اقصد بعد الدعاية :D

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

امل ان يوفقني الله في عملي هذا و يجعل عدد كبير من الناس يستفيدوا منه, فكلما زادوا زاد الاجر و الدعاء و الله ولي الامر و التوفيق.

((اللهم علمنا ما ينفعنا و انفعنا بما علمتنا و زدنا علما يا عليم))

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#2

الحلقة الاولى من السلسلة: ما هي فوائد استخدام ملفات ال DLL او لماذا نستخدم ملفات DLL:

ماذا تعني DLL: هي اختصار لمجموعة الكلمات التالية Dynamic link libraries

لمحة سريعة عن DLL:

هي عبارة عن ملفات مترجمة(Compiled files) شبيهة الى حد بعيد جدا بالملفات التنفيذية و التي تحمل اللاحقة(Exe), ملفات ال DLL يمكن ان تحتوي على Codes او يمكن ان تحتوي على مصادر resources او ممكن ان تحتوي على بيانات Data و قد تجد DLL يحتوي على كل ما سبق ذكره, و لكن الفرق الجوهري بين DLL و Exe هو أنّ ملفات DLL لا يمكن تنفيذها بشكل مباشر و انما يتم استثمارها من قبل تطبيقات اخرى اي ان ملفات DLL ليست مستقلة بحد ذاتها و تحتاج الى تطبيق دائماً للاستفادة منها مع انه تحتوي على اكواد تنفيذية مثلها مثل exe و لكن لا يمكنها ان تعمل بمفردها و يمكنك تخيل ان ملفات DLL هي ملفات مساعدة للتطبيق للقيام بعمله.

الهدف الرئيسي من وجود ملفات DLL هو مشاركة الاكود بين العديد من التطبيقات اي استخدام نفس ال DLL من اكثر من تطبيق سواء بوقت واحد او بشكل منفصل.

إذاً الهدف الرئيسي لها هي انه تشكل مكتبات لتطبيقات اخرى, هل تعلم أنّه حتى لغة البرمجة التي تستخدمها تعتمد على الكثير الكثير من هذه المكتبات

هل تعلم أنّ نظام التشغيل ايضا يعتمد على الكثير الكثير من هذه المكتبات و هي هامة جدا لعمل نظام التشغيل اعرض لكم امثلة من ملفات DLL الهامة و التي يعتمد عليها نظام التشغيل بشكل رئيسي:

kernel32.dll, gdi32.dll, user32.dll, shell32.dll, and comctl32.dll.

هل تعلم ان تطبيقك الذي تقوم بعمله يستخدم العديد من ملفات DLL مع انك لم تفعل ذلك صراحة, هل تعلم ان اغلب إن لم يكن كل التطبيقات التي تعمل تسخدم ملفات DLL وخاصة المكتبات الخاصة بالنظام.

ملفات ال DLL إن لم تكن com, إما أن تكون خاصة بنظام التشغيل او تقوم انت بعملها, ولا يوجد هناك فرق كبنية بين ملفات dll الخاصة بنظام التشغيل و بين ملفات ال dll التي تقوم انت بكتابتها.

دعونا نلقي نظرة خاطفة على بعض ملفات DLL الخاصة بالنظام:

هل سمعت من قبل بالملفات التالية الموجودة في win32(سوف اشرح بشكل مختصر):

Kernal32.dll: و هو اهم ملف موجود في windows يتم الاعتماد عليه في التعامل مع الذواكر و ادارة process و ال thread,,,,,.

User32.dll: يختص بانشاء النوافذ و التعامل مع ال messages.

GDI32.dll: يتم التعامل معه في كل شيئ له علاقة بالرسوميات Graphics.

و هناك الكثير الكثير من ملفات ال DLL موجودة في نظام التشغيل و تم ذكر اهم ثلاث ملفات فقط.

هذه الملفات الثلاثة التي تم ذكرها يستخدمها windows في اداء عمله بشكل كبير جدا و يمكن ايضا انت ان تستخدم التوابع الموجودة بداخلها وهي تشكل جزء كبير من توابع API, اذا كنت تعاملت من قبل مع توابع API فاعلم انها موجودة ضمن ملف DLL و انت فقط تستدعي هذه التوابع.

ملف ال DLL صندوق اسود فاذا لم يكن موثق اي documented فمن الصعب جدا التعامل معه فلذلك دائما يتم تقديم شرح وافي من قبل مصنع ملف ال DLL الى الجهة التي سوف تستثمره(تسخدمها ضمن برامجها), مع اننا يمكنا معرفة جميع التوابع التي يتم استيراده و جميع التوابع التي يتم تصديرها من اي ملف DLL وذلك بعمل disassembling لملف DLL اواطلع على المشاركة التالية لتعرف كيف يمكن الحصول على التوابع المصدرة من ملف DLL

تعريف دوال Native API

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

اللاحقة .drv و التي تستخدم في تعاريف الاجهزة

اللاحقة .sys و التي تشير الى ملفات النظام

اللاحقة .fon و هي تعطي مصادر خطوط, طبعا لا تحتوي هذه على اكواد تنفيذية و انما فقط Resources.

ملاحظة: في Delphi بشكل خاص هناك شيئ اسمه package تستخدم لوضع Components بداخلها و يمكن اعتبارها شكلا اخر من اشكال ال DLL الموجودة.

فوائد ملفات DLL:

سؤال: لماذا نضع توابعنا في DLL طالما انها تعمل بشكل جيد اذا قمنا باضافتها في التطبيق؟

دعونا نخصص السؤال اكثر, لماذا نضع توابعنا ضمن DLL و لا نضعها ضمن Unit خاصة بالتطبيق؟؟

نحن نعلم انه عند كتابة تابع ما داخل Unit معينة, فهذا التابع سوف يكون موجود داخل الملف التنفيذي(exe file) و ذلك بعد عمل Compile للتطبيق, الان هذه ال Unit نستطيع ضمها الى اكثر من مشروع و استخدامها متى شئنا و لكن يبقى الكود الناتج عن ترجمة التوابع المضمنة بداخل ال Unit داخل التطبيق و لا يمكن استخدامها إلا من داخل التطبيق

بينما التوابع التي تكون بداخل ملف ال DLL اي التي تم ترجمتها ضمن ملف DLL هي فقط تتوضع ضمن هذا ال DLL و يتم استدعاء التوابع من تطبيق اخر.

الان تخيلوا معي ما يلي: اذا كان لدينا التابع MaxBox عمله هو ان يأخذ ابعاد صندوقين و يعيد لنا الصندوق الاكبر هذا التابع استخدمته ضمن خمس برامج من برامجك التي انتجتها و ذلك بضم ال Unit التي تحتويه و من ثم استدعاء هذا التابع, بعد عمل Compile لاي مشروع من مشاريعك سوف يتم وضع ال code لهذا التابع ضمن كل تطبيق من التطبيقات الخمسة التي قمت ببرمجتها

الان تخيل معي انه كان هناك تطبيقين من تطبيقات مرتبطين مع بعضهم البعض و يتعاونان لاداء عمل ما و قمت ببيعهما كحزمة كاملة و تم تنصيبها على نفس الجهاز, الان التابع MaxBox موجود في كلا التطبيقين, نستنتج من هذا كله أنّه تم تكرار code التابع MaxBox في كلا التطبيقين و بالتالي زيادة في الحجم المطلوب لتطبيقاتك, فلو كان هناك نسخة و احدة لكنا وفرنا مساحة.

قد يخطر لبال احدكم الان ويقول ما يلي: يعني كله تابع واحد و اذا تكرر شو ها المشكلة مع وجود هاردات اليوم بحجوم عملاقة؟

اقول له انه في العادة يتم بناء مكتبات كاملة يعني تحتوي على مئات التوابع إن لم يكن الوف التوابع فبالتالي هناك مساحة مهدورة اكبر تزداد بعدد التوابع المشتركة بين التطبيقات.

قد تصر على رأيك انّ حجوم الهاردات كبيرة اليوم ولا ضرر من هذا التكرار, اقول لك ابقى معي حتى النهاية و لنرى ان كنت ستقتنع انه هناك ضرر من تكرار اكواد التوابع في عدة تطبيقات ام لا؟!!

نحن نعلم انه عند تنفيذ اي برنامج ما؟ ماذا يحصل عندما ننفذ برنامج؟ فكر بالامر؟ هل فكرت ما الجواب؟ اذا لم تصل الى جواب حاول البحث في الانترنت عن جواب؟

بشكل مبسط جدا الجواب هو انه سوف يتم تحميل هذا البرنامج او التطبيق في الذاكرة وسوف يتم وضعه في Process هذا ال Process يحجز من موارد النظام لكي يعمل فهو يحجز معالجة اي مقدار من المعالج(CPU) و يحجز ايضا مقدار معين من الذواكر, ما يهمنا هنا الان هو الذواكر بما ان تطبيقك في الذاكرة, عرفنا سابقا انّ الملف يحجز مساحة على ال Hard disk و في حال وجود نسخة كاملة من عدة توابع سوف يتم تكرارها في Code كلا التطبيقين الموجودين على ال Hard disk و بما انه عند تنفيذ التطبيق يتم نسخه الى الذاكرة بالتالي التوابع المشتركة بين التطبيقات سوف يتم تكرارها ايضا في الذاكرة.

باختصار اذا وضعنا هذه التوابع في مكتبة DLL بدل وضعها في مكتبة Unit نحن نوفر مساحة في Hard disk و مساحة ايضا في الذاكرة و ذلك يتضح عندما ينفذ المستخدم برنامجين من برامجك في نفس الوقت سواء كانو مختلفين او من نفس النسخة, فعند استخدام ملف DLL يتم تحميله مرة واحدة فقط و يتم استخدامه من جميع البرامج التي تسخدمه.

قد يقول احدكم, الى الان لم اجد فائدة بالنسبة للبرامج التي انتجتها من استخدام ملفات DLL فانا لم انتج تطبيقين مرتبطين مع بعضهم البعض ابدا, و نادرا ما يحتاج المستخدم الى تشغيل نسختين من نفس البرنامج في نفس الوقت!!

اقول له ابقى معنا حتى النهاية فنحن لم نستعرض بعد الى ميزة واحدة من مميزات استخدام ملفات DLL.

فائدة اخرى:

هل سمعت يوما بمصطلح دارج في عالم البرمجة اسمه reuse اي اعادة الاستخدام؟

جوابك اخي القارئ سوف يكون على الشكل التالي: نعم سمعت به وهو مفيد جدا عندما اقوم ببرمجة اي برنامج, فانا اقوم بتنظيم ال code بشكل جيد حيث دائما اقوم بكتابة توابع تؤدي وظائف معينة اذا تم استدعاءها في اكثر من مكان حتى لا يتكرر الكود داخل التطبيق, اذا كان لك خبرة اكثر في البرمجة سوف تقول: من الممكن ان اقوم بوضع مكتبة كاملة في Unit ما و اتبع OOP بدلا من استخدام التوابع و بذلك يكون الكود منظم و سهل الفهم و يمكن استخدامه في العديد من البرامج التي من الممكن ان استفيد من هذه المكتبة حيث فقط اقوم بتضمينها ضمن المشروع و استخدمها, اذا كنت اذكى من هذا قد تقول: من الممكن ان اكون Component او مجموعة من Component سواء كان مرئية او غير مرئية, حيث اسهل ايضا على المستخدم في التعامل مع المكتبة و اخفي ورائي الكثير من التعقيدات و اقوم بتنصيب هذه ال component ضمن IDE الذي استخدمه على سبيل المثال(Delphi, BCB....) وبالتالي اريح نفسي من عناء ضم ال Unit الى كل مشروع اريد عمله, فقط علي وضع اسم ال Unit بعد العبارة uses او Imports او Include حسب اللغة التي تعمل عليها.

ما علاقة DLL في كل مما سبق؟؟ ال DLL تعتبر من العناصر المؤثرة و الفعالة و الهامة في عملية reuse لماذا؟؟ دائما اسأل هذا السؤال؟لماذا؟؟ ماذا اريد ان اوصل لك؟؟

تخيل معي السناريو التالي:

لو قامت شركتك بانتاج مجموعة من برامج قواعد البيانات في شتى المجالات, و كنت انت المبرمج الماهر الذي يعرف ماذا تعني reuse في البرمجة و قمت بتصميم مكتبة ضخمة للتعامل مع قواعد البيانات بمختلف انواعها و تعبت كثيرا في بناءها و فعلا قمت باستخدام هذه المكتبة في العديد من التطبيقات التي قمتم بانشاءها, وفجأة و فجأة!!؟ ماذا حصل؟ اكتشفت bug خطيرة تحدث في مكان ما في هذه المكتبة, طبعا سوف تقوم باصلاحها و لكن كيف سوف نصلح جميع البرامج التي عند الزبائن؟؟ المكتبة طبعا سوف تضمن داخل ملف exe لبرنامج عند عمل compile للمشروع, طيب لحظة لافكر!! وجدتها!!

سوف اقوم باصلاح ال bug في المكتبة اولا و من ثم اقوم بعمل Recompile لجميع التطبيقات التي قمنا بانتاجها و من ثم نقوم بعمل توزيع للبرامج على الزبائن من جديد, و بالتالي على جميع الزبائن الذين اشتروا البرامج من الشركة ان يقوم بعمل Uninstall للبرامج التي عندهم و من ثم اعادة تنصيب Install للبرنامج الجديد الخالي من ال bug الخبيثة السابقة. هاه ما رأيك!!؟؟ العمل السابق سهل ام صعب؟؟؟

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

و لكن هل هذا سهل؟ ما هي المهارات المطلوبة حتى تقوم بانجاز هذا العمل؟صراحة لا اعرف أي شيئ عن هذه الطريقة؟ و لا اعرف كيف يتم صنع patch؟ هنا نحتاج feedback من اصدقاءنا الخبيرين في هذا المجال في المنتدى, اتمنى ان يصلوا الى هنا في قرأتهم!! حتى يفيدونا

يمكنك تخطي المشكلة السابقة على الشكل التالي: قم بوضع المكتبة السابقة في ملف DLL طبعا سوف تقوم بتصدير التوابع التي سوف تستخدمها لكي يتم استخدامها من قبل التطبيقات الاخرى, الان ماذا؟؟ نعود الى سؤالنا السابق؟

ماذا لو كان هناك bug في هذه المكتبة, هنا سوف تقوم فقط باصلاح المكتبة و التي هي عبارة عن ملف DLL و تقوم بعد ذلك بعمل update للزبائن فقط بان تقوم بتبديل ملف DLL القديم بالجديد. ما رأيك هل هذا اسهل؟؟

طبعا لن تقوم بعمل Recompile لاي تطبيق من التطبيقات التي قمت بانتاجها, فقط سوف تحتاج الى تبديل ملف DLL الموجود عند الزبائن.

ملاحظة هامة: الكلام السابق ليس صحيح 100% فهناك استثنائات لكل قاعدة دوماً, ماذا يمكن ان يكون هناك؟ ماذا يا ترى؟؟ فكر قليلا؟؟؟

اه وجدتها!! انا ذكي!! و انت لا تعرفني بعد؟؟

ماذا لو تم تغيير Interface للتوابع؟؟ اي تم تغيير ال header للتوابع؟؟ هل سوف اكون قادر على التحديث للزبائن باستخدام ملف ال DLL دون ان اقوم بالتعديل على الملفات التنفيذية؟

في الحقيقة في هذه الحالة نعم يجب علينا عمل Recompile لجميع البرامج التنفيذية التي سوف تستخدم التعديل الجديد الذي تم اضافته على المكتبة. طالما لم نستخدم طريقة ال patch.

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

قد يأتي احدكم يقول معقول انو ال DLL كلها منايح يعني ما لها عيوب بالمرة؟ مستحيل هذا الامر فلكل شيئ حسنات و سيئات, و لكن دعوني اوجز لكم حسنات ال DLL في البداية ثم نقوم باستعراض سيئاته و بذلك نكون قد انتهينا من الحلقة الاولى, ميزات و فوائد ال DLL:

1- يمكنك مشاركة مجموعة من التوابع بين العديد من التطبيقات

2- توفير للمساحات المستخدمة في كل من الذواكر و الهارد و طبعا ذلك لاستخدامنا ملف DLL يحتوي على نسخة واحدة من التوابع المستخدمة

3- يمكنك عمل help اي ملف مساعدة لهذا ال DLL تشرح فيه التوابع و فوائدها و طريقة استدعاءها و تعطيها لمبرمجين اخرين ليقوموا باستخدامها بدون اعطاءهم Source code لها و هكذا تكون قد عملت صندوق اسود اخفيت وراءه التعقيد و طريقة العمل عن المطورين الاخرين.

4- يمكن ايضا عمل ال DLL بطريقة بحيث تمكن حتى مبرمجين من غير كوكب ان يستخدم هذا ال DLL اقصد انهم يبرمجون بلغة اخرى, في دلفي نفعل ذلك عادة بوضع الكلمة stdcall directive بعد التصريح عن التابع للسماح للغات الاخرى باستخدام ملفنا, اذا لم تضع stdcall بعد تصريح تابع سوف تتمكن فقط من استدعاء التابع في دلفي و لن تتمكن من استدعاءه في لغة اخرى, ايضا نستطيع ان نستخدم ملف DLL مصنوع بلغة اخرى مثل C++ مثلا ضمن دلفي,,,,

5- كما تكلمنا سابقا يمكنك بسهولة اكثر عمل تحديث لتطبيقاتك عند الزبائن في حال استخدامك ملفات DLL.

6- الامر الذي ذكرناه قليل في المقدمة التي تكلمنا بها عن ال DLL و لم نذكره بعد و هو امكانية احتواء ملفات DLL على Resources اي مصادر مثل,,,,,, Images, Icons, sounds, strings ,and animation

على سبيل المثال الملف moricons.dll الموجود في المجلد التالي Windows\System

7- ايضا من الفوائد التي نحصل عليها عند استخدام ملفات DLL هي امكانية عمل دعم واسع للغات باستخدام ملفات DLL !!كيف؟؟ ما علاقة DLL بدعم مجموعة من اللغات؟؟ بدأت تفهم علي لا تدع شيئ يفوتك دائما اسأل

يمكنك استخدام ملفات DLL لتخزين Resources,, يمكنك بناء عدة ملفات من ال DLLs تخزن بداخلها نصوص(string)لعدة لغات تريد ان تدعمها و يمكنك سحب هذه ال strings وقت ال run time وعرضها للمستخدم على حسب اختياره للغة التي يريدها, مع الانتباه انه يمكن عمل ذلك باستخدام انواع ملفات اخرى!!!

مساوئ DLL لا تساوي شيئ امام الفوائد التي تكلمنا عليها سابقا حيث انه من مساوئ ال DLL ما يلي:

1- عدم معرفة اغلب المبرمجين بفوائد ال DLL و ذلك لانّ التعامل معه اصعب بقليل من التعامل مع المكتبات التي يتم تضمينها ضمن التطبيقات.

2- اختلاف الانماط بين اللغات: قد لا تكون هذه مشكلة اذا اتبعت الطرق الصحيحة في تعريف المتحولات بحيث لا تستخدم الانماط الخاصة باللغة التي تستخدمها, و كل لغة لها انماط يمكن استخدامها مع DLL وانماط لا يمكن استخدامها.

مثلاً: في Delphi هناك نمط اسمه string فيه الكثير من التسهيلات للتعامل مع النصوص المحرفية هذا النمط لا يمكن تمريره الى متحول DLL في الحقيقة تستطيع ذلك اذا قمت بتضمين الملف borlandmm.dll مع تطبيقك ايضا و هو شيئ لا يحب عمله الكثير من المبرمجين...

مثال اخر: اذا اردت ان تمرر سلاسل محرفية strings لملف ال DLL يمكنك استخدام النمط shortstring و لكن ال shortstring محدود في الحجم حيث يتيح لك فقط 255 محرف, او يمكنك استخدام النمط Pchar او Pwidechar و هو الحل الافضل طبعا و لكن عليك حساب حجم الذاكرة بنفسك اي عليك حساب طول النص, او يمكنك استخدام مصفوفات arrays من char و لها الكثير من السيئات اهمها انك سوف تحجز مقدار محدد من الذاكرة يكون ثابت.

في النهاية فكرة هامة جدا: هناك حالتان او اصبحوا ثلاثة بوجود .Net لطريقة استثمار Code موجود داخل ملف DLL:

1- الطريقة المعروفة و التقليدية هي ان نقوم بعمل مجموعة من التوابع و من ثم نقوم بتصديرها و يتم استخدامها من قبل تطبيقاتنا

2- الطريقة الثانية و هي استخدام تقنية Com (Component Object Model) و هي مقياس تم طرحه من قبل شركة Microsoft لبناء ال Component داخل ملفات DLL و امكانية استخدام هذه ال Component داخل جميع لغات البرمجة التي تدعم هذا الامر, اي اننا نستطيع ان نشارك object يتم صنعه في لغة ما و استخدامه في لغة اخرى.

3- الطريقة الثالثة: و هي استخدام .NET architecture و هي تقنية مشابهة لل Com و لا اعرف الكثير عنها بعد.

قد نفرد حلقة كاملة لشرح تقنية com, com+.

الى اللقاء في الحلقة القادمة و امل انكم استفدتم من ما سبق و السلام عليكم

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#3

أشكرك على هذه الدروس وأسأل الله أن تكون في ميزان حسناتك .

اقتباس
ملاحظة: في Delphi بشكل خاص هناك شيئ اسمه package تستخدم لوضع Components بداخلها و يمكن اعتبارها شكلا اخر من اشكال ال DLL الموجودة.

والتي تنتهي بلاحقة *.dpk وبعد الترجمة تكون *.bpl

وأعتقد أن هناك فرق بينها وبين مكتبات dll - وأرجو تصحيح كلامي ، لأني قرأته قديماً في حدود الإصدار الرابع - وهو أن مكتبات dll يتم تحميلها مع البرنامج تحميلاً ديناميكياً يعني عند استدعاء دوالها أما ملفات bpl فهي تحمل مع البرنامج تحميلاً استاتيكياً يعني ساكناً

س : هل باستطاعتي أن أبرمج بـ .Net وأستخدم مكتبات مكتبوبة بـ win32 ؟

س: هل باستطاعتي أن أبرمج بـ JAVA وأستخدم مكتبات مكتبوبة بـ win32 ؟

أعتذر عن هذه الأسئلة ولكني لازلت مبتدئاً.

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 10 نوفمبر 2006 في 22:45

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#4
اقتباس
وأعتقد أن هناك فرق بينها وبين مكتبات dll - وأرجو تصحيح كلامي ، لأني قرأته قديماً في حدود الإصدار الرابع - وهو أن مكتبات dll يتم تحميلها مع البرنامج تحميلاً ديناميكياً يعني عند استدعاء دوالها أما ملفات bpl فهي تحمل مع البرنامج تحميلاً استاتيكياً يعني ساكناً

كلامك صحيح نعم هناك اختلاف في التضمين, وانا قلت هي ليست كملف ال DLL و انما يمكن اعتبارها شكلا اخر من اشكال ال DLL الموجودة

اقتباس
س : هل باستطاعتي أن أبرمج بـ .Net وأستخدم مكتبات مكتبوبة بـ win32 ؟

نعم تستطيع ذالك على ما اعتقد و ذلك بسبب اننا نستطيع استخدام توابع API في .Net بشيئ تم تسميته P/Invoke او Platform Invokeو بالتالي على ما اعتقد يمكن استخدام ملفات DLL في . net طبعا ملفات DLL من نوع com مدعومة في .net و انا اتحدث عن ملفات DLL غير ال com

اما في java فلا اعرف, لانني لم اطلع على java ابدا

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#5

سلسلة بوليسية، تذكرني بموريارتي :P

ممكن سؤالين :D

هل يمكن تحويل EXE الى DLL ؟ وكيف ؟ ;)

d4baa0.gif
#6
اقتباس
سلسلة بوليسية، تذكرني بموريارتي

:D فقط لجلب المزيد من الزوار الى المشاركة

اقتباس
هل يمكن تحويل EXE الى DLL ؟ وكيف ؟

اعرف انك تعرف الاجابة, واحببت ان تضع هذا السؤال لتثري الموضوع, انا اعرف القليل و البقية عندك

السؤال الاول:هل يمكن تحويل EXE الى DLL ؟

نعم يمكن تحويل ملف EXE الى DLL!و لو لم يكن بقدرتنا ذلك لما قلت كيف :D

السؤال الثاني: كيف يمكن تحويل EXE الى DLL؟

فقط قم بعمل Rename اي اعادة تسمية للملف ذو اللاحقة exe الى DLL , و ذلك لان كلا النوعين لهما نفس البنية و لا يختلفان الى في نقطة البداية

و يختلفان ايضا في طريقة توضعهما في الذاكرة

كيف يتم تغيير نقطة البداية و طريقة التحميل لا اعرف!

كيف يتم تغيير تابع ما ليصبح Exported ايضا لا اعرف! اتمنى ان تشرح لنا انت ذلك ;)

و لكن هل هناك فائدة من تحويل ملف exe الى ملف DLL؟ قد يكون؟

اتمنى ان يكون هناك اسئلة اكثر حتى نثري الموضوع اكثر, و شكرا لك من ساهم في الموضوع حتى الان

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#7

رائع ياوائل :)

عندي سؤال لكن اخاف تطردني من القسم شهر كامل :(

هل يمكن تحويل dll الى exe ؟ وكيف ؟

اكيييد راح يكون فيه اسئله لكن ننتظر اكمالك لباقي الموضوع اذا فيه تكمله

وانا عن نفسي احب اسئل عن شغله تخص ملفات الربط وحاب اضيفها لبرنامجي

لكن خليها بوقتها احسن

شكررررررا مره ثانيه

#8
اقتباس
عندي سؤال لكن اخاف تطردني من القسم شهر كامل

له يا طيب, شو اطردك :D , الديموقراطية عنا في القسم واضحة :P , اسأل ماشئت انت و غيرك و لكن بشيئ له علاقة في الموضوع, و كل الاعضاء بالخدمة

اقتباس
هل يمكن تحويل dll الى exe ؟ وكيف ؟

دعنا اولا ننتظر توضيح الاخ محمد عبد العزيز لكيفية تحويل exe الى DLL, و العملية سوف تكون عكس السابقة

اقتباس
اكيييد راح يكون فيه اسئله لكن ننتظر اكمالك لباقي الموضوع اذا فيه تكمله

وانا عن نفسي احب اسئل عن شغله تخص ملفات الربط وحاب اضيفها لبرنامجي

لكن خليها بوقتها احسن

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

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#9

انا لم ابرمج بديلفي منذ مدة لذا اعذروني و صححوا لي إن أخطأت

تكملة لمشاركة الاخ أبو محمد اللحياني

و بالنسبة للاستدعاء فيوجد نوعان لاستدعاء مكتبة DLL من خلال البرنامج أحدهما الاستدعاء الستاتيكي او الساكن (Static)

و الاخر هو الاستدعاء الديناميكي

بالنسبة للفرق بين الـ exe و الـ DLL

لدي كتاب Mastring Delphi 5 و قد قرأت فيه التالي:

البنية الداخلية لملف الـ EXE و ملف الـ DLL هي نفسها , لكن عندما يتم تحميل الـ DLL للذاكرة يبدأ الاختلاف

ويندوز يقوم بتحميل شيفرة الـ DLL في الذاكرة لمرة واحدة

نفس الأمر يحدث بالنسبة للملف التنفيذي حتى إن كنت تشغل عدة نسخ .

في كلتا الحالتين آلية حساب استخدام الـ Modules تتأكد من ان شيفرة المكتبة ستفرغ من الذاكرة عندما

تكون جميع البرامج التي تستخدمها مغلقة

المفتاح الاساسي في الاختلاف بين البرامج و المكتبات هو ان

المكتبة عندما يتم تحميلها للذاكرة ليست برنامجا يعمل , إنها فقط عبارة عن تجمع للإجرائيات و الدوال التي يمكن للبرامج

الاخر ان تستدعيها هذه الاجرائيات و الدوال تسنخدم المكدس الخاص بالبرنامج المستدعي , لذا

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

إنها تستخدم مكدس البرنامج الذي يستدعيها

اللهم صل و سلم على سيدنا محمد

كاف و نون خلقهم و فنائهم كاف و نون

عالمي شاشة و لغتي صفر و واحد

Just Smile ............You can do it

When you stop learning ... You stop leading

لساني بنطقي صامت عنه عادل............وقلبي بصمتي ضاحك منه هازل

وأتـعـب من نـاداك من لا تـجيبـه............وأغـيظ من عـاداك من لا تـشاكـل

مدونتي الشخصية : Tammam Koujan

آخر مواضيع المدونة :

#10

شكرا لك اخي تمام على المعلومات المفيدة

اقتباس
نفس الأمر يحدث بالنسبة للملف التنفيذي حتى إن كنت تشغل عدة نسخ .

الملف التنفيذي يتم تحميله بشكل كامل حتى ولو شغلنا عدة نسخ منه, و الدليل على ذلك جرب ما يلي:

شغل ملف exe و من ثم شغله مرة اخرى ثم قم بالذهاب الى task و انظر ال process لترى ان لك واحد منهما مقدار من الذاكرة مما يدل على انه يتم تحميلهما

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

اقتباس
المكتبة عندما يتم تحميلها للذاكرة ليست برنامجا يعمل , إنها فقط عبارة عن تجمع للإجرائيات و الدوال التي يمكن للبرامج

الاخر ان تستدعيها هذه الاجرائيات و الدوال تسنخدم المكدس الخاص بالبرنامج المستدعي , لذا

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

إنها تستخدم مكدس البرنامج الذي يستدعيها

كلام جميل اخي تمام :)

كنت اقرأ البارحة في بنية PE و فهمت بعض الامور, ولذلك سوف نفرد حلقة خاصة من هذه السلسلة للدخول في عمق كل من ملفات exe,dll و لمعرفة الاختلاف بينهما من الداخل اي تحت المجهر, و ذلك سوف يكون لاحقا بعد ان يتضح للاعضاء كيفية استخدام ملفات dll ضمن تطبيقاتهم و بعد طرح جميع الامور المتعلقة بال dll من السطح, و بعد ذلك نغوص في الاعماق

d: لا تتكلم عن كيفية تحويل exe الى dll, دعنا نؤجلها الى النهاية, بعد ان تكون الامور قد اتضحت اكثر :)

ترقبوا الحلقة القادمة يوم الجمعة مساءا باذن الله

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#11

يمكن أن يتم بناء DLL ليظهر واجهات وبعمل كتطبيق عادي عند تحميله, وما يبقى هو أن يتم تحميله في الذاكرة ليعمل

#12

انا مظلوم :unsure:

لابد ان نحقق مع ماركو كانتو لأن ما كتبه في كتابه Mastring Delphi 5 هو التالي:

Windows loads the code of a DLL into memory only once .

The same happens with an executable file, even if you run multiple copies.

لدي كتاب اخر عن ديلفي هو احترف ديلفي 7 لدار شعاع كلنا يعلم انه ترجمة حرفية سيئة

لكتاب Mastring Delphi 7 سأراجعه و اتأكد من كلام ماركو كانتو :D

اللهم صل و سلم على سيدنا محمد

كاف و نون خلقهم و فنائهم كاف و نون

عالمي شاشة و لغتي صفر و واحد

Just Smile ............You can do it

When you stop learning ... You stop leading

لساني بنطقي صامت عنه عادل............وقلبي بصمتي ضاحك منه هازل

وأتـعـب من نـاداك من لا تـجيبـه............وأغـيظ من عـاداك من لا تـشاكـل

مدونتي الشخصية : Tammam Koujan

آخر مواضيع المدونة :

#13

حسب التعريف:

DLL عبارة عن Module قابل للتحميل

EXE عبارة عن Module قابل للتنفيذ

لنترك مسالة تحويل EXE الى DLL عند الأنتهاء من هذه السلسلة

اكمل يا وائل ؟

ماهي انواع DLL ؟

هل يمكن استعمال اي DLL مهما كانت لغة برمجتها ؟ اي C/C++ او Delphi او حتى VB :)

d4baa0.gif
#14
اقتباس
يمكن أن يتم بناء DLL ليظهر واجهات وبعمل كتطبيق عادي عند تحميله, وما يبقى هو أن يتم تحميله في الذاكرة ليعمل

هذا ما سوف نستعرضه لاحقا, و ما زلنا في البداية,,,

اسف جدا لعدم اضافة الدرس البارحة, و ذلك بسبب عدم عمل خط الانترنت الذي في البيت, لذلك سوف يتم تعديل موعد الحلقة الى يوم السبت مساءاً

الحلقة الثانية من السلسلة: مثال بسيط مع الشرح لعمل DLL في دلفي

تكلمنا سابقا عن فائدة ال DLL في البرمجيات, في هذه الحلقة سوف ننظر كيف يتم صناعة(برمجة) ملف DLL في دلفي, فقط لكي ندخل قليلا في العملي, وحتى لا تبقى الامور نظرية,,

انشاء DLL الخاص بك في دلفي:

لانشاء ملف DLL في دلفي اتبع الخطوات التالية:

من ال main menu قم باختيار File>New>Other و من ثم اختار Delphi project و من ثم اختار DLL Wizard كما هو موضح في الصورة التالية:

1(2).GIF

بعد النقر على زر OK سوف يتم انشاء مشروع ملف ال DLL و يكون الملف الذي يحتوي المشروع طبعا باللاحقة .dpr و سوف يحتوي هذا الملف على الشكل التالي:

صورة الكود لمشروع DLL

2(2).GIF

القسم الاول: الفرق الواضح و الظاهر للجميع بين ملف لمشروع exe و ملف لمشروع DLL هو بداية المشروع

ففي مشروع exe كان ملف المشروع (dpr)يبدأ بالكلمة المحجوزة program اما في ملف مشروع DLL يبدأ الملف بالكلمة المحجوزة Library.

القسم الثاني: ايضا بعد الكلمة Library و اسم المشروع سوف تلاحظ comment ضمن قوسين {}تجاهلها الان

القسم الثالث: يحتوي على الوحدات (units) و التي نريد استخدام توابع او اغراض منها

القسم الرابع: يحتوي على جملة تدل ال compiler على ما هي ملفات ال resource التي يستخدمها المشروع

القسم الخامس: يحتوي على الجسم الرئيسي للبرنامج اي main و من هنا يبدأ التنفيذ عادة في التطبيقات, و لكن ما فائدة begin , end هنا, اترك ذلك لما بعد

انشاء مشروع DLL لا يقتصر على استخدام DLL wizard و انما تستطيع انشاء مثلا console application او vclform application و من ثم تقوم بتغير الكلمة program الى library و بذلك عن عمل compile للمشروع سوف تلاحظ ان الملف الناتج هو ملف ذو لاحقة DLL و ليس exe.

ملاحظة: سوف استخدام اللفظ تابع ليدل على routines(functions, procedures) فعندما اقول تابع فهذا يعني procedure او function .

كل ما علينا فعله الان هو اضافة التوابع فوق القسم الخامس الذي يحتوي على جملة begin,end و عمل compile لتكون هذه التوابع موجودة ضمن ملف DLL.

و لكن هذه التوابع لا يمكنك استدعاءها من خارج ملف ال DLL و انما يمكن استدعاءها من داخل ملف ال DLL فقط.

الان اذا اردت ان تسمح لتابع ما ان يتم استدعاءه من تطبيقات اخرى(exe) او من ملفات DLL اخرى يجب عليك ان تقوم بعمل تصدير لهذا التابع (export)

كيفية تصدير تابع من ملف DLL؟؟

هناك كلمة محجوزة في دلفي اسمها exports يتم بعدها وضع اسماء التوابع التي نريد تصديرها من ملف ال DLL,

الموقع المشهور و الاعتيادي لوضع الكلمة exports في مشروع ال DLL هي فوق الجملة القسم الخامس اي فوق جملة begin,end

مثال:

Exports 
Fun1, Fun2;

يمكنك ايضا اذا اردت تغيير اسم التابع عند التصدير و ذلك باستخدام name directive وذلك بوضع اسم التابع و من ثم name و من ثم اسم التابع الجديد ضمن''

مثال:

exports
Fun1 name ‘function1’;
Fun2 name ‘function2’;

لتبسيط الامور اكثر انت تعرف الكلمة المحجوزة uses و التي بعدها نضع اسماء الوحدات(units) التي نريد استخدامها في تطبيقنا,تركيب uses مشابه تمام لتركيب exports و الاختلاف الوحيد هو ان بعد كلمة uses يتم وضع اسماء الوحدات اما بعد كلمة exports يتم وضع اسماء التوابع التي نريد تصديرها.

دعونا نأخذ مثال بسيط نوضح من خلاله الامر افضل من الكلام النظري:

في المثال سوف نقوم بكتابة تابع يقوم باظهار رسالة (ArabTeam2000), سوف نستخدم تابع API و الذي اسمه Messagebox لاظهار هذه الرسالة, لاستدعاء هذا التابع علينا تضمين الوحدة windows و التي تحتوي على تغليف و اعادة تصريح لتوابع كثيرة من ملفات DLL لويندوز مثلا kernel32,user32,GDI32

لاحظ انّ التابع MessageBox موجود في ملف user32.dll و نحن نقوم باستدعاء تابع من ملف DLL و لكن الوحدة windows تخفي عنك الكثير من الامور التي نقوم بها عادة لكي نتمكن من استدعاء تابع من ملف DLL

اذا قمت بالنقر على التابع MessageBox مع الضغط على زر Ctrl سوف تنتقل الى الوحدة windows الى عند السطر الذي تم استيراد التابع من ملف ال DLL و الذي اسمه user32.dll و يكون هذا السطر على الشكل التالي:

function MessageBox; external user32 name 'MessageBoxA';

سوف نشرح طريقة استدعاء تابع من ملف DLL لاحقا و لكن فقط احببت ان اشير الى انّ التابع MessageBox الذي سوف نستخدمه في ملف DLL الذي نقوم بانشاءه هو ايضا موجود في ملف DLL. لاحظ ايضا انه يستخدم name directive لتغير اسم التابع من MessageBox الى MessageBoxA .

الان نعود الى مشروعنا الذي نريد انشاءه لكي يعرض لنا الرسالة:

بعد انشاء مشروع جديد باستخدام DLL wizard كما تم ذكر ذلك في البداية

قم بازالة جميع الوحدات التي بعد الكلمة المحجوزة uses لاننا لن نستخدمها و قم باضافة الوحدة windows التي تحتوي على التابع MessageBox , اذا ابقيت على الوحدات الاخريات و لم تستخدمها سوف يؤدي ذلك الى تكبير حجم ملف ال DLL بدون فائدة,,

الان في المشروع قم بكتابة اجرائية على الشكل التالي:

procedure MsgBox;stdcall;
begin
  MessageBox(0,'ArabTeam2000','Hello',MB_OK);
end;

لاحظ اننا وضعنا الكلمة stdcall بعد اسم التابع, و ذلك لكي نتمكن من استدعاء هذا التابع من اي لغة سواء كانت دلفي او C++ او اي لغة تدعم ملفات DLL.

و من ثم قم بكتابة الكلمة المحجوزة exports قبل الجملة begin, end و اكتب بعدها اسم الاجرائية msgbox على الشكل التالي:

exports
msgbox;

ليصبح الشكل الكلي لمشروع ال DLL على الشكل التالي:

3(1).GIF

بعد ذلك قم بعمل compile للمشروع و ذلك بالضغط على Ctrl + F9 , لاحظ انه عند الضغط على زر F9 لتنفيذ البرنامج سوف تظهر لك رسالة الخطأ التالية:

4.GIF

هذه الرسالة تدل على انه لا يمكن تنفيذ مشروع DLL و انما نحتاج الى تطبيق مضيف(host application) كما قلنا ذلك سابقا, و تقول ايضا انه يمكن استخدام الامر run>parameters , سوف نقوم بشرح هذه الواجهة لاحقا.

الان بعد عمل compile للمشروع سوف تلاحظ ظهور ملف DLL بنفس اسم المشروع و لكن بلاحقة .DLL

الان لاختبار هذا ال DLL علينا انشاء application نقوم من خلالها باستدعاء التابع msgbox الذي قمنا بالتصريح عنه في ملف ال DLL, يفضل دائما ان يكون مشروع ال DLL و ال application التي تستخدمه ان يكونوا ضمن Project Group و ذلك لاتاحة امكانية العمل في المشروعين بان واحد و يمكننا عمل compile او Run لاي مشروع نريده من ال Project Group مما يريحنا من اغلاق مشروع و فتح اخر كلما اردنا التعديل,,,

الان قم بالذهاب الى Project Group و من ثم انقر بالزر الايمن و اختر Add new project و من ثم اختر Vcl Application , فقط لتجريب ملف ال DLL

الان لاستدعاء التابع الذي قمنا بعمله في ملف ال DLL هناك طريقتان

1- Static Loading

و هي الطريقة الاسهل فقط نقوم باستخدام الكلمة External و بعدها نضع اسم ملف DLL الذي نريد استيراد التابع منه طبعا يجب علينا وضع الكلمة stdcall.

2- Dynamic Loading

و هي الطريقة الاصعب نوعا ما.

سوف نتحدث عن الطريقتين و متى نستخدم كل منها في وقت لاحق, دعونا فقط ننهي هذا المثال الان باستخدام الطريقة السهلة اي باستخدام Static Loading.

للقيام بذلك بعد انشاء التطبيق الذي نريد من خلاله فحص ملف ال DLL قم بالتصريح عن التابع msgBox في قسم ال Interface في التطبيق الجديد على الشكل التالي:

procedure MsgBox;stdcall;external 'Ex1.dll';

Ex1.dll هو اسم ملف ال DLL المتولد عن عمل Compile لمشروع ال DLL الذي قمنا بعمله سابقا

الان قم بالنقر على ال Form نقرتين و من ثم اكتب ما يلي

procedure TForm1.FormCreate(Sender: TObject);
begin
  MsgBox;
end;

و من ثم قم بعمل تنفيذ للمشروع و ذلك بالضغط على زر F9 سوف تلاحظ انه عند اقلاع التطبيق سوف تظهر لك MessageBox تحتوي على الكلمة ArabTeam2000 و بعدها سوف تظهر لك Form.

اذا ظهرت لك الرسالة فتهانينا لك بانك استطعت و بنجاح عمل ملف DLL بداخله تابع ما و من ثم استدعاء هذا التابع من تطبيق اخر.

لقد وضعت المثال في المرفقات, ولكن رجاء لمن يريدون الاستفادة, ان تقوم بذلك بنفسك, سيما انني وضعت صور واضحة, و المثال فقط للاستئناس

لن نتوسع كثيرا في هذه الحلقة لكي لا تصبح جريدة, سوف نشرح الكثير من الامور في الحلقة القادمة و السلام عليكم

Ex1.rar

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#15

السلام عليكم

لا ادرى يا اخى يا وائل ولكن يبدو لى انك تعرف ما ينقصنى ان اعرفه ;) كهذا الموضوع وايضا (كيف تبنى ...)

المهم :بعد دراستى للموضوع

- انا ايضا اريد معرف نبذة عن الباتش واستخداماته فلعل احد الاخوة يعطينا نبذة عن الموضوع

- الان فى المستقبل القريب اذا اردت الاستفادة من ملفات ال dll التى فى الويندوز هل استطيع؟ واذا كان الجواب نعم

فأين اجد سردا لمكتبات ال dll وما تحتويه كل مكتبة من توابع ومصادر يمكن الاستفادة منها فى التطبيقات التى نعملها

- ومعلومة اخرى اريد معرفتها لااعتقد ان هذا مكانها ولكنك ذكرتها فى الاعلى او لست انت القائل

اقتباس
بدأت تفهم علي لا تدع شيئ يفوتك دائما اسأل

ما هو ال console application ؟ (بدون تفاصيل)

مرفق تجربتى لعمل ال dll .

dll.rar

#16
اقتباس
الان فى المستقبل القريب اذا اردت الاستفادة من ملفات ال dll التى فى الويندوز هل استطيع؟ واذا كان الجواب نعم

فأين اجد سردا لمكتبات ال dll وما تحتويه كل مكتبة من توابع ومصادر يمكن الاستفادة منها فى التطبيقات التى نعملها

عليك ب MSDN فهي افضل مرجع حول DLL الخاصة بويندوز و لكن ليس كل ملفات DLL الخاصة ب winodws هي documented,,,

اقتباس
ما هو ال console application ؟

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

انظر هذه المشاركة الرائعة ل ikossan:

بدي أعرف شو هو الConsole

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#17

كنت اعيد قراءة المشاركة من البداية فاحببت ان اوضح بعض الامور التي قد غفلت عنها

في الحلقة الاولى من هذه السلسلة قلت ما يلي

اقتباس
اذا كنت اذكى من هذا قد تقول: من الممكن ان اكون Component او مجموعة من Component سواء كان مرئية او غير مرئية, حيث اسهل ايضا على المستخدم في التعامل مع المكتبة و اخفي ورائي الكثير من التعقيدات و اقوم بتنصيب هذه ال component ضمن IDE الذي استخدمه على سبيل المثال(Delphi, BCB....) وبالتالي اريح نفسي من عناء ضم ال Unit الى كل مشروع اريد عمله, فقط علي وضع اسم ال Unit بعد العبارة uses او Imports او Include حسب اللغة التي تعمل عليها.

فقط للتوضيح ليس من الضروري ان اقوم بضم ال Package الى IDE الدلفي لكي استطيع استخدامها و انما ايضا استطيع ان اقوم بتحميلها عند Run Time و ذلك باستخدام التوابع LoadPackage و UnloadPackage

بالنسبة لما قاله ابومحمد اللحياني:

اقتباس
وأعتقد أن هناك فرق بينها وبين مكتبات DLL - وأرجو تصحيح كلامي ، لأني قرأته قديماً في حدود الإصدار الرابع - وهو أن مكتبات DLL يتم تحميلها مع البرنامج تحميلاً ديناميكياً يعني عند استدعاء دوالها أما ملفات bpl فهي تحمل مع البرنامج تحميلاً استاتيكياً يعني ساكناً

لتوضيح الجواب اكثر يجب علينا ان نميز بين امرين التحميل(التضمين) و الاستدعاء , حيث هناك فرق كبير بين الاثنين

المقصود بالتضمين او التحميل هو ان يكون الكود ل Package ضمن الملف التنفيذي للمشروع, فهنا يمكننا ان نسمح بان يتم تضمين التوابع المستخدمة من Package ما الى مشروعنا و بالتالي يكون حجم ملف ال Exe الناتج كبير نسبيا, فاذا لم نقم بتضمين ال package ضمن الملف التنفيذي يجب علينا ان نقوم بتوزيع هذه ال package مع ملف ال Exe و هنا يكون حجم ملف ال Exe اصغر و لكن الحجم الكلي للبرنامج سوف يكون اكبر كوننا قمنا بتوزيع ال Package مع الملف التنفيذي

اما بالنسبة لوقت الاستدعاء: فملفات ال DLL لا يمكن تضمينها ضمن الملف التنفيذي و انما هي ملفات مستقلة بحد ذاتها, و يتم استدعاء توابع منها و ذلك بطريقتين Static او Dynamic و هناك فرق بين الطريقتين من حيث متى سوف يتم تحميل المكتبة؟ و متى سوف يتم تحريرها؟ و كيف سوف يتم ذلك؟, و لكن في النهاية التوابع تبقى في ملف ال DLL و يتم استدعاءها فقط

سوف نشرح عن طريقتي استدعاء التوابع Static و Dynamic في الحلقة القادمة.

ايضا عندما قلت:

اقتباس
ملاحظة: في Delphi بشكل خاص هناك شيئ اسمه package تستخدم لوضع Components بداخلها و يمكن اعتبارها شكلا اخر من اشكال ال DLL الموجودة.

اقصد من خلاله انّ ال Package تشبه كثير ال DLL في البنية حتى يمكن ان تحتوي ال Package على ملفات resources و حتى Forms مثلها مثل ال DLL,

و يمكن ايضا استدعاء اي شيئ ما من داخل Package و ذلك في ال Run Time, كما في ال DLL و ليس شرط ان يتم تحميل ال Package تحميل static اي ضمن ملف ال Exe و انما يمكن استدعاء اشياء من داخل ملف Package وقت التنفيذ Run time.

لن اشرح المزيد عن ال Packages كي لا نتشت كثيرا و إن شاء الله في المستقبل اضع مشاركة تشرحها بالتفصيل. معلومة على الهامش: مفهوم ال Package هو من اختراع Boraland و هو اختراع رهيب جدا.

احببت ان انقل لكم بعض المعلومات اللذيذة و السهلة الهضم لكي نهيئ المعدة للدرس القادمة:

1- هل تعلم انه لن يعمل ملف ال DLL اذا لم تضع له اللاحقة .DLL و ذلك في كل من Windows NT/2000/XP و لكنه يعمل في نسخ 9x

2- هل تعلم انه حتى على Linux هناك ملفات مشابهة لملفات ال DLL الموجودة على Winodws و هذه الملفات لاحقتها هي .SO اي shared objects

3- هل تعلم اننا يمكننا ايضا وضع التصريح عن التابع بشكل كامل بدلا من وضع اسمه في قائمة ال Exports, اي نستطيع ايضا ان نضع ال Parameters مع اسم التابع كما يلي

exports
  Msgbox (N: Integer);

و لكن لا فائدة من وضع ال Parameters عند التصدير الا في حالة وجود Overloaded Functions وهذه سوف نتحدث عنها لاحقا.

4- هل تعلم انه لكي يعمل التطبيق الذي يستدعي ملف DLL ما, يجب ان يكون ملف ال DLL في احدى اربعة اماكن لا يوجد غيرهم:

أ- ان يكون ملف ال DLL في نفس مجلد البرنامج

ب- ان يكون ملف ال DLL في مجلد الرئيسي للويندوز \windows او \WinNT حسب نسخة الويندوز.

ج- ان يكون ملف ال DLL في مجلد system \Windows\System او \WinNT\System32حسب نسخة الويندوز

د- و هي التي قد تكون غامضة بالنسبة للبعض وسوف اقوم بشرحها بقليل من التفصيل:

ان يكون ملف ال DLL في احد المسارات(directories) الموجودة في متحول ال Path الموجود في Environment Variables و التي يمكن ان نصل اليه من خلال خصائص النظام(system properties) مثلا في windowsXP طبعا حسب النسخة sp1 او sp2 قد يختلف موقعها, تكون موجودة في الصفحة (advanced) على الشكل التالي:

1(3).GIF

و عند الضغط على زر Environment Variables سوف تظهر الواجهة التالية:

2(3).GIF

و التي من خلالها استطيع التعديل على المتحول path, في الصورة نرى هناك متحولين اسمهم path

احدهما موجود في User variables و هذا يعني انّ هذا المتحول فقط خاص بهذا ال User

و الاخر موجود في System variables و هذا يعني انّ هذا المتحول خاص بكل المستخدمين اي بالنظام ككل

ملاحظة: اسماء المتحولات هنا لا يمكن ان تتكرر نهائيا و هي وحيدة Unique و اذا اردنا مثلا ان نضيف عدة مسارات في المتحول Path علينا فقط الفصل فيما بينهما بفاصلة منقوطة; ,

لتجريب ما نريد قم بالضغط على زر Edit الواضحة في الصورة لتظهر لك نافذة شبيهة بالنافذة التالية

3(2).GIF

و من هنا اضف المسار الذي تريد و من ثم قم بوضع ملف ال DLL الذي تريد استخدامه في المسار الذي وضعته و من ثم قم بتشغيل التطبيق الذي يستعمل هذا الملف, لتجد ان التطبيق سوف يعمل.

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#18
اقتباس
ماهي انواع DLL ؟

حسب علمي هناك ثلاثة انواع من ملفات ال DLL وقد ذكرتها في المشاركة الاولى و هي:

اقتباس
في النهاية فكرة هامة جدا: هناك حالتان او اصبحوا ثلاثة بوجود .Net لطريقة استثمار Code موجود داخل ملف DLL:

1- الطريقة المعروفة و التقليدية هي ان نقوم بعمل مجموعة من التوابع و من ثم نقوم بتصديرها و يتم استخدامها من قبل تطبيقاتنا

2- الطريقة الثانية و هي استخدام تقنية Com (Component Object Model) و هي مقياس تم طرحه من قبل شركة Microsoft لبناء ال Component داخل ملفات DLL و امكانية استخدام هذه ال Component داخل جميع لغات البرمجة التي تدعم هذا الامر, اي اننا نستطيع ان نشارك object يتم صنعه في لغة ما و استخدامه في لغة اخرى.

3- الطريقة الثالثة: و هي استخدام .NET architecture و هي تقنية مشابهة لل Com و لا اعرف الكثير عنها بعد.

اقتباس
هل يمكن استعمال اي DLL مهما كانت لغة برمجتها ؟ اي C/C++ او Delphi او حتى VB

حسب علمي نعم لانه جميع اللغات تنتج ملفات DLL يمكنها ان تعمل لوحدها ففي دلفي نحن نستخدم الكثير الكثير من ملفات DLL المصنوعة بلغة C الصرفة او حتى C++ و ايضا يمكن استخدام DLL مصنوع بدلفي في C++ او C , و حتى في VB فهم ايضا يستخدمون دوال ال API الموجودة في ملفات DLL التابعة لويندوز و بالتالي يمكن استخدام ملف DLL المصنوعة بدلفي في VB.

طالما انّ ملف ال DLL يعمل في اللغة التي قامت بانتاجه فسوف يعمل في اي لغة اخرى,

و لكن هناك شرط مهم يجب الانتباه اليه عندما نريد كتابة اي ملف DLL هو اتفاق المعطيات بين اللغات فقد تختلف احجام المعطيات من لغة الى اخرى, و قد يكون ايضا هناك انماط خاصة بلغة ما مثل ال string في دلفي, لذلك دائما عندما نستخدم انماط في توابع سوف نقوم بتصديرها يجب علينا استخدام انماط نظام التشغيل و هي انماط C.

اذا قمنا بالانتباه الى المعطيات المرسلة و المستقبلة فلا اعتقد انه هناك مشكلة لان ملف ال DLL في النهاية سوف يكون Binary و هو مفهوم و يمكن التعامل معه مباشرة دون اي مشاكل.

قصة طريفة حصلت معي: في يوم من الايام طلب مني عمل DLL لربط مع شركة اخرى و ذلك لنقل البيانات لهم المهم اللغة التي اعمل عليها كانت دلفي و قمت يومها بصنع ملف ال DLL باستخدام انماط البيانات الخاصة بدلفي(integer,string,smallint) و قمت بعمل documentation و مثال بدلفي يتعامل مع ملف ال DLL و كل الامور كانت بالنسبة لي تمام, ذهبت الى شركة اخرى و هم يعملون على VC المهم اعطيته لهم و بدأت اشرح لهم على كيفية عمل التوابع و استدعاءها, و عندما رأى المبرمج الذي كنت اشرح له على الملف انني استخدم انماط خاصة بدلفي, مباشرة قال لي ان الملف لن يعمل عندنا ويجب عليك استخدام انماط standard, و خلاني قد الكمشة :unsure: فعلا خجلت بنفسي كثيراً يومها :D و لكني تعلمت و استفدت, اصبحت ادقق على هذا الامر كثيراً, كنت يومها اول مرة اصنع ملف DLL ليعمل على لغة اخرى.

الحلقة الثالثة: شرح مفصل عن كل من الطريقتين Static Loading و Dynamic Loading:

مقدمة: كلمة DLL تعني Dynamic Link Library اي مكتبة ربط ديناميكي, من الاسم نستنتج انه سوف يتم الربط بين التطبيق و ملف ال DLL و ذلك بشكل ديناميكي اي ليس ثابت و انما متغير

لاحظ انني وضع كلمة الربط بخط احمر وذلك لكي نميز بين الربط(Link) و التحميل(Load)

دعونا اولا نشرح الربط , هناك نوعان من الربط(Link)

الاول: Static Linking اي يتم الربط بين اي شيئ و اخر بشكل ثابت و هذا ما يتم استخدامه مثلاً عندما نقوم بضم وحدة (Unit) ما الى المشروع, حيث هنا يقوم ال compiler بذكائه بضم فقط الاشياء المستخدمة ليضعها داخل كود المشروع, اي يكون الملف الناتج يحتوي على هذه التوابع بداخله, اتمنى انّ الامور واضحة

الثاني: Dynamic Linking اي يتم الربط بشكل ديناميكي , هنا يتم الربط بين الملف التنفيذي و التابع الذي سوف يتم استدعاءه في ال Run Time, و كمثال عن هذه الطريقة في الربط هي ملفات ال DLL بحيث يكون ملف ال DLL يحتوي على التوابع و يتم استدعاءها من تطبيق مضيف ما.

الان قبل الانتقال الى الفقرة التالية افهم ما سبق حتى لا يكون هناك اي خلط في المفاهيم, افهم معنى كلمة Link جيدا و حاول ان تفرق بينها و بين Load.

عند استخدام ملف DLL كما قلنا سابقا سوف يبقى كود التوابع التي قمنا بكتابتها داخل ملف ال DLL و يتم فقط استدعاءها من قبل التطبيق و ذلك وقت التنفيذ بعد ان يتم تحميل كافة المكتبة في الذاكرة, الان لاستدعاء تابع ما من ملف ال DLL هناك طريقتين

الطريقة الاولى Static Loading:ننتبه هنا انه لم اقل ربط ساكن(static linking ) و انما قلت تحميل ساكن(static Loading)اي سوف يتم تحميل ال DLL الى الذاكرة بشكل ثابت, هذه الطريقة كنا قد استخدمناها في المثال السابق و اظن ان الامور واضحة و لا يوجد اي مشاكل

ملاحظة: من الافضل و الاصح ان يتم وضع تصريح التوابع المستوردة في Unit خاصة تكون شبيهة باسم ملف ال DLL, و ان يتم وضع متحول const يدل على اسم ملف ال DLL لكي لا نقوم بكتابة اسم الملف كل مرة.

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

ملاحظة: ليس شرط ان يكون اسم التابع في ملف ال DLL هو نفسه اسم التابع في التطبيق المستدعي و انما يمكن تغيير اسم التابع و وضع اي اسم نريده ثم نقوم بالاشارة الى اسم التابع الاصلي في ملف ال DLL و ذلك باستخدام Name directive .

الطريقة الثانية Dynamic Loading:

قد لا نحتاج دائما ان يتم تحميل مكتبة DLL عند اقلاع البرنامج, او قد لا يتم استخدام مكتبة ال DLL الا في امور ثانوية في البرنامج, تخيل معي ما يلي: لو فرضنا انه لدينا برنامج ما احد مهامه الثانوية ان يقوم بتصدير ملف ما بطريقة معينة و بصيغة معينة, التوابع المستخدمة في التصدير موجودة داخل مكتبة DLL فهنا السؤال الموجه لك هو

هل من الافضل تحميل هذه المكتبة عند اقلاع البرنامج, ام من الافضل تحميلها عندما يتم طلبها؟؟

طبعا سوف تقول لي تحميلها عند الطلب افضل, و ذلك لانه لا يتم استخدام هذه المكتبة الا في حالات قليلة و لا داعي لوجودها في الذاكرة طيلة فترة عمل البرنامج, انما فقط يتم تحميلها عند الاستخدام, مما يوفر في الذاكرة المستهلكة و الوقت المستهلك

كيفية استدعاء توابع من ملف DLL باستخدام طريقة Dynamic Loading:

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

procedure MsgBox;stdcall;
begin
  MessageBox(0,'ArabTeam2000','Hello',MB_OK);
end;

هناك خمس خطوات لعمل ذلك سوف نشرح كل منها من خلال مثال:

1- يجب علينا ان نعرف متحول لنمط تابع بحيث يكون مماثل تماما من حيث عدد ال Parameters والنمط المرجع للتابع الموجود داخل ملف ال DLL و ليس شرط ان يكون هناك تطابق في الاسماء بين التابع الموجود في التطبيق و التابع الموجود في ملف ال DLL

بتطبيق هذه الخطوة على التابع السابق نقوم بكتابة ما يلي:

var
DLLMsgBox: procedure;

هنا لم نقوم بوضع اي parameter للمتحول الذي قمنا بتعريفه, و في حال كان هناك parameters نقوم بوضعها على الشكل التالي:

var
DLLMsgBox: procedure(S:string;I:integer);

2- نقوم باستدعاء التابع LoadLibrary و هو تابع API و ذلك لكي نقوم بتحميل ملف ال DLL الى الذاكرة, هذا التابع يأخذ parameter و هو اسم ملف ال DLL و يعيد مقبض(Handle) لملف ال DLL يجب علينا تخزينه في متحول لكي نستخدمه لاحقاً, لذلك نكتب ما يلي

Var
DLLHandle: THandle;
Begin
  DLLHandle := LoadLibrary('Ex1.dll');
End;

3- نقوم باستدعاء التابع GetProcAddress و هو ايضا تابع API و ذلك لكي نحصل على مؤشر(Pointer) للتابع الموجود في ملف ال DLL , هذا التابع يأخذ parameters و هم المقبض(Handle) لملف ال DLL و الذي قمنا بتعريفه ووضع قيمة به في الخطوة السابقة, و يأخذ ايضا اسم التابع الموجود داخل ملف ال DLL , و يعيد مؤشر للتابع الذي كتبنا اسمه لذلك نقوم بوضع هذا المؤشر في التابع الذي قمنا بتعريفه(DLLMsgBox) و ذلك على الشكل التالي:

DLLMsgBox:= GetProcAddress(DLLHandle, MsgBox);

4- نقوم باستدعاء التابع الذي عرفناه و الذي بدوره سوف يقوم بستدعاء التابع الموجود في ملف ال DLL و يقوم بعرض الرسالة في حالتنا هذه

5- علينا تحرير المكتبة التي قمنا بتحميلها, لكي لا تبقى في الذاكرة و ذلك باستخدام التابع FreeLibrary و الذي يأخذ parameter و هو المقبض لملف ال DLL الذي قمنا بوضع قيمة به باستخدام LoadLibrary

طبعا ليس من الضروري استدعاء هذا التابع بعد انتهاء استدعاء التابع و انما تضعه حسب حاجتك, فقد تريد استخدام التابع المستورد مرة اخرى, لاستدعاء هذا التابع نكتب

FreeLibrary(DLLHandle);

امل ان تكون الخطوات سهلة وبسيطة عليكم, شرحتها قدر الامكان, تحتاج الى قليل من التعامل مع توابع API لتجد ما سبق سهل جدا عليك.

الان سوف نعود الى المثال الذي قمنا بعمله في الحلقة الثانية و نطور عليه و ذلك كما يلي:

سوف نضع زرين الاول اسمه Static Loading و الثاني اسمه Dynamic Loading , عند الضغط على الزر الاول نقوم باستدعاء التابع MsgBox و ذلك باستخدام طريقة static Loading و عند الضغط على زر Dynamic Loading نقوم باستدعاء التابع MsgBox وذلك باستخدام طريقة Dynamic Loading

ملاحظة1:

يجب علينا استخدام التعبير try..finally و ذلك لكي نتأكد من انه سوف يتم تحرير المكتبة حتى و لو حصل اي خطأ ادى الى وقف التنفيذ.

ملاحظة2: دائما نستخدم التابع Assigned و ذلك للتأكد من ان المؤشر العائد من التابع GetProcAddress به قيمة او يمكننا مقارنة المؤشر مع القيم nil.

ملاحظة3: في هذا التطبيق بما اننا قمنا باستخدام الطريقتين Static و Dynamic سوف يتم تحميل المكتبة اولا بالطريقة static لانها تنفذ عند اقلاع البرنامج , لذلك عند تحميل المكتبة باستخدام التابع LoadLibrary لن يتم اعادة التحميل مرة اخرى و انما سوف يقوم بالبحث عن اسم المكتبة اولا و اذا كانت محملة سوف يقوم باعادة مقبض لها مباشرة.

الكود بالكامل لحدث النقر على زر Dynamic Loading يصبح كما يلي

procedure TForm1.Button1Click(Sender: TObject);
var
  DLLMsgBox: procedure;
  DLLHandle: THandle;
begin
  DLLHandle := LoadLibrary('Ex1.dll');
  try
	{ DLLMsgBox points to MsgBox in Ex1.dll' }
	DLLMsgBox := GetProcAddress(DLLHandle, 'MsgBox');

	{ call the DLLMsgBox procedure }
	if Assigned(DLLMsgBox) then
	  DLLMsgBox
	else
	  MessageDlg('The specified routine cannot be found.',
		mtInformation, [mbOk], 0);
  finally
	FreeLibrary(DLLHandle);
  end;	   // try..finally
end;

في المرفقات ايضا المثال, طبعا للاستئناس فقط

امل ان تكونوا قد استمتعتم في هذه الحلقة و الى اللقاء في الحلقة القادمة, و التي سوف نأخذ فيها بأذن الله كيف يمكننا تمرير Strings بين التطبيق المضيف و ملف ال DLL مع شرح لكافة الامور المتعلقة, و قد نتطرق ايضا الى كيفية وضع Forms داخل ملف ال DLL و استدعاءها, اترككم بامان الله و رعايته و السلام عليكم.

Ex2.rar

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#19

السلام عليكم

عذرا متاخرا :unsure: ولكن ...

المهم قرأت الدرس الاخير اكثر من مرة لاثبت الافكار لكن لله الحمد بس فى مشكلة ما عرفت حلها لماذا هذا الخطأ (المثال فى المرفقات) ارجو ان تلقى نظرة يا اخ وائل وتعلمنى اين خطائى دون ان تصوبه وانا بالانتظار :rolleyes:

عندما فلت : (و ليس شرط ان يكون هناك تطابق في الاسماء بين التابع الموجود في التطبيق و التابع الموجود في ملف ال DLL

)

الان ربما لايهم ولكن ماذا اذا تقدمنا وقمنا بعمل مكتبة تختوى على الكثير من التوابع ربما تكون متشابهة فهل هذا لن يؤثر ام ان الامر مقتصر على فترة التعلم فقط

xdll.rar

تم تعديل هذه المشاركة بواسطة c_vita في 1 ديسمبر 2006 في 23:45

#20
اقتباس
المهم قرأت الدرس الاخير اكثر من مرة لاثبت الافكار لكن لله الحمد بس فى مشكلة ما عرفت حلها لماذا هذا الخطأ (المثال فى المرفقات) ارجو ان تلقى نظرة يا اخ وائل وتعلمنى اين خطائى دون ان تصوبه وانا بالانتظار

c_vita: لقد استخدمت Assign بدل من Assigned حيث ان التابع Assign هو خاص بالفورم في هذه الحالة

شيئ اخر

اقتباس
xdll:=getprocaddress(XDllhand,'arteam');

if Assign(arteam) then arteam // ما هو الخطاء هنا

انظر ماذا فعلت هنا لقد خلطت بين الطريقة الاولى و الثانية, لقد قمت بوضع تعريف xdll على انه Procedure و لكنك تستدعي arteam الذي وضعت تصريح له بالاعلى :) , بينما كان عليك ان تستدعي xdll حيث هو الان التابع الذي نريد استدعاءه.

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#21

ماشاء الله عليك أخي waeldalol

بجربها وردك

When You Started With Delphi ...You Could Not Stop!

delphiteam2.jpg

alharmoodiGropu.com

#22

السلام عليكم

اقتباس
عندما فلت : (و ليس شرط ان يكون هناك تطابق في الاسماء بين التابع الموجود في التطبيق و التابع الموجود في ملف ال DLL

)

الان ربما لايهم ولكن ماذا اذا تقدمنا وقمنا بعمل مكتبة تختوى على الكثير من التوابع ربما تكون متشابهة فهل هذا لن يؤثر ام ان الامر مقتصر على فترة التعلم فقط

انا اسف :unsure: السؤال ربما كان متسرع لان جوابه كان فى الخطوة :

اقتباس
DLLMsgBox:= GetProcAddress(DLLHandle, MsgBox);

فعذرا يا استاذ

تم تعديل هذه المشاركة بواسطة c_vita في 3 ديسمبر 2006 في 22:00

#23
waeldalol كتب:
قد يقول البعض لحظة انتظر لدي فكرة افضل مما سبق؟ اقوم بعمل patch للملفات التنفيذية عند الزبائن بمعرفة اين هو الخطأ في البرنامج و اقوم باصلاح الخطأ عن طريق هذا ال patch و تنتهي المشكلة!!, على ما اعتقد هذه هي الطريقة المتبعة في كثير من الاحيان التي نحتاج فيها الى تطوير او تحديث برنامجنا وخصوصا اذا كان حجمه كبير.

و لكن هل هذا سهل؟ ما هي المهارات المطلوبة حتى تقوم بانجاز هذا العمل؟صراحة لا اعرف أي شيئ عن هذه الطريقة؟ و لا اعرف كيف يتم صنع patch؟ هنا نحتاج feedback من اصدقاءنا الخبيرين في هذا المجال في المنتدى, اتمنى ان يصلوا الى هنا في قرأتهم!! حتى يفيدونا

اتاري منتدى الاسمبلي مليئ بالكنوز, وجدت هذه المشاركة الممتازة للاخ jass مراحل صناعة الباتش, تطبيق عملي

وعذراً لتأخري في وضع الدرس و ذلك بسبب الانشغال في العمل و الدراسة

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#24

شكرا لك الدرس الرائع

#25

السلام عليكم

يبدو ان الاستاذ مشغول شوية B)

لكن المهم نحن بالانتظار -waf

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

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