المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : إنشاء مكتبات الربط الديناميكية ( فيجوال سي ++)


نجيب المجيدي
21-03-2005, 10:43 AM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

هذا واحد من المواضيع الهامة لأبعد حد , فكل مبرمج لابد و أنه قد تعامل بشكل أو بآخر مع المكتبات , و بالذات مبرمجي vb6 حيث أن هذه اللغة الرائعة لها أيضاً بعض العيوب حيث أنها مثلاً لا تدعم Multithrading و كذلك نلمس القصور في هذه اللغة عندما نحاول التعامل المباشر مع الهارد وير وغير ذلك , و عموماً نستطيع التخلص من هذا العيب وذلك باستخدام مكتبات الربط الديناميكية , فما هي هذه المكتبات وكيف نقوم بإنشائها؟
هذا ما أحاول الإجابة عليه أدناه , فأقول مستعيناً بالله:

إن مكتبات الربط الديناميكية هي تلك الملفات التي تنتهي بالامتداد DLL اختصاراً لـ (Dynamic Linked library) وهي تختلف عن المكتبات الاستاتيكية في أن المكتبات الاستاتيكية ترتبط بالبرنامج التنفيذي وقت الترجمة بينما المكتبات الديناميكية ترتبط به وقت التنفيذ, وما دوال API إلا مكتبات ربط ديناميكية تحتوي على دوال يستخدمها النظام و نستطيع نحن الاستفادة منها أيضاً.

سنقوم هنا بعمل مثال بسيط لمكتبة ديناميكية تحتوي على دالة تقوم بجمع رقمين و إعادة الناتج ...

* المتطلبات: VC++6 , VB6

أولاً: قم بتشغيل vc++ و من القائمة "ملف" اختر "جديد"
File --> New
ومن ثم من التبويب Objects اختر Win32 Dynamic - link library وضع اسماً للمشروع و ليكن ( Ex1 )
بعد ذلك اختر a simple DLL project ثم إنهاء

الآن أشر للملف Ex1.cpp من FileView , و أظف الكود التالي:

int _stdcall sum(int x , int y)
{
return x+y;
}

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

و الآن بقي أن ننشيء ملف .def , من القائمة File اختر New و اختر text file من التبويب Files

قم بتسمية هذا الملف بـ "Ex1.def"
أضف الكود التالي للملف

LIBRARY Ex1

EXPORTS
sum @1

و أخيراً اختر Build Ex1.dll من القائمة Build و تأكد بأنه لا توجد أخطاء .

في حال نجحت عملية البناء , تكون المكتبة جاهزة للاستخدام في المجلد Debug نقوم بنسخها إلى المجلد system أو system32, و يمكن استدعائها من الفيجوال بيسك كالتالي:

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

Private Declare Function sum Lib "example1.dll" (ByVal x As Long, ByVal y As Long) As Long
Private Sub Command1_Click()
Text3.Text = Str(sum(CInt(Text1.Text), CInt(Text2.Text)))
End Sub

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



تحياتي

و السلام عليكم ورحمة الله وبركاته

وردةاليمن
26-03-2005, 12:56 PM
شكرً على هذا البرنامج وهناك ملاحضه في الكود
Private Declare Function sum Lib "example1.dll"
حيث احنا سمينا المكتبه في ملف def
LIBRARY Ex1
هناك سأل آخر ما المقصود لما عملنا هذه الكود في ملف def???
LIBRARY Ex1
EXPORTS
sum @1
هل المقصدو ان المكتبه اسمه Ex1 و الدله هي sum??
و شكراً مره آخرى

وردةاليمن
26-03-2005, 01:04 PM
نسيت ما أقلك مارضي يشتغل البرنامج رساله الخطئ يقول
انه ما حصل مكتبه ُُEx1
مع اني عملت جميع الخطوات
بس حبيت أتأكد هل نضع الكود تبع الvb مباشره اي نفتح ملف الكود و نكتب الشفره أو بالأصح نسخ الكود له فأنا عملت عملية النسخ و الصق عشان اتفدئ الخطئ!!!!

نجيب المجيدي
31-03-2005, 09:57 AM
بسم الله الرحمن الرحيم

Private Declare Function sum Lib "example1.dll"
حيث احنا سمينا المكتبه في ملف def
LIBRARY Ex1

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

إذاً سيكون الاستدعاء في الفيجوال بيسك بالشكل التالي:

Private Declare Function sum Lib "Ex1.dll"

========================================
========================================

هناك سأل آخر ما المقصود لما عملنا هذه الكود في ملف def???
LIBRARY Ex1
EXPORTS
sum @1
هل المقصدو ان المكتبه اسمه Ex1 و الدله هي sum??

تماماً أختي , هذا بالضبط ما هو مقصود , إلا أن السطر
EXPORTS
sum @1

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

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

حاولي ما سبق , و سأحاول في أقرب فرصة إرفاق برنامج مفتوح يضم جميع ما سبق.

تحياتي

و السلام عليكم ورحمة الله