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

مشكلة في التحويل من متغير local الى global

مغلق
بدأه الاخير زمانه في 25 مارس 2007 · 5 رد · 642 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ،

لدي مشكلة في التحويل من متغير local الى global

هذا ما لدي ،

.inc 


.data?
hWnd HWND   ?


.asm

My  proc …………

invoke MessageBox , hWnd,addr pszResult,CTXT("hello"),MB_OK

invoke SetDlgItemText ,hWnd,IDC_DISPLAY,addr pszResult


DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

;mov eax,hWin
;mov hWnd,eax

	push hWin
	pop hWnd

عند تنفيذ البرنامج يظهر ال dialog ثم يغلق مباشرة ،

الخطأ عند التحويل من ال hWin الى المتغير hWnd

لو حذفت جملة SetDlgItemText ،

وفي جملة ال MessageBox استبدلت ال hWnd ب 0 ،

يتنفذ البرنامج بصورة اعتيادية ،

يعني ال hWnd هو به المشكلة ،

،

لا ادري كيف اعملها بالاسمبلي ،

انا نفس الشي كنت مسوي بالسي وكان ماشي تمام ،،

في دروس Iczelion's Win32 Assembly

هناك شيء مماثل

.data 
hInstance dd 0 
.data? 
hHook dd ? 
hWnd dd ? 
.code 
DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD 
	.if reason==DLL_PROCESS_ATTACH 
		push hInst 
		pop hInstance

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#2

السلام عليكم

المشكلة ليست فى تحويل من الglobal إلى الlocal , وإنما المشكلة تكمن فى انك تحاول استخدام hWnd قبل ان تعطيها قيمة..

لاحظ فى الحالة الاولى انك تستدعي الدالة MessageBox , وترسل معى الدالة المتغير hWnd والذي يحمل فى هذه الحالة قيمة عشوائية, والمفروض ان يحمل عنوان النافذة..

نفس الوضوع بالنسبة للدالة SetDlgItemText فانت تطلب من وندوز انه يضع عنوان للنافذة ولكنك ترسل عنوان غير محدد من خلال hWnd وفى هذه الحالة يغلق البرنامج بدون سابق إنذار لانه لا يعرف اين توجد النافذة ....

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

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

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

#3

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

شكرا اخي احمد على المرور ،

،

اخي انا اعطي قيمة لل hWnd قبل استخدامه ،

هنا

DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

;mov eax,hWin
;mov hWnd,eax

-----

و هذا الجزء

My  proc …………

invoke MessageBox , hWnd,addr pszResult,CTXT("hello"),MB_OK

invoke SetDlgItemText ,hWnd,IDC_DISPLAY,addr pszResult

يتنفذ اذا ضغط المستخدم زر معين ،

يعني يتم الانتقال اليه من داخل ال DlgProc

،

يعني ال DlgProc يتنفذ اولا و يقوم بأعطاء قيمة لل hWnd ،

ارجو التصحيح اذا كنتُ على خطأ ،

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

تم تعديل هذه المشاركة بواسطة الاخير زمانه في 26 مارس 2007 في 11:30

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#4

استدعى الدالة GetModuleHandle في بداية برنامجك للحصول على المقبض

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

d4baa0.gif
#5

رغم إن خبرتي في الأسمبلي قليله , لكن أظن إن الأمر mov ما راح يتنفذ لأنها كلها عبارة عن comment

;mov eax,hWin
;mov hWnd,eax

فلو شلت الفاصلة المنقوطة من قدام الأوامر فراح تتنفذ الأوامر .

#6

السلام عليكم ،

دالة GetModuleHandle

انا استدعيها في بداية البرنامج ،

هكذا

.code

start:

	invoke GetModuleHandle,NULL
	mov		hInstance,eax

	invoke InitCommonControls
	invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
	invoke ExitProcess,0

وبالنسبة للفارزة ،

انا واضعها ،

;mov eax,hWin
;mov hWnd,eax

	push hWin
	pop hWnd

انا قلت اجرب طريقة push بس نفس الشي ،

ما في فايدة ،

راح اجرب استدعي الدالة GetModuleHandle

داخل ال DlgProc

،

جزاكم الله خيرا على الرد ،

السلام عليكم

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

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

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