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

ربط ملفات dll مع lib في مشروع واحد

مغلق
بدأه b.m.s في 20 يوليو 2005 · 1 رد · 627 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

قرأت في هذا المنتدى عن ملفات 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;
}

وش اللي انا غلطان فيه ولازم اصلحه

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

#2

السلام عليكم

الله يهديك يا bms اسئلتك دائماً معقده...

انا خبرتى ضعيفه فى السى بلس بلس ولكن العمليه سهله جداً فى الاسمبلى نفترض ان لديك ملف dll وفى داله واحده داله واحده تاخذ متغيرين على النحو التالى :

mysum proc x:dword,y:dword
....
....
endp

إذا اردت القيام بعلم ملف .lib يجب عليك بعمل ملف اسمبلى يحتوى على نفس الداله ولكن بدون شفره على النحو التالى:

mysum proc x:dword,y:dword
endp

ثم تقوم بعلم ملف def يحتوى التالى :

LIBRARY mydll
EXPORTS
mysum

بعد ذلك تقوم بعمل كمبايل ولنك للاداة على النحو التالى

ml /c /coff /Cp mydll.asm
link /DLL /def:mydll.def /NOENTRY /subsystem:windows mydll.obj

الفكره لا تختلف كثيراُ فى السى بلس بلس ولكن لا اعرف الميكانيكيه التى يتم بموجبها كتابة الدوال ربما يستطيع احد الاخوه تجربة الفكره فى السى بلس بلس, واعتقد والله اعلم ان هناك طريقه اوتوماتيكيه لعمل ملف def. وملف lib. فى السى بلس بلس ولكنى معى الاسف لا اعرفها..

الفكره من إستخدام مكتبات lib. هى انك لن تحتاج لعمل الخطوه التاليه

SOM sm=(SOM) GetProcAddress(hmod,"sum");

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

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

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

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

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

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

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