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

مساعدة في فهم معنى Handle + هل يمكن استعمال الapi في تطبيق Mfc + معنى اسلوب الاستدعاء _stdcall :/

بدأه youssefchou في 9 يونيو 2009 · 5 رد · 2,364 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

handle,,لم استطع ان اعطي تصورا لهذا المصطلح في دماغي

وهذا يعرقل فهمي للapi

و اريد ايضا معرفة ماهية اسلوب الاستدعاء _stdcall

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

ايضا بحتث في قوقل ولم اجد

واريد ايضا ان اعرف هل بامكاني استعمال دوال الapi داخل تطبيق MFC

ام ان هذه الدوال يتم استدعائها في مشروع MFC بطريقة اخرى

بارك الله فيكم وجعل كل اعمالكم في ميزان حسناتكم

تم تعديل هذه المشاركة بواسطة youssefchou في 9 يونيو 2009 في 17:31

#2

up

#3

أولا handle هو عبارة عن رقم من نوع long يعطى لكل نافذة في الويندوز فمثلا نافذة سطح المكتب قيمت ال handel بصفر

و باقي النوافذ لها قيم و المسئول عنها هو نظام التشغيل و هذا يشمل حتى الأزار و الأدوات المختلفة على أية نافذة

و تشبه رقم ال id في قواعد البيانات لذلك عند التعديل على النوافذ و استدعاء الدوال المختلفة مثل تغير النص أو اللون لابد من إعطاء هذا الرقم لتحديد النافذة التي تريد التغيير فيها كما في الدالة التالية

BOOL SetWindowText(HWND hWnd,LPCTSTR lpString);

لتغيير نص شاشة مثلا زرار لابد من إرسال الهاندل الخاص بالزرار مع النص المراد وضعه

أما في ال mfc فالأمر أبسط لأن مثلا كلاس cbutton يحتوي على متغير هو الهندل m_hwn

و تستدعي الدالة setwindowtext مباشرة التي ستقوم من داخلها باستدعاء الدالة الأولى مع تمرير الهاندل الخاص بالزرار

بالنسبة لدوال الapi فيمكن استدعائها مباشرة من داخل ال mfc و إن كانت بيئة mfc تقدم نفس الدوال لكن بطريقة أبسط

و أخيرا بالنسبة ل _stdcall

عند تحويل الكود للغة الآلة هناك طرق مختلفة لتفسير الدوال المكتوبة

مثلا لو أن هناك دالة بالشكل التالي

int func(int a);

هذه دالة تأخذ رقم كيف سيتم تمرير هذا الرقم لهذه الدالة

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

يمكن أن توضع في مكان محدد في الذاكرة أو توضع في ريجيستر

لذلك عند تفسير هذه الدالة أول سطر سيكون قراءة هذا المتغير إما من الذاكرة أو الريجستر

و بعد الانتهاء من الدالة من المسئول عن إزالة المتغير من الذاكرة هل هي الدالة أم الكود الذي استدعى الدالة

لذلك هناك طرق مختلفة و على أساسها يتم تنفيذ مسار الكود و الخلط بين طريقتين يمكن أن يؤدي ل runtime error

في حالة _stdcall

يتم تمرير المتغيرات التي ستأخذها الدالة بوضعها في في الستاك (مكان خاص في الذاكرة) من اليمين لليسار

قبل انتهاء الدالة تقوم الدالة نفسها بحذف هذه المتغيرات من الذاكرة

يتم وضع القيمة العائدة في الريجستر Eax

للمزيد

http://www.codeproject.com/KB/cpp/calling_...emystified.aspx

تم تعديل هذه المشاركة بواسطة omaravet في 11 يونيو 2009 في 12:41

#4

بارك الله فيك اخي الكريم يبقى فقط سؤال خارج البيئة

كيف استطيع الحصول او الاعلان على مقبض مربع نص مثلا ثم كيف استدعيه في هذه الدالة مثلا

BOOL SetWindowText(HWND hWnd,LPCTSTR lpString);

ام يكفي ان امرر اسم الكائن وسيتكفل المصرف بالباقي

شكراً لك اخي الكريم

#5

هل تسأل عن الـHANDLE ان الـHWND :) ؟

عموما الامر متشابه لكن الفرق ان الـHANDLE يقع في process والمسؤول عنه هو الكرنل بينما الـHWND يقع في الـSession والمسؤول عنه هو الـWin32 Subsystem .

في انظمة NT كل شئ في الكرنل عبارة عن كائن Object مثل الـProcess/Thread/Job/Timer/Mutex ... الخ .

للتعامل مع هذا الـObject يلزمك handle يعبر عنه ويمكنك من التعامل مع هذا الكائن عبر دوال الـAPI ، هذا بشكل مبسط :)

اقتباس
و اريد ايضا معرفة ماهية اسلوب الاستدعاء _stdcall

/index.php?showtopic=194525

اقتباس
واريد ايضا ان اعرف هل بامكاني استعمال دوال الapi داخل تطبيق MFC

نعم يمكنك

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#6

بارك الله فيك اخي GM

والله كفيت ووفيت

لم اكن اعرف انه يوجد فرق بين الاثنين

كنت اعتقد انهما نفس الشيء

بالتوفيق

تم تعديل هذه المشاركة بواسطة youssefchou في 11 يونيو 2009 في 12:34

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…