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

[ تمت الإجابة ]مشكل في تعريف Wndclass Structure للدالة Getclassinfo

بدأه aderfiad في 25 أكتوبر 2009 · 15 رد · 1,434 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

احاول استعمال الدالة GetClassInfo لجلب معلومات انشاء النافدة

قمت باستدعاء الدالة هكدا

 invoke GetClassInfo,whandle,Classe_Name,addr classstruc

وقمت بتعريف structure classstruc

هكدا

struc classstruc
   style		 DWORD ? 
   lpfnWndProc   DWORD ?
   cbClsExtra	DWORD ?
   cbWndExtra	DWORD ?
   hCursor	   DWORD ?
   hbrBackground DWORD ?
   lpszMenuName  DWORD ?
   lpszClassName DWORD ?
classstruc ends

لكنها غير شغالة

C:\WinAsm\WINDOW\WINDOW.asm(91) : error A2008: syntax error : struc
C:\WinAsm\WINDOW\WINDOW.asm(100) : fatal error A1010: unmatched block nesting : classstruc

خطأ في تعريف Structure

كيف يمكنني تعريف هده structure

شكرا لكم

تم تعديل هذه المشاركة بواسطة aderfiad في 25 أكتوبر 2009 في 03:02

#2

struct*

struct  StructureName
...
...
ends StructureName

تم تعديل هذه المشاركة بواسطة Xacker في 25 أكتوبر 2009 في 06:00

Do as I say, not as I do

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

#3

شكرا

جاري التجريب

تم تعديل هذه المشاركة بواسطة aderfiad في 25 أكتوبر 2009 في 06:09

#4

صححتها على الطريقة التي دكرت اخي لكنها لم تنجح

struct classstruc 
   style		 DWORD ? 
   lpfnWndProc   DWORD ?
   cbClsExtra	DWORD ?
   cbWndExtra	DWORD ?
   hCursor	   DWORD ?
   hbrBackground DWORD ?
   lpszMenuName  DWORD ?
   lpszClassName DWORD ?
ends classstruc

Assembling: C:\WinAsm\WINDOW\WINDOW.asm
C:\WinAsm\WINDOW\WINDOW.asm(91) : error A2008: syntax error : struct
C:\WinAsm\WINDOW\WINDOW.asm(100) : error A2008: syntax error : ends
C:\WinAsm\WINDOW\WINDOW.asm(303) : error A2006: undefined symbol : classstruc
C:\WinAsm\WINDOW\WINDOW.asm(303) : error A2114: INVOKE argument type mismatch : argument : 3

تم تعديل هذه المشاركة بواسطة aderfiad في 25 أكتوبر 2009 في 06:25

#5

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

StructureName struct
..
..
StructureName ends

Do as I say, not as I do

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

#6

اشتغلت جيدا الان

لكن المشكل في الدالة GetClassInfo

هدا الكود كاملا

.elseif uMsg == WM_TIMER

			invoke GetForegroundWindow
			cmp hWnd,eax
			je thesame
			mov whandle,eax
			invoke wsprintf,addr bufferhzz,addr hexzz,eax
			invoke GetWindowText,whandle,addr Win_Title,512
			invoke SetDlgItemText,hWnd,Window_Handle,addr bufferhzz
			invoke GetClassName,whandle,Addr Classe_Name,256
			invoke SetDlgItemText,hWnd,Window_Title,addr Win_Title
			invoke SetDlgItemText,hWnd,Window_new_Title,addr Win_Title
			invoke SetDlgItemText,hWnd,Class_Name,addr Classe_Name
			invoke GetWindowThreadProcessId,whandle,addr processwindow
			invoke wsprintf,addr bufferID,addr hexzz,processwindow
			invoke SetDlgItemText,hWnd,ID,addr bufferID
			invoke GetClassInfo,whandle,Classe_Name,classstruc

ممكن اخي الكريم الطريقة الصحيحة لاستعمال هده الدالة فلم اجد لها متالا

الكود ينفد دون اخطاء لكن المشكل هي كيف يمكن اضهار النتائج

تم تعديل هذه المشاركة بواسطة aderfiad في 25 أكتوبر 2009 في 06:48

#7

typedef struct {

UINT cbSize;

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

HICON hIconSm;

} WNDCLASSEX, *PWNDCLASSEX;

WNDCLASSEX Structure

BOOL GetClassInfo(

HINSTANCE hInstance,

LPCTSTR lpClassName,

LPWNDCLASS lpWndClass

);

lpClassName

[in] Pointer to a null-terminated string containing the class name. The name must be that of a preregistered class or a class registered by a previous call to the RegisterClass or RegisterClassEx function.

بالنسبة للعبارة التي أضفتها على مشاركتك الأخيرة

lpWndClass

[out] Pointer to a WNDCLASS structure that receives the information about the class.

Do as I say, not as I do

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

#8

لقد وضعتها كما هي مشروحة في MSDN

ما لم افهمه هي كيف التعامل مع structure

هل الدالة ترجع لكل متغير خاصيته ؟

ان كان هكدا فقد جربت هدا الكود لكن عند الترجمة يقول بان style غير معرف رغم انه معرف داخل structure

invoke SetDlgItemText,hWnd,Edittxt,addr style

C:\WinAsm\WINDOW\WINDOW.asm(308) : error A2006: undefined symbol : style

C:\WinAsm\WINDOW\WINDOW.asm(308) : error A2114: INVOKE argument type mismatch : argument : 3

تم تعديل هذه المشاركة بواسطة aderfiad في 25 أكتوبر 2009 في 06:56

#9

style التي كتبتها يعتبرها المترجم متغير ضمن data/data? sections

لتصل إلى متغير داخل structure استخدم الشكل classstruc.style طبعاً مع الانتباه إلى كيفية إرساله كبارامتر (بالقيمة أم بالمرجع)

Do as I say, not as I do

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

#10

جربت هكدا لم ينفد

invoke SetDlgItemText,hWnd,Edittxt,addr classstruc.cbSize

اختفى خطأ عدم تعريف المتغير لكن لم ينفد الكود خطأ في الدالة SetDlgItemText

اضن انه من الطبيعي ان كانت الدالة GetClassInfo نفدت بنجاح ان يكون المتغير cbSize حاملا للحجم

ويمكن عرضه مباشرة في Edit بالدالة SetDlgItemText

لا اعرف اين الخطأ

هدا الكود

.elseif uMsg == WM_TIMER

invoke GetForegroundWindow

cmp hWnd,eax

je thesame

mov whandle,eax

invoke wsprintf,addr bufferhzz,addr hexzz,eax

invoke GetWindowText,whandle,addr Win_Title,512

invoke SetDlgItemText,hWnd,Window_Handle,addr bufferhzz

invoke GetClassName,whandle,Addr Classe_Name,256

invoke SetDlgItemText,hWnd,Window_Title,addr Win_Title

invoke SetDlgItemText,hWnd,Window_new_Title,addr Win_Title

invoke SetDlgItemText,hWnd,Class_Name,addr Classe_Name

invoke GetWindowThreadProcessId,whandle,addr processwindow

invoke wsprintf,addr bufferID,addr hexzz,processwindow

invoke SetDlgItemText,hWnd,ID,addr bufferID

invoke GetClassInfo,NULL,Classe_Name,classstruc

invoke SetDlgItemText,hWnd,Edittxt, addr classstruc.cbSize

تم تعديل هذه المشاركة بواسطة aderfiad في 25 أكتوبر 2009 في 07:23

#11

تحتاج إلى القراءة بشكل أدق، فقد كتبت "مع الانتباه إلى كيفية إرساله كبارامتر" قاصداً حتى لا تنسى أن تنظر ما نوع البارامتر، كيف يتم إرساله، كيف تتم معالجته، هل هناك شئ خاص يتعلق به..

لنراجع سوياً.

BOOL SetDlgItemText(

HWND hDlg,

int nIDDlgItem,

LPCTSTR lpString

);

Parameters

hDlg

[in] Handle to the dialog box that contains the control.

nIDDlgItem

[in] Specifies the control with a title or text to be set.

lpString

[in] Pointer to the null-terminated string that contains the text to be copied to the control.

هل اكتشفت المشكلة التي وقعت فيها؟

Do as I say, not as I do

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

#12

نعم اكتشفته (:

لكن ما هو نوع المتغير في cbSize و style ..... ؟ كيف ارسله ليضهر في Edit

اضن انه باستعمال sendmessage لكن لا اعرف كيف استعملها هنا

#13

صديقي انظر

UINT cbSize;
UINT style;

المتحولات من نوع Unsigned INTeger

استخدم wsprintf لتحولها إلى سلاسل نصية في buffer مؤقت وجرب اسنادها إلى الـ editbox.

Do as I say, not as I do

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

#14

اوكي جاري

#15

جربت هكدا ينفد البرنامج بنجاح لكن لا شيئ يمرر لـEdit

اولا عرفت

string db "%s",0

و buffer3 db ?

تم في الكود عملت الاتي

invoke GetClassInfo,NULL,Classe_Name,classstruc

invoke wsprintf,addr buffer3,addr string,classstruc.cbSize

invoke SetDlgItemText,hWnd,Edittxt,addr buffer3

#16

السلام عليكم

ربما حليت المشكل

استعملت رمز التحويل num db "%lu",0

تم وضعت الدالة هكدا

invoke GetClassInfo,NULL,Classe_Name,ADDR wndclass

invoke wsprintf,addr buff7,addr num,wndclass.style

invoke SetDlgItemText,hWnd,STILE, addr buff7

واشتغلت عادي لكن لدي ملاحضة

هل كتبت الدالة بالطريقة الصحيحة ؟

تم تعديل هذه المشاركة بواسطة aderfiad في 25 أكتوبر 2009 في 21:36

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