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

حجز الذاكرة بإستخدام GlobalAlloc

بدأه Mr.B في 26 فبراير 2012 · 1 رد · 832 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

كتبت برنامج بسيط يستخدم GlobalAlloc, البرنامج يقوم بحجز مساحة حجمها 1024 ويكتب بها مئة "X" ثُم ينهيها بـNull byte ويظهر الناتج في MessageBox :

.386
.model flat, stdcall
	option casemap:none
include windows.inc
include user32.inc
include kernel32.inc

includelib kernel32.lib
includelib user32.lib

include C:\masm32\macros\macros.asm

.data?
	buffer dd ?
.data
	Merror	db "Fail in `LocalAlloc'", 0
	Mfine	db "OK", 0
.code

start:
	invoke GlobalAlloc, GMEM_ZEROINIT, 1024
	.if eax == 0
		invoke MessageBox, 0, addr Merror, 0, MB_OK
		invoke ExitProcess, 0
	.endif
	mov buffer, eax
	mov eax, 0
	.while eax != 100
		mov [buffer + eax], "X"
		inc eax
	.ENDW
	add buffer, 0
	invoke MessageBox, 0, addr buffer, addr Mfine, MB_OK
	invoke GlobalFree, addr buffer
	invoke ExitProcess, 0
end start

هل تطبيقي لها صحيح ؟ رجاء أن يؤكدّ لي شخص على صحّة ماقمت به, علماً أنه يعمل وﻻيظهر لي أخطاء. لكنني لست متأكّد من صحّة إستخدام الدالة GlobalAlloc.

أيضاً في حال مررت المعامل GMEM_FIXED للدالة GlobalAlloc , هل هذا يعني أنه لا يمكننا عمل realloc للذاكرة المحجوزة ؟ ﻻ أظنني أفهم ماكُتب بعدما قرأت شرح

المعامل GMEM_MOVEABLE.

سؤال جانبي, هل يعرف أحد مصدر توجد به أمثله على API ويندوز؟ كل ما أجده في msdn.microsoft.com تعريفات للدوال ونظرة عامة.

#2

لا تستخدم الدوال GlobalFree و GlobalAlloc و استخدم بدلا منهم الدوال HeapFree و HeapAlloc حيث GlobalX تحتوى على عمليات اضافيه لا داعي لها مما يجعلها ابطء فى الإستخدام من HeapX و التى تعتبر اسرع وسيله للتعامل مع الـ Heap.

نسخة الـ SDK الحاليه تحتوى على العديد من الأمثله بلغة الـ C و إن لم تجد مثال على داله معينه تريدها يمكنك قراءة الـ Documentation للعائله التى تنتمي لها هذه الداله و بالتالي ستعرف كيف تستخدمها افضل إستخدام. مثلا المثال المتاح للداله HeapAlloc كبير نوعا ما و يهدف لمجموعه اخرى من الدوال لذا يمكنك قراءة الملخص الخاص بالـ Heap Functions و منه ستعرف دور هذه الداله و بعدها قم بالإطلاع مره اخرى على تفاصيلها و اقرءها جيدا و ستعرف كيف تقوم بإستخدامها. أيضا يوجد قسم الـ API يمكنك طرح الأسئله فيه بخصوص هذه الدوال إن احتجت مساعده.

بالنسبه لـ GMEM_FIXED فهو يعمل تماما عكس GMEM_MOVEABLE و هذا يعنى ان الذاكره التى يتم حجزها بإستخدام هذا الـ flag لا يتم تحريكها من مكانها أبدا و بالتالي إذا أردت تكبير حجم الذاكره التى قمت بحجزها و لا توجد مساحه كافيه فى الـ block الموجود به فسيتم الرجوع لك بـ NULL و غير ذلك سيتم الرجوع لك لنفس العنوان الموجود لديك و لكن حجم الذاكره به اصبح اكبر.

ليس لي خبره فى التعامل مع الماكرو الخاص بالـ MASM و لكن يبدو من خطوات الكود انه صحيح.

و الله ولي التوفيق

1

مدونتي: C++ Tips and Tricks

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