الشبكة العربية لمطوري الألعاب

خبير مدير وسام البهنسي مشاركة 11

وفي 16/شوال/1431 07:47 ص، أعرب NULL عن رأيه بالموقف كالآتي:

السلام عليكم
ربط الملف التنفيذي مع ملف DLL

DLL Tutorial For Beginner

http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c9855
يرجى الإطلاع .... شرح وافي و كافي

هذه الطريقة أعقد مما يلزم. فالمكتبات الديناميكية المكتوبة بـ ++C يمكن استخدامها في برامج ++C الأخرى بطريقة أرقى ولا تحتاج إلى تحميل المكتبة يدوياً. لكن بالمقابل الطريقة التي طرحتها أنت هي العامة والتي تنفع مع المكتبات المبنية بغير ++C، كما أنها تسمح بالتحميل المؤجل.

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  NULL مشاركة 12

في 16/شوال/1431 12:59 م، قال وسام البهنسي بهدوء وتؤدة:

هذه الطريقة أعقد مما يلزم. فالمكتبات الديناميكية المكتوبة بـ ++C يمكن استخدامها في برامج ++C الأخرى بطريقة أرقى ولا تحتاج إلى تحميل المكتبة يدوياً. لكن بالمقابل الطريقة التي طرحتها أنت هي العامة والتي تنفع مع المكتبات المبنية بغير ++C، كما أنها تسمح بالتحميل المؤجل.

وجهة نظرك صحيحة من ناحية درجة تعقيد الطريقة))))) و لكن أعتقد أولا و أخيرا سوف يحتاج حتما لمتل هذه الطريقة...فلا مانع من تعلمها
و بما ان بدأ تعلم С++ فأعتقد أنه مستعد لهذه الللغة التي وجدت و التعقيد جنبا إلى جنب...
شكرا

خبير  مهند محمد علي مشاركة 13

الاخ null جاري تجريب الطريقه انشاء الله 
لكن اذا كان هنالك طريقه اسهل فهذا افضل لي لانني لسه متوسط في السي بلس بلس
 
اما عن خطوات انشاء الملف هي مثل الملف الاستاتيكي تقريبا
(اختيار win32 dynamic link library   ثم   an empty DLL project ثم عمل ملف الكود وكتاب الداله وتعريفها)
ثم وضعها في نفس فايل الملف التنفذي مع العلم انيي قمت بتحديد مكانها في الخيارات في المكان المحدد 😠
مع ذلك  يوج 2error



.obj : error LNK2001: unresolved external symbol "int __cdecl sum(int,int)" (?sum@@YAHHH@Z)
Debug/11.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

مبتدئ  NULL مشاركة 14

في 16/شوال/1431 07:38 م، غمغم المهند باستغراب قائلاً:

ثم وضعها في نفس فايل الملف التنفذي مع العلم انيي قمت بتحديد مكانها في الخيارات في المكان المحدد مع ذلك  يوج 2error

ارسل ملفات المشروع....حتس نستطيع المساعدة بشكل أفضل
شكرا

خبير  مهند محمد علي مشاركة 15

اليك الملفين اخي
وشكرا مره ثانيه

خبير مدير وسام البهنسي مشاركة 16

وفي 16/شوال/1431 02:38 م، أعرب المهند عن رأيه بالموقف كالآتي:

اما عن خطوات انشاء الملف هي مثل الملف الاستاتيكي تقريبا
(اختيار win32 dynamic link library   ثم   an empty DLL project ثم عمل ملف الكود وكتاب الداله وتعريفها)
ثم وضعها في نفس فايل الملف التنفذي مع العلم انيي قمت بتحديد مكانها في الخيارات في المكان المحدد 😠
مع ذلك  يوج 2error

حسناً، هذا يعني أولاً أنك اخترت الطريق المبسط للتعامل مع الـ DLL وهذا أمر جيد. ملف الـ DLL الذي أنشأته صحيح ولا غبار عليه، لكن الخطأ في أنك لم تضبط استخدامه في الملف التنفيذي كما يجب.
 
لكل ملف DLL تتم ترجمته، ينتج معه ملف LIB مرافق لتبسيط الأمر على البرامج التي تود استخدام تلك الـ DLL بالطريقة المباشرة. فقط اربط مع ملف الـ LIB ذاك (يحمل نفس اسم الـ DLL) وسيستطيع الملف التنفيذي معرفة كامل تفاصيل تحميل الـ DLL تلقائياً، متضمناً إخبار المترجم أن الإجراء sum معرف في DLL.

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  NULL مشاركة 17

طريقة إنشاء المكتبة التي تؤمن عملية الجمع:
1 - أنشا مشروع DLL فارغ [dlibrary]   و ثم
2- أضف الملف الرئسي التالي [sum.h]  إلى المشروع و أكتب داخلة الكود التالي




#ifndef _SUM_H_
#define _SUM_H_

extern "C" __declspec(dllexport) int Sum(int ,int);

#endif


3- أضف الملف التالي [sum.cpp] إلى المشروع و أكتب داخلة الكود التالي


#include "sum.h"


extern "C" __declspec(dllexport) int Sum(int x,int y)
{
	return x + y;
}

ترجم المشروع .... يجب أن يكون تولد لديك ملفين

dlibrary.dll
dlibrary.lib

هذه الخطوة الأولى...

مبتدئ  NULL مشاركة 18

الطريقة الأولى لربط المكتبة [dlibrary.dll] مع ملف تنفيذي:
تحتاج إلى الملفات التالية :

dlibrary.dll
dlibrary.lib
sum.h

- أنشا مشروع Win32 فارغ []   و ثم
2- أضف الملف التالي [main.cpp]  إلى المشروع و أكتب داخلة الكود التالي


#include 
#include "sum.h"

using std::cout;

void main()
{

	cout << Sum(1,1);
    getch();
}

ضع الملف dlibrary.dll جانب الملف التفيذي
و باقي الإعدات في الملف المرفق

ترجم المشروع ....

مبتدئ  NULL مشاركة 19

الطريقة الثانية لربط المكتبة [dlibrary.dll] مع ملف تنفيذي:
تحتاج إلى الملفات التالية :

dlibrary.dll  فقط



- أنشا مشروع Win32 فارغ []   و ثم
2- أضف الملف التالي [main.cpp]  إلى المشروع و أكتب داخلة الكود التالي



#include 
#include 
#include 
#include 

using std::cout;
using std::endl;


typedef int (*SumFunc)(int,int);


void main()
{
   SumFunc _SumFunc;

   HINSTANCE hLib = LoadLibraryA("dlibrary.dll");
    if(hLib == NULL)
    {
       cout << "Unable to load library!" << endl;
       getch();
       return;
    }


   _SumFunc =(SumFunc)GetProcAddress((HMODULE)hLib, "Sum");
    if(_SumFunc == NULL)
    {
       FreeLibrary((HMODULE)hLib);
       return;
    }

	cout << _SumFunc(1,1);

	FreeLibrary((HMODULE)hLib);

    getch();
} 

لا نتسى ضع الملف dlibrary.dll جانب الملف التفيذي


ترجم المشروع ....

خبير  مهند محمد علي مشاركة 20

شكرا للجميع اخواني الاعزاء