السلام عليكم ورحمة الله وبركاته ..
موضوع كتابة ملفات 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) )
اتمنى ان يكون هناك ردود لتزداد الفائدة ..
و جزاكم الله كل خير ..