السلام عليكم ورحمة الله وبركاته
قرأت في هذا المنتدى عن ملفات dll وعن كيفية عملها وفائدتها في كيفية التقليل من حجم البرنامج التنفيذي ..... والخ
وقرأت الفرق بينه وبين ملفات lib. وكيفية التعامل معها ... الخ >>> كثيرة كلمة ( الخ ) في المشاركة :D
لكن اللي لفت انتباهي ان اثناء النقاش بين في ملفات dll و lib انه الكمبايلرات الحديثة تضع ملف تستخدم ملف lib و dll معاً
بحيث يحتوي الملف lib على عنوان الدالة بالاضافة الى بعض البيانات عن ما تتطلبه الدالة ويحتوي ملف dll عن الدالة نفسها
حتى يمكن للكمبايلر اكتشاف الاخطاء في عملية الربط وللتأكيد وهذا ما قاله الاستاذ احمد غريب في أحد هذه المشاركات
اقتباسبانسبه للحاله الاخيره التى ذكرها الاخ justnow الـlib التى تكون متصله بـdll تحتوى فقط على عناوين الدوال فى الموجوده فى الـdll ولكن إذا استخدمت ملف lib غير متصل بملف dll فإن هذا الملف يحتوى على الدوال نفسها..
لذلك عندما تستدعى داله مثل MesageBox فإنك تستعين بملف lib وهذا الملف يحتوى على عنوان الداله بالضافه إلى عدد المعطيات التى تتطلبها الداله, وهنا يمكنك إكتشاف الخطاء البرمجى,, لنفرض انك إستدعيت داله فى ملف dll بالاستعانه بملف lib وقمت بإرسال متغير من نوع لا تدعمه الداله, فى هذه الحاله ستكتشف الخلل عند القيام بعمليت اللنك, ,, اما إذا كنت تستخدم dll فقط فلن تكتشف المشكله قبل تشغيل اليرنامج...
فالانا الان اعرف كيف استخدم ملفات dll لوحدها في المشروع او ان استخدم ملفات lib في المشروع لكن كيف اقدر ادمج الملفان في المشروع
جربت ان اضع هذا الكود في المشروع لكن دون فايدة
#pragma comment(lib , "test.lib")
ما نفعت الطريقة جربتها عن طريق project > settings > link ما نفعت الطريقة لان الدالة اي نوع ارسلها تستقبله بدون اي اخطاء ؟
وهذا ملف مشروع dll
#include<windows.h>
int sum ( int &i , int &j)
{
return i+j;
}
BOOL APIENTRY DLLMain(HANDLE hModle ,DWORD d,LPVOID l)
{
return true;
}وهذا ملف مشروعنا
#include<iostream>
#include<windows.h>
#pragma comment(lib , "test.lib")
struct f{ struct g{int h[5];}t;};
int main()
{
typedef int (* SOM)( f & , int &);
HMODULE hmod=LoadLibrary("test.dll");
if(hmod == 0 )
return 0;
SOM sm=(SOM) GetProcAddress(hmod,"sum");
int j=5;
f g;
g.t.h[1] = 55;
int Sresult = sm( g ,j);
std::cout<<Sresult<<"\n";
FreeLibrary(hmod);
return 0;
}وش اللي انا غلطان فيه ولازم اصلحه