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

ما هو الفرق بين ال dll المكتوبة بال c++ و المكتوبة

مغلقرائج
بدأه طارق إبراهيم في 23 أكتوبر 2003 · 66 رد · 11,642 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ما هو الفرق بين ال dll المكتوبة بال c++ و المكتوبة بال vb

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#2

السلام عليكم,

إن DLL المكتوبة ب VB قد نعتبرها نفسها مثل المكتوبة ب س++ شكلا إلا أن المكتوبة ب VB لا تقرأ أو لا تستعمل إلا في برامج vb .أما إذا كنت ترغب في برمجة DLL ليستعملها أي برنامج فعليك ببرمجتها ب س أو س++ ولا يجب أن تبرمجها ب MFC .

طبعا يمكنك البرمجة بلغات أخرى مثل الأسمبلر أو الباسكال.

إلى اللقاء.

#3

شكراً عزيزى chik لقد توقعت من انك سترد على هذا الموضوع

و لكن لماذا لايمكن استخدام ال dl المصنوعة فى vb إلا فى vb هل يتعلق ذلك بمعمارية اللغة

كم يستغرقنى من الوقت لكى اقوم ببرمجة dll بإستخدام c++

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#4

اخ chik اعرف ان ملفات dll نوعين هما ستاندرد وهى التي لايمكن اضافتها كريفرنس فى ال vb انما نستخدم الدوال فيها بطريقه API

والنوع الثاني هى الريفرنس وهى التي يمكن اضافتها واستخدامها مباشره

والثانيه نستطيع بنائها بالفي بي بدون مشكله ولكنها مفتوحه لا استطيع بيعها مثلا فبمجرد انشارها خلاص .

ولكن المشكله هى كيف استطيع بناء الاولي وهي الستاندرد.

ولك تحياتي .

وشكرا لللاخ WIN98 على طرح السؤال .

#5

لماذا لا توجد إجابات

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#6

السلام عليكم,

أشكر الأخ العقاد على التوضيحات الإضافية وأريد أن أزيد أنك حين تبرمج ب VB أو ب س++ وتستعمل MFC فأنت تزيد في برنامجك أشياءا خاصة بهدا النوع من البرامج وبالطبع فقد لا تفهمها البرامج التي لا تستعمل هدا النوع.

أخي win98_eq لا يمكنني أن أقول لك كم يستغرق من الوقت لتعلم هدا فدلك له علاقة مع مكتسباتنا الأسبقية في البرمجة. فإدا كنت تعرف برمجة س++ مثلا فإن هدا لن يتطلب منك الكثير فمن الناحية البرمجية فهي نفس الشيء تبقى تقنيات Compile وأيضا طلب dll من برنامج ما وهدا قد نتعلمه في مثال واحد.

لبرمجة هدا يمكن أن نستعمل VC++ ونختار في المشروع dll وليس mfcdll ونزيد ملف من نوع .def نضع فيه كل الدوال التي قد تستعملها البرامج الخارجية أو exports .

وسأعطي مثالا عن هدا في المرة القادمة.

رمضان مبارك سعيد وكل عام وأنتم بخير إن شاء الله.

إلى اللقاء.

#7

السلام عليكم,

ةما قلت سأعطي مثالا لبرمجة dll المثال سيكون بسيطا والمكتبة ستصدر دالتين الأولى تعطي جمع عددين والثانية ضرب عددين.سنستعمل VC++6 نفتح مشروع جديد ونختار dynamic link library ونختار مشروع فارغ .

ها هو الكود الكامل :

#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;
}

DllMain هي ما يعادل main أو WinMain وهده تستعمل في الغالب ل Initialization وعندنا الدالتين Somme - Mult للجمع والضرب لكن هدا ليس كل شيء فيجب على البرنامج أن يعرف ما هي الدوال التي يمكن تصديرها أو التي ستستعملها البرامج الأخرى والدوال التي تستعملها المكتبة لأغراضها الخاصة.وللتصدير هناك 3 طرق وأنا أفضل وأستعمل طريقة .def ولهدا يجب أن نكتب ملف من نوع .def ونزيده إلى المشروع وملف .def الدي سيصدر الدالتين سيكون على الشكل التالي :

LIBRARY test3

EXPORTS

Somme

Mult

الكتابة انقلبت ولكن في LIBRARY نعطي اسم للمكتبة وفي EXPORTS نعطي اسماء الدوال التي نريد تصديرها.

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

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);

نستعمل LoadLibrary لنفتح المكتبة و GetProcAddress لنعره عنوان الدالة المصدرة وهنا يجب احترام الإسم كما هو وحين ننتهي نستعمل FreeLibrary لتفريغ المكتبة.

وعند الإستعمال في VB يمكن أن تعطي أخطاء إدا جربناها مباشرة من نافدة VB وإدا أردنا تجريبها نقوم بتهييء ملف .exe وبعد دلك نشغل البرنامج بدون مشاكل.

رمضان كريم وإلى اللقاء.

#8

كل عام و جميعكم بخير

عزيزى chik شكراً لك مرة اخرى

سأخبرك بسر صغير و هو اننى كان لدى عقدة من تعلم اى لغة تحتوى على الفئات classes فما ان ابدأبتعلم اى لغة اتركها حين اصل للفئات

ولكن ها الحال انا الان مبرمج vb و تعلمت اساليب البرمجة الموجهة بالكائنات فى ال vb

و الان انا اعض بنان الندم على عدم تعلمى ال oop من الاول

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#9

السلام عليكم,

لا أتصور كيف يمكن أن نخاف من Classes بينما هي تسهل علينا الأمور كثيرا.

هو فعلا عندما نقتصر ببرامج صغيرة قد لا نرى حاجة classes أو مدى أهميتها ولكن حين يبدأ الكود يكبر فنجد أنها تسهل الأمور وقد تجعلنا نتجنب من إعادة الكثير من الكود. وأريد أن أقول للمتخوفين والذين يتعاملون مع struct أن هده الأخيرة يمكن أن تعتبر كأخ ل Classe فلهما نفس الإستعمال ويختلفان في أشياء قليلة. وأما إذا أردنا برمجة الوندوز فسنلاحظ أن الحاجة إلى Classes تزداد لأن كل شيء في الوندوز هو عبارة عن أقسام.

كل عام وأنتم بخير ومتمنياتي بالتوفيق للجميع.

#10

الا توجد إجابات

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#11

السلام علسكم,

أي إجابات تريد

#12

بدون زعل

اخى chik إنما اريد ان اثرى المعلومات فانت و العقاد فقط ناقشتما الموضوع فعلى إذاً ان التزم بارائكما ماذا عن اراء باقى الاعضاء قطعاً انا اعلم مدى علمكما ولكن اين باقى الاراء

تم تعديل هذه المشاركة بواسطة win98_eg في 30 أكتوبر 2003 في 22:15

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#13

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

لأنشاء ملفات dll تعمل على عدة منصات برمجة ك visual basic , Java وحتى ال Java Script وغيرها من لغات البرمجة

يجب كتابة عناصر COM ووراثة واجهاتنا التي نريد مشاركتها مع لغات البرمجة الاخرى من الواجههة القياسية IDispatch .

هذه الواجهة هي المسؤلة عن تمرير البيانات والمتغيرات الى الدوال بين لغات البرمجة المختلفة . حيث لا يمكن تمرير بيانات من لغة Java Script مباشرة الى دالة مكتوبة بلغة ال سي أو السي بلس .

يجب تحويل المتغيرات الى نوع قياسي موحد بين لغات البرمجة تعارف مطورو COM على المتغيرات من النوع VARIANT و BSTR . حيث يغلف هذين النوعين داخلهما جميع أنواع البيانات الاساسية الموجودة في لغات البرمجة . (مبرمجو ال فيجوال بايزك لديهم دراية عن هذين النوعين أكثر من مبرمجي ال سي بلس بلس)

وبالمناسبة برمجة ال COM هي من أصعب أنواع البرمجة على الاطلاق , وخاصة في السي بلس بلس وكانت السبب الرأيسي في ابتاعد الكثيرين عنها فور الدخول في تعقيداتها.

لكن من أراد فعلا تعلم هذه التقنية بجدية فلن تكون بهذه الصعوبة , لأن أغلب من يحاول تعلمها يعتقد أنه كأي شيء أخر في السي بلس بلس يمكن أن يتم بسرعة

فقط تحتاج لبعض الصبر.

ويمكن كتابة عناصر COM من لغات البرمجة الاخرى كفيجوال بايزك....

ولمن لايعلم فان كائنات الدايركت اكس كلها مصنعة من واجهات COM بالعربي كل الدايركت اكس عبارة عن COM , لكنها لاتبدو للعيان كذلك من الدايركت اكس 8 , لكن لمن كان يبرمج من وقت الدايركت اكس 7 سيلاحظ واجهات COM الموجودة.

ولمن لايعلم أيضا فان عناصر أكتيف اكس المشهورة لدى مبرمجي الفيجوال بايزك ليست الا مكونات COM وارثة من الواجهة IDispatch , لهذا يمكننا استعمالها في جميع لغات البرمجة بال مشاكل.

النقطة ماقبل الخير هي أن عناصر COM يمكن أن تكون في ملفات Dll (وهي العادة) أو ملفات EXE .

والفرق بينهما أن ملفات ال dll ستعمل داخل نفس معالجة البرنامج المستضيف

أما ملفات ال EXE فتستعمل خارج المعالجة المستضيفة (لا أقصد ال Thread انما ال Proceess حيث أن كلا النوعين يكون له Thread مستقل عن البرنامج المستضيف )

وملفات ال EXE تستخدم غالبا في الاجهزة البعيدة في ال Servers لكي يتمكن ال Clients من الوصول الى دوال ال COM الموجودة في هذا الملف.

النقطة الأخيرة والمهمة والمفاجأة أنه هناك علاقة خاصة بين كلا من السي بلس بلس والفيجوال بايزك فقط في عملية تمرير البيانات حيث يمكن كتابة مكونات COM دون الحاجة للوراثة من الواجهة IDispatch فيعمل الكود في كلا لغتي البرمجة ويمكن استدعاء الدوال والواجهات مباشرة دون الدخول في تعقيدات COM الأخرى.

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#14

عزيزى hgb اراك دخلتنا فى موضوع ال com ما رأيكم ان نجعلة مادة للنقاش لننشط المنتديات بدلاً من هذا الخمول

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#15

السلام عليكم

فكرة ممتازة أخوي win98_eg وسنبدأ اليوم باذن الله

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#16

السلام عليكم,

أشكر الأخ HGB على هده المعلومات القيمة إنما أريد أن أقول أنه يجب عاينا أن نفرق بين النوعين أي بين DLL الدي قد نسميها عادي ولا تستدعي تقنيات COM وهي تعمل مع الكثير من البرامج مثل الباسيك الفورتران الأسمبلر وغيرها ويمكن أن نعتبرها مثل ملف exe تعطى له الأوامر من جهة أخرى ليبدأ التشغيل .أما COM أو Component Object Model فهي تستعمل تقنية خاصة وهنا نقوم بصنع object ونجعل بعض خصائصه مصدرة ليتجاوب معه البرامج الأخرى بواسطة هدة الخصائص. وهده التقنيات فإننا نستعملها يوميا وربما بدون أن نعلم فمثلا كل active X و OLE أو Object Linking and Embedding تعتمد على هده التقنية. وهده أيضا يمكن أن تكون تحت ملف DLL والفرق أيضا أن هده الأخيرة يجب أن تسجل في الرجستر قبل أن نتمكن من تشغيلها عكس Dll العادية.

ومن بين DLL العادية الكل يعرف مكتبات الوندوز مثل Kernel32 user32 gdi32 وما يقع أن حين يريد أي برنامج أن يستخدم أي API فإنه يستخدم الكود الموجود في المكتبة الخاصة فمثلا حين نريد MessageBox فإننا نستدعي الكود الموجود في user32.dll والموجود في الداكرة BFxxxxxxxx لم أتدكر العنوان الكامل.إلا أن هده المكتبات وبما أنها تستعمل من جميع البرامج فإنها تحمل في الداكرة عند البداية وتبقى رهن إشارة الجميع ولدى فهي تحمل في الجزء الثاني من الداكرة وهدا الجزء مشترك بين جميع Processes بينما حين نستدعي DLL خاصة ببرنامج فهي تحمل في مجال الداكرة الخاص بهدا البرنامج وغالبا ما تكون الداكرة 1000000 مع العلم أن هناك تقنيات تمكننا من أن نحمل مكتبتنا في مجال أي Process .

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

في الوندوز 98 حين نشغل اي برنامج فإن السيستم أو ما يعرف ب VMM أو Virtual Machine Manager سيخصص لهدا البرنامج داكرة مقدارها 4 جيغا حتى ولو تكون الداكرة الحقيقية اللي عندك 32 أو 64 ميغا أي أن البرنامج يتصور له وكأنه يتوفر على هده الداكرة كلها وهدا الرقم ليس إلا الرقم الأقصى الدي يمكن أن نكونه من 32 بايت وهو ما تشتغل به الوندوز.وهده 4 جيغا يمكن أن نقسمها على التالي :

الأربع ميغا الأولى تستعملها VM ويمكن أن لا نعتبر هدا لأنه لا يهمنا .

2 جيغا الأولى إدا لم نعتبر ما سبق هي تخصص للبرنامج وغالبا فإن كود البرنامج يبدأ في الداكرة 400000 - الأرقام كلها ب الهيكس - وكدلك المكتبات الخاصة تكون هنا وهدا يعتبر مجال هدا البرنامج فهو خاص به ولا يجوز لأي برنامج آخر الدخول الدخول له - هدا طبعا نظريا لكن دائما توجد تقنيات لخرق كل هده الأمور -

في 1 جيغا التالي فهي داكرة يراها ويستعملها جميع Process ولهدا فإن مكتبات الوندوز تكون هنا .

وفي الجيغا الأخير فهو خاص باسيستم حيث نجد هنا جميع VXD الخاص بالأدوات وغير دلك.

هده نضرة موجزة عن استعمال الداكرة وتحميل المكتبات إليها مع العلم أن فيه فرق بين الوندوز 98 والوندوز 2000 .

رمضان كريم وإلى اللقاء إن شاء الله.

#17

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

مشكورين ياأخ chik على المعلومات القيمة ...

وكما قلت COM تقنية أخرى يمكن أن تكون في ملفات dll غير ال Regular dll . ومن الواضح كما ذكرت أن ملفات النظام ك user32.dll توجد به دوال مكتوبة (وبالمناسبة ملفات dll هي الوندوز بكامله) والدوال في هذه الملفات مكتوبة بلغة السي الصرفة . فكيف يمكن للغة ال visual basic استدعاء هذه الدوال ؟

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

لكن الأمر أوضح بالنسبة لتقنية ال COM وهي مضمونة كذلك .. وسنتحدث عنها لاحقا إن شاء الله.

ولدي اضافة بسيطة عن موضوع الذاكرة ... في لغات البرمجة عموما في منصة الويندوز لايمكن حجز اكثر من ميغابايت واحد فقط للمتغيرات ال ستاتيكية Static Memory

يعني اذا حجزت مصفوفة عادية(وليست مؤشرا باستخدام new ) لمتغيرات من النوع int لأكثر من 257000 عنصر ستجد الرسالة

Unhandel Exception Over Flow Of Stack

لأن كمية الذاكرة المحجوزة سيكون قد تجاوز ال 1 ميغابايت لأن ال كل عدد int حجمه 4 بايت* 257000 = 1028000 بايت وهي أكثر من 1 ميجابايت.من هنا يتضح انه لحجز كميات ذاكرة أكبر من 1 ميجابايت لمجمل البرنامج يجب استخدام المنطقة الثانية في الذاكرة وهي الذاكرة التكويمية او الديناميكية. وهذه حدودها كما ذكر الأخ chik حوالي 2 جيجابايت

وهي الذاكرة المحجوزة في وقت تشغيل البرنامج المحجوزة بالأمر new في لغة ال سي بلس بلس أو malloc في ايام الخوالي للغة السي الصرفة.

وطبعا اذا كانت الذاكرة أكبر من حجم الرام لديك ستخزن في القرص الصلب وهذا ما يدعى بال Virtual Memory.

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#18

الموضوع كبر جميل

عن ملفات ال dll

على حسب معلوماتى البسيطه فإن ملفات ال dll نوعان system dll و تلك التى تصنعها الشركة صاحبة نظام التشغيل و هى تحتوى على كل الثوابت و الاجراءات و الدوال التى يحتاجها النظام و تستغلها البرامج التى تعمل على النظام

النوع الثانى appliacation dll و هى ال dll التى يقوم بصنعها المبرمج لتخدم برنامجه

عن موضوع ال com امهلونى يوم او اثنين حتى اشارك بمعلوماتى القليله

و اشكر الاعضاء chik و العقاد و HGB على إثرائهم مادة النقاش بعد الكسل الرهيب الذى اصاب المنتدى

تم تعديل هذه المشاركة بواسطة win98_eg في 1 نوفمبر 2003 في 03:45

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#19

السلام عليكم,

أرى أن هذا الموضوع بدأ ينتعش بنقاشاته الهامة والتي أتمنى لها أن نفيد ونستفيد منها.

أشكر كل الإخوان على آرائهم القيمة وأريد أن أعطي بعض الملاحضات وربما قد نختلف في تسمية بعض المصطلحات لأنها قد تختلف من بلاد إلى آخر ولكن إذا كان هناك أي لبس يمكن أن نتطرق إلى ذلك.

أولا أريد أن أقول للأخ win98_eq أن ملفات DLL للوندوز مثلها مثل الباقي ولا تختلف عنها شكلا لكنها تحتوي على المسائل الضرورية التي يحتاجها أي برنامج وهي كما ذكرت سابقا موضوعة في مكان عمومي ليستفيد منها أي برنامج ولا نحتاج تحميلها حين يستدعيها برنامج ما. وهي يمكن أن نقارنها ب Interruptions في عالم الدوس لأنها توفر لنا API .ولنتأكد أنها ليست مختلفة عن الأخريات فنعلم أنه بإمكاننا بسهولة - أمر نسبي طبعا ويجب أن نعرف بعض التقنيات - أن نغير مجراها أو نستعمل عليها الهندسة العكسية ومن هنا تبدو لنا عادية جدا.وأن هذه المكتبات هي أيضا تشتغل في الحلقة أو ring ثلاثة أي أنها تشتغل في مستوى أي برنامج عادي عكس السيستم أو VXD الذي يشتغل في الحلقة صفر.

وأقول للأخ HGB وبعد شكره عن المعلومات المفيدة أنه إدا كتبنا DLL بالطريقة العادية فليس هناك أي مشكل بالنسبة للبرامج الأخرى أن تقرأها حيث ما سيحصل أن كل شيء سيرجع Binary إذن ستتعادل الأمور وحتى بالنسبة للباسيك رغم أنه سيستعمل Interpreter ولكن هذا أيضا يفهم بدوره Binary أو نقول الأسمبلر.كل ما يجب مراعاته هي التوافق بين المعطيات المرسلة والمستقبلة إذ قد تختلف المفاهيم بين لغة وأخرى فقد تحتوي بينة على عدد معين من البايت في لغة ويختلف هذا العدد في لغة أخرى وبما أن كل شيء بايتات فحل هذه العادلة بسيط. وكان المشكل مع الباسيك هو استعمال المؤشر لكن المشكل حل مع الإصدارات الحديثة أضن مع الإصدار الرابع بدون تأكيد.

بالنسبة لحجز الذاكرة كما قال الأخ هو فعلا يمكن حجز أي قيمة ديناميكيا باستعمال new أو ما يعادله أما بانسبة للحجز كما جاء به الأخ هنا يمكن أن نتطرق إلى شيء آخر وهو الستاك أو Stack .

وهذه يمكن أن نعتبرها مثل ذاكرة يشتغلها البروسسور ليخزن فيها المعطيات المؤقتة مثلا وكما أن جميع الدوال التي تعتمد في استدعائها عن طريقة C هي أيضا تمر عبر الستاك وأضن أن المشكلة التي أثرتها متعلقة بحجم الستاك وأضن أن 1 ميغا هو Default الذي يحجزه الوندوز وأضن أنه وقد أكون شبه متأكد أنه يمكن أن نغير هذا الحجم وأنا شخصيا لم أعمل هذا قبل وسأجربه لاحقا. وقلت أنني شبه متأكد لأنني قمت بهذا في الأسمبلر وإذا كان هذا ممكن هناك فأضن أن يكون له مثيل في س أو س++ ويمكن أن نحجز قيمة شخصية وعلما كذلك أنه في س حين نريد أن نخلق Thread جديد ف API فيها اختيار لستاك سواء أن نختاره أو Default الذي يستعمل نفس الستاك وفي غالب الأحيان ما نستعمل هذه الأخيرة.

وكما قال الأخ أيضا فالسيستم حين لا يجد الذاكرة الكافية فإنه سيحول الفائض على القرص الصلب ويعتبرها الكمبيوتر كأنها ذاكرة وكما قلت قد نختلف في التسمية فهي تعرف ب Paging .

وأضن أن أحسن طريقة لرؤية كل هذا هو استعمال Debugger إذ يمكن من خلاله القيام بنزهة داخل الذاكرة ومشاهدة ما يجري وما يقع فيها وأن بعض المعلومات في لغة الأسمبلر قد تسهل هذه النزهة وتجعلها أكثر إفادة. ويمكن أن نرى ونتساءل كيف يمكن لبرنامجين شغالين في وقت واحد ويشتغلان نفس العنوان في الذاكرة.

فكل هذا يبقى نظريا محظا ويجب القيام بالتطبيق حتى نتمكن من المزيد في الفهم وتتضع الأمور أكثر وأكثر.

وأريد أن أقول للإخوان الذين يهمهم هذا أن نبدأ بالتطبيقات وعمل مشروع يشارك فيه الجميع ويدلي كل واحد بمعطياته وآرائه.

وإلى حين نزهة قادمة أقول لكم رمضان مبارك سعيد وإلى اللقاء.

#20

السلام عليكم ,

لقد قمت بتجربة مشكل stack overflow أو تدفق الستاك وهده بعض الملاحضات:

كما قلت من قبل في خصوص Stack Overflow أن الأمر يتعلق بمقدار كمية الستاك وأن الوندوز By default يعطيها مقدار 1 ميغابايت وهنا تأكيد وليس ضنون وسنحاول أن نتفادى هدا.

نكتب برنامجا ما ونحجز داكرة مقدارها 1 ميغا ولدلك سنكتب :

Char ch[0x100000]

بهدا سنحاول حجز 1 ميغا وهو العدد 0x100000 بالهيكس نبني البرنامج ولكن حين ننجزه يظهر لنا خطء في الإنجاز يقول أن هناك تدفق في الستاك.

نعمل نسخة لهدا البرنامج وسنعود إليه لاحقا.

نرجع إلى كود برنامجنا وإدا كنا في VC++6 لكي نغير قيمة الستاك نقوم بما يلي :

Project ->Settings ->Link في هده النافدة في خانة Category نختار Output وفي Stack allocation Reserve نكتب العدد 0x200000 ي سنغير قيمة الستاك إلى 2 ميغا .نعاود بناء البرنامج وحين ننجزه هده المرة نرى أن الخطء قد زال وأنه يعمل تمام. هده طريقة من بين أخريات إد يمكن مثلا استعمال ملف .def هنا أيضا .

الآن سنرجع إلى الملف EXE الدي سجلناه من قبل والدي لا يعمل وسنحاول تغيير قمية الستاك داخل الملف EXE مباشرة.

وهنا أنصح أن تكون لنا معلومات عن PE Header أو قد نقول عن المعطيات التي تكون في بداية أي ملف EXE والتي تعطينا كل مواصفاته وهنا سنكتفي بمواصفتين : نقطة بداية تشغيل البرنامج وموقع كمية الستاك.

نعلم أن في ملف ُْEXE فإن DWORD في OFFSET الدي يحمل رقم - كل الأرقام هنا ستكون بالهيكس - 3c وقع PE Header وفي هدا الموقع إدا زدنا عليه 28 بالهيكس دائما نعثر على DWORD لبداية البرنامج أو Entry Point وهدا ما يحدده لنا الدالة main أو WinMain وإدا زدنا على هدا العنوان 38 نكون في DWORD لقيمة الستاك وهنا ستكون عندنا 00 10 00 00 ومن المعلوم يجب قراءة هدا مقلوب - بالنسبة للبروسسور وليس لهده النافدة - إد هدا سيعطينا 00100000 أي 1 ميغا قيمة الستاك .

نفتخ الملف EXE في أس برنامج يعطينا البرنامج بالهيكس ويمكن مثلا أن نفتحه في VC ولكن يجب أن نختار Binary نفعل كما قلت سابفا ونغير قيمة الستاك لتكون 2 ميغا أي نغير 1 ب 2 ونسجل البرنامج من جديد وسنلاحظ أن هده المرة سيشتغل البرنامج بدون مشكل تدفق الداكرة.

وفي غالب الأحيان قد لا نحتاج إلى كل هده الكمية في الستاك ومن الأحسن إدا أمكن أن نحجز الداكرة أثناء عمل البرنامج إد سنخجزها في الوفت المناسب ونخليها عندما لا تكون لنا حاجة فيها بدلا من أن نحجزها في الأول وتبقى ختى النهاية وحتى إدا كنا لا نستعملها طوال هدا الوقت كله.

هدا قد يفتح لنا قضية PE Header وربما نقاشات أخرى قد نعود إليها لاحقا .

إلى اللقاء في انتضار اقتراحاتكم.

#21

تركنا ال dll و ال com و دخلنا ملعبك غى ال assembly و شغل الذاكره و ال pe

لايوجد مشكله بل اسئلة

1-ما الفائدة التى ستعود على عند تعاملى مع ال pe

2-ماذا احتاج لكى افهم ال pe file

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#22

هذا الكلام الصح وهذا الشغل الصح الله يقويكم شباب

انا قاعد اجمع معلومات عن ملفات DLL وسوف يعود الموضوع لما كان وهذا لايعني ان الموضوع صار خارج السيطره بل على العكس انتم دخلتو فى النواه وهذا اهم من خطوات بناء ال DLL

الله يوفقكم وشكر ا جزيلا لكم كلكم الي شارك والى بحث والى كتب

كما انني ادعو ادارة المنتدي لترشيح الاخوه chik و HGB للاشراف على المنتدي

#23

السلام عليكم,

أشكر كل الإخوة عن المشاركات والإقتراحات . فقد يبدو لأول وهلة أننا خرجنا عن الموضوع الأصلي ولكن حسب رأيي فإن كل الأشياء مشعبة فأنت حين تقوم ببرنامج ما فإنك تقوم بكل هدا ربما بدراية أو بغير دراية.

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

هو بالفعل يمكن أن ننجز برنامجا يعمل أشياءا عديدة وبدون ما نعلم كيف تسير الأمور فكثيرا من مبرمجي الباسيك أو MFC مثلا تراهم يبرمجون أشياءا ولا تهمم لا داكرة ولا Pe Header ولا ولا ...فهدا شيء جميل لكن إدا عرفنا كيف تسير الأمور يكون أجمل وقد تسهل علينا بعض المشاكل.

وإدا رجعنا إلى قضية DLL فأضن أنه إدا كنا نعرف برمجة EXE فلا يوجد فرق يدكر عدا تعريف الدوال التي سنصدرها وإدا رأيتم المثال السابق لابد وأنكم ستلاحظون هدا.فكثيرا من الأحيان حين نبرمج برامج صغيرة خاصة بنا لا نحتاج إلى مكتبة خارجية ونضع الكل في برنامجنا الأصلي.

وسأقترح هنا مشروع والدي يتطلب الضرورة إلى DLL يمكن أن نبدأه صغيرا ويتطور.

البرنامج كالتالي :

نفترض أنه عندنا عدة نوافد مفتوحة والبرنامج يعمل كالتالي :

أنقر باليمين على نافدة ما من النوافد المفتوحة والبرنامج يعطيني اسم النافدة التي نقرت فوقها باليمين.

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

إن هده الفكرة قد تبدو عادية لأول وهلة لكنها تتطلب بعض المفاهيم التي تكلمنا عنها سابقا.

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

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

#24

اجمل المواضيع

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#25

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

جيد عدنا مرة أخرى لل dll .... حتى لانضيع ولنا عودة باذن الله لل PE ..

لكن قبل أن نتحرك أريد أن أقول أن كلا النوعين dll وال exe لهما رأس PE كما ذكر الاخ chik ... ويمكن بفتح ملف dll أو exe بصيغة الاسكي أو اليونيكود ستجد أول بايتين فيهما MZ ويعني أن هذا ملف تنفيذي ثم في بايتين متقدمين تجد PE أيضا في كلا الملفين من النوع dll او exe ... وهذا يعني أنهما تماما مثل بعضهما ...

واقتراح جيد للأخ chik في الشروع .. وسيدخلنا في موضوع الركائز الاعتراضية أو ال HOOK وهي عبارة عن طريقة في وندوز لاعتراض الرسائل الممررة الا نوافذ أخرى أو برامج أخرى تعمل في النظام ... فيقوم برنامجنا باعتراضها وتحليلها ....

يمكن تطوير البرنامج في نواحي كثيرة مثلا التنصت على دخل المستخدم بالكيبورد أو الماوس في جميع برامج الوندوز التي تعمل ... تتم عن طريق ال HOOK .,,, وبالمناسبة برامج التجسس التي تنتجها الشركات تعمل عن طريق ال HOOKs ....

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

وبالمناسبة ال HOOK ليست الا دالة يستدعيها نظام التشغيل وليس البرنامج ... ويجب أن تكون في حالتنا في thread مختلف وبسهولة نجعلها في dll وال dll سيولد thread مختلف عن البرنامج الرأيسي ...

وبالتوفيق ...

banner_60_468.gif

NOTHING IS IMPOSSIBLE

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

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