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

[ تمت الإجابة ]عمل Mask لصورة

مغلق
بدأه tamer2000 في 3 أغسطس 2008 · 9 رد · 2,041 مشاهدة · في أرشيف قسم Windows APIs
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أخوانى الكرام المشكلة باختصار انى قمت بوضع وظيفة لعمل Mask لصورة بملف DLL وأحاول أستخدام الوظيفة من خلال فيجوال بيزيك 6 ولكن الوظيفة لا تعطينى النتيجة المرجوة لماذا لأ أعرف

الوظيفة تعمل بشكل طبيعى على الفيجول سى

واليكم كود الوظيفة الموضوعة بملف ال DLL والكود المكتوب بالفيجوال بيزيك

BITMAP __stdcall Maske (HBITMAP HBitmap ,COLORREF BackColor,HWND hdesWin)

{

HDC  Dhdc,memDCSourc,memDCMask;
HBITMAP hBitMapMask; 
BITMAP BitMapInf;
Dhdc=GetDC(hdesWin);				 
GetObject(HBitmap, sizeof(BITMAP), &BitMapInf); 
BitMapMask = CreateBitmap(BitMapInf.bmWidth ,BitMapInf.bmHeight , 1, 1,NULL);								 
memDCMask =CreateCompatibleDC(Dhdc);
SelectObject(memDCMask,hBitMapMask);				
memDCSourc=CreateCompatibleDC(Dhdc);				 
SelectObject(memDCSourc,HBitmap)			   
SetBkColor(memDCSourc, BackColor); 				
BitBlt(memDCMask,0,0,BitMapInf.bmWidth ,BitMapInf.bmHeight  ,memDCSourc,0,0,SRCCOPY);
BitBlt(Dhdc,0,0,BitMapInf.bmWidth ,BitMapInf.bmHeight ,memDCMask,0,0,SRCCOPY);
ReleaseDC(hdesWin,Dhdc);
DeleteDC(memDCMask);
DeleteDC(memDCSourc);
return hBitMapMask;
}

كود الفيجول بيزيك

تم أضافة PictureBox

CommandButton

Private Declare Function Maske Lib "BitmapMask.dll" (ByVal Hptimap As Long, ByVal mhwnd As Long, ByVal BacolorVal As Long) As Long


Private Sub Command1_Click()
Dim MaskHandle As Long

MaskHandle = Maske(Picture1.Picture.Handle, Picture1.hWnd, RGB(110, 155, 188))

End Sub

ارجو المساعدة فى أكتشاف السبب فى عدم عمل هذه الوظيفة ولكم جزيل الشكر

#2

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

هل لك أن ترفق ملف الـ DLL وأي ملف مثال فيه الكود السابق؟

Do as I say, not as I do

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

#3

تأكد انك قمت بتصدير الدالة في ملف الـDLL و بدون أي Decoration ,, اضف هذه الكلمة في تعريف الدالة اذا كنت تستخدم Cpp :

extern "C" __declspec( dllexport )

اذا كنت تستخدم C فقط فأزل :

 extern "C"

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#4

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

شكرا لتفاعل الأخوة الحقيقة أكتشفت الخطأ وهو أبسط مما كنت أتخيل

وهو أنى استدعيت الوظيفة بترتيب معاملات خاطىء

BITMAP __stdcall Maske (HBITMAP HBitmap ,COLORREF BackColor,HWND hdesWin)

وعندما أستدعتها من فيجوال بيزيك

MaskHandle = Maske(Picture1.Picture.Handle, Picture1.hWnd, RGB(110, 155, 188))

والصحيح

MaskHandle = Maske(Picture1.Picture, RGB(110, 155, 188), Picture1.hWnd)

مشكور لتفاعلكم

هناك سؤال أخير هل هناك طريقة مباشرة لجعل فيجوال بيزيك يقوم بعرض الصورة المعاد ال Handle الخاص بها بشكل مباشر

تعقيبا على تعقيب أخى GamingMasteR لو أنى ساقوم بأستدعاء الوظائف من خلال الفيجول بيزيك فهو يتوقع أن تكون calling conventions

__stdcall ويتم عمل ملف .DEF للوظائف المصدرة هذا ما أعلمه بخصوص ذلك الموضوع والله اعلى وأعلم

وكلامك صحيح عندما نقوم بأستدعاء الوظائف من خلال ال C

أخى Xacker مشكور على أهتماك

وردة وتحية معطرة لجميع الأخوة

#5

لا اعتقد اني فهمت ما تقصده فهما كاملا ,, هل تقصد ان تربط برنامج الـvb بملف الـdll اثناء عملية الـlinking مثل اي لغة اخرى(C-asm) ؟؟

انا لست على دراية كبيرة بالـvb لكن ما اعرفه ان تطبيقات الـvb تقوم باستدعاء الدوال من ملفات الـdll اثناء التنفيذ فقط ولا ترتبط بها ستاتيكياً .

ربما يفيدك شخص اكثر خبرة في الـvb :) .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#6
tamer2000 كتب:
تعقيبا على تعقيب أخى GamingMasteR لو أنى ساقوم بأستدعاء الوظائف من خلال الفيجول بيزيك فهو يتوقع أن تكون calling conventions

__stdcall ويتم عمل ملف .DEF للوظائف المصدرة هذا ما أعلمه بخصوص ذلك الموضوع والله اعلى وأعلم

وكلامك صحيح عندما نقوم بأستدعاء الوظائف من خلال ال C

غير واضحة بالنسبة لي، هل يمكنك التوضيح أكثر؟

GamingMasteR كتب:
لا اعتقد اني فهمت ما تقصده فهما كاملا ,, هل تقصد ان تربط برنامج الـvb بملف الـdll اثناء عملية الـlinking مثل اي لغة اخرى(C-asm) ؟؟

انا لست على دراية كبيرة بالـvb لكن ما اعرفه ان تطبيقات الـvb تقوم باستدعاء الدوال من ملفات الـdll اثناء التنفيذ فقط ولا ترتبط بها ستاتيكياً .

ربما يفيدك شخص اكثر خبرة في الـvb :) .

لو حسب ما خطر في بالي بناء على كلامك فهو ممكن من خلال ادراج الـ DLL ضمن قائمة الـ references

Do as I say, not as I do

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

#7

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

أخى Xacker عند قيامك بعمل ملف DLL فالبطبع هناك أجرائات وترميز معين يجب أن يقوم به مترجم اللغة وذلك بخصوص كيفية تمرير البارمتر الخاصة بالوظائف التى يمكن أستدعائها وأيضا من ضمن هذه الأجرائات التى يجب أن يقوم بها المترجم هو طريقة كتابته لأسم الوظيفة وهو ما يسمونه Decoration يعنى وضع علامات معينة مثل

 __ funcName

المهم أن هناك أكثر من طريقة يمكن أن تطلب من المترجم أن يتبعها عند ترجمته للكود الخاص بك من هذه الطرق هى

__cdecl, __stdcall, __fastcall, WINAPI

وذلك ما يسمة ب calling conventions فعند كتابتك لملف ال Dll ليتم أستدعائه من خلال ال C فيجب أن تستخدم الطريقة

__cdecl

أما عند قيامك بكتابة ملف ال Dll ليتم أستدعائه من خلال VB فيجب أن تستخد الطريقة

__stdcall

والا سيحدث خطأ

Bad DLL calling convention Error 49

ولذلك فيكون شكل الوظيفة فى ملف ال C++ كالاتى

BITMAP __stdcall Maske (HBITMAP HBitmap ,COLORREF BackColor,HWND hdesWin)

أما الجزء الخاص بان تعلم المترجم بان تلك الوظيفة يمكن أستدعائها من الخارج فالأخ GamingMasteR أستخدم الكلمة

 __declspec(dllexport )

ولكن مع ال __stdcall أستخدم ملف التعريف

و صيغته كالأتى

LIBRARY "Library Name.dll"

EXPORTS
	Transprent			@1
	Maske				 @2
	CopyBitmap			@3

يارب أكون وفقت فى توضيح هذه النقطة أخى الكريم

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

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

#8

WINAPI == STD convention

في السي يمكنك استخدام اي من الانماط التي تم ذكرها وليس cdecl فقط !

افضل fastcall اذا كانت الدالة صغيرة وبارامتراتها قليلة ,, std اذا كان استعاء الدالة كثير داخل البرنامج ,, cdecl اذا كانت عدد البارامترات غير محدد (مثل printf) .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#9

نعم أكثر من واضحة شكراً على هذا الشرح المفصل. ما زلت أحب الأسمبلي مع هذا :resentful:

بالتوفيق :)

Do as I say, not as I do

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

#10

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

GamingMasteR حياك الله أخى الكريم

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

هههههههههههههه

حياك الله أخى الكريم

ومشكورين على التواصل معى.

بالتوفيق للجميع أن شاء الله

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

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

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

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

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

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