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

الكاتب : نجيب المجيدي   المشاهدات : 2,201   الردود : 3    ‏2005-03-21
      مشاركة رقم : 1    ‏2005-03-21
  1. نجيب المجيدي

    نجيب المجيدي عضو فعّال

    التسجيل :
    ‏2003-12-08
    المشاركات:
    527
    الإعجاب :
    0
    بسم الله الرحمن الرحيم
    السلام عليكم ورحمة الله وبركاته

    هذا واحد من المواضيع الهامة لأبعد حد , فكل مبرمج لابد و أنه قد تعامل بشكل أو بآخر مع المكتبات , و بالذات مبرمجي 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
    إذا مر كل شيء على ما يرام نكون قد نجحنا في بناء أولى مكتباتنا الديناميكية الخاصة , ويكون المجال مفتوحاً لعمل الكثير الكثير ...



    تحياتي

    و السلام عليكم ورحمة الله وبركاته
     
  2.   مشاركة رقم : 2    ‏2005-03-26
  3. وردةاليمن

    وردةاليمن عضو

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

    وردةاليمن عضو

    التسجيل :
    ‏2005-03-18
    المشاركات:
    70
    الإعجاب :
    0
    نسيت ما أقلك مارضي يشتغل البرنامج رساله الخطئ يقول
    انه ما حصل مكتبه ُُEx1
    مع اني عملت جميع الخطوات
    بس حبيت أتأكد هل نضع الكود تبع الvb مباشره اي نفتح ملف الكود و نكتب الشفره أو بالأصح نسخ الكود له فأنا عملت عملية النسخ و الصق عشان اتفدئ الخطئ!!!!
     
  6.   مشاركة رقم : 4    ‏2005-03-31
  7. نجيب المجيدي

    نجيب المجيدي عضو فعّال

    التسجيل :
    ‏2003-12-08
    المشاركات:
    527
    الإعجاب :
    0
    بسم الله الرحمن الرحيم

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

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

    كود:
    Private Declare Function sum Lib "Ex1.dll"
    ========================================
    ========================================

    تماماً أختي , هذا بالضبط ما هو مقصود , إلا أن السطر
    كود:
    EXPORTS
    sum @1
    يدل على الدوال التي يمكن استدعاءها من خارج المكتبة , إذ قد توجد دوال أخرى نضعها للاستخدام الداخلي في المكتبة و ليس لتصديرها إلى برامج خارجية

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

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

    تحياتي

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

مشاركة هذه الصفحة