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

اسئلة بخصوص ال DLL

مغلق
بدأه الاخير زمانه في 6 أغسطس 2006 · 2 رد · 515 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

موضوع كتابة ملفات dll .. انا الان غارق فيه و تواجهني بعض الصعوبات في فهم بعض المفاهيم ..

ارجو ان تفيدوني ..

- بسم اله نبدأ –

قبل ان ابدء بالاسئلة العملية ..

انا حابب افهم بعض الشغلات الاساسية ..

الان ملفات ال dll هي التي تحوي على الدوال التي يستخدمها البرنامج ، تمام ؟؟

طيب كيف هذا البرنامج يصل الى هذه الدوال ؟؟

يعني .. انا عندما اكتب dll خاصة بي واضع فيها الدوال .. وعندما اريد ان استخدم هذه الدوال من برنامج ثاني ، يجب اولا ان احمل هذه المكتبة باستخدام دالة LoadLibrary ثم بعد ذلك يجب ان احصل على عنوان الدالة ثم بعد ذلك استخدمها .

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

يعني لو استخدمت مثلا دالة ال messagebox كيف سيتم التعرف على هذه الدالة ؟؟

و هل لملفات ال lib دخل في ذلك ؟؟

مثلا USER32.LIB هي التي تستدعي دوال USER32.DLL ؟؟

حسنا .. واذا كانت ملفات ال lib ، تحوي على الدوال .. ما الفائدة وضرورة عمل dll ؟

(و هل من الممكن عمل ملفات lib خاصة بي ؟؟ )

\\\\

الان ندخل الى التطبيق العملي ..

احدى مشاركات اخونا chik وضح على عجالة كيف يمكن ان نكتب ملف dll (تحديدا في موضوع ما هو الفرق بين ال dll المكتوبة بال c++ و المكتوبة بال vb )

هذه هو الكود الذي ارفقه الاخ chik في مشاركته

#include <windows.h>
int Somme(int,int);
int Mult(int,int);
BOOL APIENTRY DllMain( HANDLE hModule, 
					  DWORD  ul_reason_for_call, 
					  LPVOID lpReserved
	 )
{
   return TRUE;
}

int Somme(int x,int y)
{
// _asm int 3;
int s=x+y;
return s;
}
int Mult(int x,int y)
{
int m=x*y;
return m;
}

وهو واضح وما في شي ..

ثم الخطوة التالية ..

اقتباس
وللتصدير هناك 3 طرق وأنا أفضل وأستعمل طريقة .def ولهدا يجب أن نكتب ملف من نوع .def ونزيده إلى المشروع وملف .def الدي سيصدر الدالتين سيكون على الشكل التالي :

LIBRARY test3

EXPORTS

Somme

Mult

الان ..

ممكن شوية توضيح عن هذا الملف .. وما فائدتة ؟؟

وما هي بقية الطرق ؟؟

ثم اضاف ..

ولكي نستعمل هده الدوال في برنامج آخر يمكن أن نقوم بما يلي علما أن هناك طرق أخرى :

typedef int (* SOM)(int,int);
typedef int (* MULT)(int,int);
HMODULE hmod=LoadLibrary("D:Test3\\Debug\\test3.dll");
SOM sm=(SOSO)GetProcAddress(hmod,"Somme");
int Sresult=sm(15,8);
MULT mlp=(MULT)GetProcAddress(hmod,"Mult");
int Mresult=mlp(6,5);
FreeLibrary(hmod);

عندما نفذت هذه الخطوات ..

ظهر لي الخطأ التالي ..

error C2065: 'sm' : undeclared identifier

و نفس الشيء بالنسبة ل mlp .

ما هو السبب ؟؟

مثال ثاني ..

من msdn

Using Load-Time Dynamic Linking

#include <windows.h> 

VOID myPuts(LPTSTR);   // a function from a DLL

VOID main(VOID) 
{ 
	myPuts("message printed using the DLL function\n"); 
}

هنا طريقة الاستخدام اختلفت عما ذكر chik ..

ما المقصود بالتالي ..

Because LOADTIME.C calls the DLL function explicitly, the module for the application must be linked with the import library MYPUTS.LIB

و في مثال ثاني تحت عنوان

Using Run-Time Dynamic Linking

استخدم نفس طريقة الاخ chik (لن اكتب المثال لأن المشاركة اصبحت طويلة !!!!!!!!)

لكن كان تحته هذا التعليق ..

Because the program uses run-time dynamic linking, you should not link with the import library when creating the program module

ما المقصود ؟؟

وما هو الاختلاف بين الطريقتين (و خاصة التعليقين في اللغة الانكليزية اللذان كتبتهما ms تحت كل مثال ) ؟؟؟

لم انتهي بعد :huh:

لكن لا اريد ان اثقل عليكم (ولو اني اكيد ثقلت B) )

اتمنى ان يكون هناك ردود لتزداد الفائدة ..

و جزاكم الله كل خير ..

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#2

أخوي البرنامج صحيح وما عليه غبار بس حول SOSO إلى SOM

وبالنسبة لهذا الموضوع فأن أحس إنه إشبع لكن ما يمنع إنا نوضح بعض المفاهيم بإختصار

توجد 2 طرق لربط الدوال بعضها ببعض :-

1) static linking :- وهي إما عند Compile-time مثل المتغيرات والدوال اللي في نفس الملف

أو عند linking-time مثل المتغيرات العمومية والدوال اللي في ملفات مختلفة

طبعاً كلها هذه قبل تكوين ملف تنفيذ للبرنامج وهذه ما تهمنا .

2) Dynamic linking :- وهي نوعين

1) وقت تحميل البرنامج إلى الذاكرة أي عند الـــ Load-Time وهذه شغلت نظام التشغيل فيقوم بتحميل جميع ملفات dll المطلوبة .

2) وقت التنفيذ Run-Time :- وهذه البرنامج يقوم فيها بنفسه يعني بإستخدام دوال LoadLibrary و FreeLibrary .

أتمنى إني وضحت الصورة بشكل سريع ;)

#3

السلام عليكم ..

شكرا اخي الكريم على الرد ..

كنت اتمنى من بقية الاعضاء المرور ..

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

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

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