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

كتابة برنامج 32bit بواجهة مرئية

مغلق
بدأه Xacker في 8 مارس 2006 · 10 رد · 4,597 مشاهدة · في المواضيع المميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

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

في المرفقات المقال بصيغة PDF (عذرا لمن لا يملك برنامج Acrobat Reader) وسورس كود للبرنامج الموضح في الشرح.

نسال الله لكم التوفيق

Working_with_Resources_for_32bit_programs.rar

تم تعديل هذه المشاركة بواسطة Xacker في 21 مارس 2006 في 15:45

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

درس جميل يا X يعطيك الف عافية..

انصح كل مبتدء الاطلاع عليه طريقة سهلة وشرح ممتاز, ويمكن وضع اي سؤال هنا وإن شاء الله سوف تكون هذه إنطلاقة لكل من اراد ان يبداء فى البرمجة بmasm32..

بالتوفيق للجميع

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

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

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

#3

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

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

جاري التحميل...

thx in advance

#5

جزاك الله خيرا أخى Xacker

م / صابر سميـسم

للبرمجــــــ عدن ـــــــــيات

flashflash5@hotmail.com

#6

merci mon ami

#7

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

درس جميل ومفيد ،

انا عندما قرأت عن التعامل مع المصادر في مقالات Iczelion ، شلت هم ،

لأن هو لايتكلم عن الاضافة بهذه الطريقة ، فهناك نحن نكتب ملف ال resource

الحمد لله ال RadAsm وفر علبنا هذا ،

--

سؤال صغير ..

في ال DlgProc

.if  eax==WM_COMMAND
Mov eax,wParam
.if eax ==IDC_BTN1

لماذا لم نقل

.if ax ==IDC_BTN1

كما ورد في مقالات Iczelion على اعتبار

The low word of wParam contains the menu ID of the selected menu item.

،

بالنسبة لأضافة القوائم ،، هل يوجد طريقة مماثلة ام فقط الطريقة المذكورة في مقالات Iczelion

،

ياريت اخ xacker تستمر بهكذا دروس ..

،

لدي سؤال بخصوص ال RadAsm

في اول خطوة لتكوين مشروع جديد هناك

Project name
Project

ما الفرق بينهما ؟؟

/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/

 

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

#8
الاخير زمانه كتب:
سؤال صغير ..

في ال DlgProc

.if  eax==WM_COMMAND
Mov eax,wParam
.if eax ==IDC_BTN1

لماذا لم نقل

.if ax ==IDC_BTN1

كما ورد في مقالات Iczelion على اعتبار

The low word of wParam contains the menu ID of the selected menu item.

واضح أنه لا فرق أخي, نقلت قيمة wParam الى eax بالكامل لاصفر الجزء الاعلى منه فقط لا غير وكان بامكاني نقلها بالشكل mov ax, wParam ثم اجرى المقارنة

اقتباس
،

بالنسبة لأضافة القوائم ،، هل يوجد طريقة مماثلة ام فقط الطريقة المذكورة في مقالات Iczelion

لكن لا ارى فرق بينها وبين النقر على اي زر في اي واجهة, فاي طريقة تقصد هل لم انتبه الى ما تشير اليه.. الله اعلم

اقتباس
لدي سؤال بخصوص ال RadAsm

في اول خطوة لتكوين مشروع جديد هناك

Project name
Project

ما الفرق بينهما ؟؟

الاولى اسم المشروع للمجلدات والملفات وخلافه..

الثاني هو الوصف description

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#9

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

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

ممكن سؤال جديد حول البرنامج ،

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

	mov		eax,uMsg
	.if eax==WM_INITDIALOG
	; nothing goes here for initializing
	.elseif eax==WM_COMMAND
		mov	eax,wParam
		.if eax==IDC_BTN1
			invoke	GetDlgItem,hWin,IDC_EDIT1
		; eax holds the editbox handle
			mov		CtrlHwnd,eax
			invoke	GetWindowTextLength,CtrlHwnd
		; eax holds the length of the text inserted
			cmp		eax, 0
			je		notext
			inc		eax
		; we use a different value for nMaxCount depending on how
		; many char we enter.. we dont want it to be vulnerable
		; for buffer overflows :p
			invoke	GetDlgItemText,hWin,IDC_EDIT1,addr szBuffer,eax
		; now the text is in szBuffer
			invoke	MessageBox,hWin,addr szBuffer,addr cool,MB_OK
		notext:
		.elseif eax==IDC_BTN2
			invoke	SetTimer,hWin,NULL,3000,NULL
			invoke	SetDlgItemText,hWin,IDC_STC2,addr copyright
		.endif
	.elseif	eax==WM_TIMER
		invoke	SetDlgItemText,hWin,IDC_STC2,addr blank
	.elseif eax==WM_CLOSE
		invoke EndDialog,hWin,0
	.else
		mov		eax,FALSE
		ret
	.endif
	mov		eax,TRUE
	ret

DlgProc endp

end start

انا لم افهم هذا الجزء

.else
		mov		eax,FALSE
		ret
	.endif
	mov		eax,TRUE
	ret

يعني احنا نختبر الرسائل ،

اخر اختبار كان لرسالة WM_CLOSE ثم بعد ذلك اتت هذه الجمل

.else
		mov		eax,FALSE
		ret
	.endif

هذه ال eles متى ستتنفذ ،

اذا اتتنا غير رسالة عدا التي اختبرناها ؟؟

وهذا ال ret الى اين يعود ؟؟

وهنا انتهت ال if

.endif

حسنا ،

ما فائدة هذا

mov		eax,TRUE
	ret

؟؟؟

اخي بالنسبة لي

اقتباس
إقتباس

،

بالنسبة لأضافة القوائم ،، هل يوجد طريقة مماثلة ام فقط الطريقة المذكورة في مقالات Iczelion

لكن لا ارى فرق بينها وبين النقر على اي زر في اي واجهة, فاي طريقة تقصد هل لم انتبه الى ما تشير اليه.. الله اعلم

انا اقصد ،

في مقالات Iczelion

يشرح عن عمل القوائم هكذا ..

Menu.rc 


#define IDM_TEST 1 
#define IDM_HELLO 2 
#define IDM_GOODBYE 3 
#define IDM_EXIT 4 
FirstMenu MENU 
{ 
 POPUP "&PopUp" 
		{ 
		 MENUITEM "&Say Hello",IDM_HELLO 
		 MENUITEM "Say &GoodBye", IDM_GOODBYE 
		 MENUITEM SEPARATOR 
		 MENUITEM "E&xit",IDM_EXIT 
		} 
 MENUITEM "&Test", IDM_TEST 
}

لآ ادري هل كن عملت اخي على الفيجوال سي ،

عند الذهاب الى قائمة Insert ثم الضغط على resource

تظهر مجموعة من المصادر التي يمكن اضافتها ..

عمل dialog (كما في ال radasm) وهناك ايضا ايقونات و صور ،، وهناك ايضا القوائم ، يعني انا اضيف قوائم بتفرعاتها بدون ان اكتب جمل برمجية فقط كتابة ال ID لكل عنصر ،،

وهذا قصدي ،

انه هل في الاسمبلي ممكن عمل نفس الشيء (طريقة مال كساله !!!!!) .. ام الا عن طريق كتابة الجمل البرمجية كما ذكر في المقالات ؟؟؟

،،

/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/

 

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

#10

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

اولا فيما يخص هذا الجزء:

	.else
		mov		eax,FALSE
		ret
	.endif
	mov		eax,TRUE
	ret

بشكل بديهي لن يصل التنفيذ الى mov eax, false الا لو لم تتطابق اي رسالة وصلت الى النافذة مع الرسائل التي انت قمت بتحديدها مثل WM_TIMER و WM_COMMAND وغيرها

ليقوم السطر هذا بوضع قيمة 0 في EAX ويعيد التنفيذ ليتوجه عبر RET الى النظام ليقوم بمعالجة النافذة بنفسه, بمعنى, وضعنا 0 لنخبر النظام اننا لا نريد هذه الرسالة ولسنا مهتمين بها, فلتفعل بها ما شئت.. الامر مشابه لاستخدام DefWindowMessage

اما السطر الخاص بـ mov eax, TRUE فسيصل التنفيذ اليه عندما تتطابق الرسالة الحاثّة للنافذة مع احدى الرسائل التي قمنا بتنفيذها, فنقوم بتنفيذ ما يحلو لنا ثم يصل التنفيذ الى هذا السطر ليضع 1 في EAX ليخبر النظام باننا نريد هذه الرسالة واننا مهتمون بها.. التفصيلات نوعا ما تبق مجهولة بسبب تضييق الخناق على التفصيلات الداخلية للنظام.

وفيما يتعلق بالقوائم, تستطيع من خلال RadASM فرضا ان تقوم بالنقر على فرع Resource عندما تقوم باختيار مشروع مع resource, الفرع تجده في النافذة الى اليمين, من خلال القائمة المساعدة بالزر الايمن تختار Add new > menu لتقوم باضافة قائمة وتعدل عليها كما تفعل في VC++ وهو سيتكفل في بنيتها الداخلية وانت ما عليك سوى الانتباه الى الـ IDs التي ستخاطب القوائم من خلالها بنفس الطريقة التي تتعامل مع الازرار فيها اي من خلال WM_COMMAND ثم تحدد الى اي عنصر تتبع الرسالة من خلال wParam

السلام عليكم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#11

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

جزاك الله خيرا على هذا التعاون ،،

سأحاول التطبيق ،،

/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/

 

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

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

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