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

مالفرق بين ملفات DLL و LIB

مغلق
بدأه Abdullah.Alshammeri في 5 يوليو 2005 · 11 رد · 1,437 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم :

اضنكم قرأتم لسؤال ..
حاولت البحث عنه بالمنتدى لكن محرك البحث مش مجدي ..



مالفرق بينها ..
نعرف ان ملف الهيدر للاعلان عن الدوال .
وكنت في السابق والى الان اعتقد واتوقع ان ملف LIB يحتوي على بيانات الدوال او الكلاس .. يعني نفس ملف CPP لكن مشفر ..
وملف DLL ماذا يعني
Dynamic Link Library (DLL) is a program that holds one or more functions or some functionality that other programs can use
الكلام السابق وجدته بعد بحث ... لكن اذا كان الكلام السابق صحيح ؟؟ اذا مالفرق بين DLL و الملف الرأسي او المكتبة LIB.,,,,,,,

المكتبات اذا استخدمتها فانها تطلب منك
ربط الملفات الرأسية والمكتبية ..
نسخ ملفات DLL الى النظام او في مجلد البرنامج ....


احس ان الموضوع صار لغز..اتمنى احد يعرف ؟

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 2 مارس 2014 في 23:19

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

lib = library

أثناء عمل كومبايليشن للكود هناك مرحلة اسمها linking يتم فيها ملء الفراغات, و من ضمنها استدعاءات الدوال الموجودة في هذا الـ lib.

dll = dynamic link library

حيث عملية الـ linking تتم ديناميكيا, يعني اثناء تشغيل البرنامج و ليس اثناء الكومبايليشن.

مثال:

برنامج يستخدم مكتبة على هيئة lib:

أثناء كمبلة البرنامج يتم استخدام الـ .lib لملء الفراغات في البرنامج ثم ينتج لك ملف exe.

عندما توزع البرنامج فلا تحتاج ان توزع معه الـ lib لانه استخدمناه و خلصنا منه.

برنامج يستخدم مكتبة على هيئة dll:

اثناء كمبلة البرنامج لا يتم استخدام dll لملء الفراغات, بل ما ينتج لنا هو exe يعتمد على الـ dll, يعني لما توزع البرنامج على المستخدمين تحتاج توزع معه ملف الـ dll.

ببساطة: الـ lib يحدث الـ linking اثناء الكمبلة.

الـ dll يحدث الـ linking اثناء التشغيل (يعني حسب ما أظن, يتم استدعاء الدوال من ملف الـ dll)

هذا و جدير بالذكر ان هذه مجرد فكرة عامة سطحية و مبسطة, اما التفاصيل فأنا لا اعرف عنها شيء :lol: يمكن واحد ثاني يفيدك اكثر.

#3

حلوة...... وجدير بالذكر ..... : )

---

طيب الان هناك محركات العاب ... مثلا ogre او اي مكتبة ... تطلب منك ملف المكتبة اللي هو lib وملف dll .... لماذا ..

اتمنى تركزون على لماذ ا... ؟؟ الله لا يهينكم ..

تم تعديل هذه المشاركة بواسطة الشـمري في 5 يوليو 2005 في 06:41

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

شوف انا اعرف فائدة للـ dll, حيث تسهل عملية الـ update, كيف؟

لان للـ dll هو عبارة عن كود مفصول عن الـ exe, فيمكن تغيير الـ dll دون ان يعرف بذلك الـ exe (مثل ما تغير محتويات دالة مثلا, اسم الدالة سيظل هو هو .. و الكود اللي تستدعي الدالة ما راح تتأثر,و لكن كيفية تنفيذ الدالة ستتغير)

مثلا الدايركت اكس دائما يأتي على شكل ملفات dll علشان لما تنزل نسخة جديدة كل ما عليك هو تركيب الـ dll الجديد و ستسمر الالعاب في العمل دون تأثر.

تخيل لو كان الدايركت اكس عبارة عن ملفات lib :lol:

#5

الـLIB هى ملفات object للدوال التى تستعملها أما الـDll هى نسخة Excuteable من الكود

موضوع تغيير الـDLL ده مش صحيح بيحصل ديما مشاكل و الـEXE بيحس بيها

الأخ hasan_aljudy أنت مسمعتش عن DLL hell

:)

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#6

ملفات .Lib - library ستاتيكيه في المشروع فقط و هي فقط تستخدم للربط من داخل المشروع و يتبعها ملفات .h - هذه الملفات تحتوي علي الكود الاساسي لملف التعريف .h و تستخدم للمطورون في مكتبات التطوير لربط المبرمج بالدوال المكبسله في المكتبه مثل دوال مالتميديا الويندوز winmm.lib .

ملفات .dll ديناميكيه الربط ، تستخدم خارج المشروع و تقوم بتحميلها باستخدام دوال الويندوز LoadDLL و هي عبارة عن الدوال التي يحتاجها الملف التنفيذي التي استخدمتها في مكتبات .lib و قمت بربطها في المشروع .

المرجع : لا يوجد

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#7

الحمدلله يوضحت كثير من الامور..

لكن فيه شوي تساؤلات :

اللي فهمته :

ان ملفات lib تستخدم اثناء ترجمت البرنامج ... يعني ملفات lib شبيهة بملفات cpp لكن مشفرة ..

طيب وملفات dll

"""و هي عبارة عن الدوال التي يحتاجها الملف التنفيذي التي استخدمتها في مكتبات .lib و قمت بربطها في المشروع . ""

طيب :: الان لو سويت ملف dll جديد من خلال الفيجوال سي..

تختار / win32 dynamic link library

وتسوي المشروع ..

ثم تضغط F7 لينتج لك ملفين

dll

lib

ملف lib عرفنا فائدته هنا ...

طيب ملف dll الذي نشأ الان ... بماذا سأستفيد منه ... يعني لو حذفته ... سيتم تنفيذ البرنامج .... !!

حاولت تطبيق ذلك عمليا ...انشأت dll و lib >>ولكن صار فيه شويت مشاكل .. تحتاج لراحة بال..

المهم ..

الامور توضحت حول الملف lib والملف dll ..اعتقد ايضا توضحت .. لو انه توجد شوية " ؟؟؟ "

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

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#8

السلام عليكم وبعد

فى الاساس و كما تعلم ان ال dll ليس الا PE الشئ الذى يجعله يحتوى الكود لعدة

دوال مصدرة, و يمكن ايضا ان يستورد دوال, اما عملية استخدام دالة حارجية, فهناك طريقتان

للاستيراد.

1/ ان تستورد الدالة من ال dll مباشرة كما تفعل الفيروسات , حيث تستعمل كل من الدالتين

LoadLibary و الدالة GetProcAddess بحيث ان الاولى تحمل المكتبة الى الذاكرة

و تعطيك مقبض اليها Module handle ثم من بعد ذلك تمرر كل من المقبض و اسم الدالة,

او ما يسمى بال Ordinal (لا اعرف اهذه الكلمة ترجمة ) و هى سوف تعيد لك عنوان الدالة

و بعد ذلك ليس عليك الا الاستحدام للدالة.

هذه الطريقة تتطلب وجود كل من الدالتين LoadLibrary و GetProcAddress , و لكن

اذا بدانا من الصفر فلن يكون لدينا و لا حتى هذه الاعناوين , الشئ الذى يتعب معظم الفيروسات

فى الوصول اليه , اما اذا كان لدينا كل من LoadLibrary و GetProcAddress. فيمكن

ان تعتبر نفسك قد امسكت الشريان الحى و يمكن ان تفعل اى شئ . اسف على الخروج عن الموضوع

2/الطريقة الثانية هى ان تستورد الدوال من Lib و فى هذه الطريقة كما وضح الاخوة جزاهم الله كل خير

يقوم ال compiler بلصق هذه الدوال داخل الملف التنفيذى و يربط عناوينها بصورة مباشرة.

الشئ الذى ينتج عنه عده عيوب منها

ا/زيادة حجم الملف التنفيذى, و تكرار وجود نفس المكتبة فى عدة ملفات تستخدمها.

ب/بما ان الربط يكون استاتيكيا اذن ,اذا حدث اى تعديل فى المكتبة يتطلب ذلك اعادة compile

للبرنامج من جديد.

كل من هذه العيوب يتم تفاديه باستحدام ال dll

3/ اما الطريقة الثالثة و الاخيرة, فهى ان ندمج الطريقة الاولى مع الثانبية. يعنى ماذا ؟؟؟؟؟؟؟؟؟

يتم ربط الملف ب lib يصورة استاتيكية, و فى نفس الوقت, يؤدى استدعاء هذه الدوال الى الربط

الديناميكى بال dll , و لهذا السبب انتج لك compiler كل من dll و lib , اذ ان lib لا يحتوى

على اكثر من stub للدوال الاصلية فى ال dll.

فى اغلب الاحوال الطريقة الاحيرة هى الاكثر استحداما فى الcompiler

#9

مشكور .. يا justnow .. الطريقة الاولى والثانية 100% الثالثة 80% : ) مفهومة ..

نعم .

سويتوا لي انعاش للذاكرة ..

ملفات lib ستاتيكية ..وتدمج مع البرنامج

و dll دايناميكية ,وتفصل عن البرنامج .

اعتقد رأيت تلك النقطة في MFC .....

--

لكن ستاتيكية ودايناميكية بنفس الوقت .. هذه جديدة ..

لكن كلام احمد صالح

"""""و هي عبارة عن الدوال التي يحتاجها الملف التنفيذي التي استخدمتها في مكتبات .lib و قمت بربطها في المشروع . """""

اعتقد ازال بعض اللبس اللي عندي ..

لكن : DLL و LIB بنفس الوقت ؟؟؟

والله يعينكم على هالاسئلة : )

تم تعديل هذه المشاركة بواسطة الشـمري في 5 يوليو 2005 في 21:51

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#10

هناك ايضاً امر مهم فى الفرق بين الـDll والـlib مر عليه الاخوه ولكن بدون توضيح, هذا الفرق هو انك عندما تقوم باستخدام نفس الـdll فى اكثر من برنامج فانت لن تحتاج سوى نسخه واحده للمكتبه فى الذاكره, على سبيل المثال مكتبات user32 و kernel32 وغيرها الكثير من مكتبات الوندوز تكون موجوده فى الذاكره بإستمرار, يعنى لو قمنا بعمل نافذه جديده تستخدم اوامر من احد هذه المكتبات فكل ما نقوم به هو إستدعاء هذه الاوامر والتى تكون اصلاً موجوده فى الذاكره..

بانسبه للحاله الاخيره التى ذكرها الاخ justnow الـlib التى تكون متصله بـdll تحتوى فقط على عناوين الدوال فى الموجوده فى الـdll ولكن إذا استخدمت ملف lib غير متصل بملف dll فإن هذا الملف يحتوى على الدوال نفسها..

لذلك عندما تستدعى داله مثل MesageBox فإنك تستعين بملف lib وهذا الملف يحتوى على عنوان الداله بالضافه إلى عدد المعطيات التى تتطلبها الداله, وهنا يمكنك إكتشاف الخطاء البرمجى,, لنفرض انك إستدعيت داله فى ملف dll بالاستعانه بملف lib وقمت بإرسال متغير من نوع لا تدعمه الداله, فى هذه الحاله ستكتشف الخلل عند القيام بعمليت اللنك, ,, اما إذا كنت تستخدم dll فقط فلن تكتشف المشكله قبل تشغيل اليرنامج...

وعلى فكره عندما تستخدم lib معينه فإنك تستخدم معها h. فى لغة السى بلس بلس او inc. فى لغة الاسمبلى وهذه الملفات تسهل عليك إكتشاف الخطاء عند عملية الكمبايل..

بأختصار الفروق هى على النحو التالى

lib. تدمج الكود فى الملف التنفيذى من ما يؤدى إلى زياده حجم الملف اما dll. فلا تدخل الكود داخل الملف من ما يجعل البرنامج فى حاجه إلى ملف الخارجى dll.

فى كلا الحالتين حجم البرنامج ككل لن يتغير إلا إذا استخدم مكتبات الdll فى اكثر من برنامج..

يمكنك إستخدام الامر dumpbin فى شاشة الـConsole لتشاهد الدوال الموجود على النحو التالى مثلاً

C:\WINDOWS\system32>dumpbin kernel32.dll /exports

سوف تظهر لك شاشه تحتوى جميع الدوال الموجوده فى هذا الملف kerner32.dll ولكن احذر لان الملف كبير جداً ربما من الافضل ان تستخدم الامر بإضافة الداله file.txt <<

ثم تشاهد محتوى الملف...

والسلام عليكم

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#11

جزاكم الله خير.. شرح واضح .. لو اني اجزم .. ان التطبيق افضل طريقة ..

!!! لكن الوقت !!!

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#12

اشكرك اخى المشرف على التعقيب

الجميل و الكلام الواضح.

و ادامك للمنتدى

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

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