上次基本学习之后,搭建环境之后,初步建立了一个基本的类似Delphi的程序框架模式,同志们都说用汇编封装没神马意义。呵呵,实际说来确实貌似意义不怎么大,不过自己学习罢了,边学边整理,可以加深印象,学习而言,学了不用,才没意义了。所以这个东西,我还是继续下去了,目前封装出了类似Delphi的TList的列表用来管理窗体的,同时增加了应用程序,增加了基本的消息流通方向,基本的控件结构架构定义出台。大致结构如下
;>>>>>>>>>>>>>>Control对象
DxControlInfo struct
self dd ? ;控件自身的地址
Parent dd ? ;父类对象地址
Color dd ?
WndProc dd ?
MouseDown dd ? ;鼠标按下
MouseUp dd ? ;鼠标弹起
SetParent dd ? ;设置父
Free dd ? ;释放
DxControlInfo ends
;>>>>>>>>>>>>>>Wincontrol对象
DxWinControlInfo struct
ControlInfo DxControlInfo <>
Handle dd ?
Controls dd ?;组件列表
DxWinControlInfo ends
;>>>>>>>>>>>>>>窗体对象
DxForm struct
WInfo DxWinControlInfo <> ;WinControl组件信息
ModalResult dd ?
ModelLevel dd ? ;上面的模态窗口层数
Caption dd ? ;窗体标题
;函数
Create dd ? ;创建窗体
Show dd ?
ShowModal dd ?
Close dd ?
DxForm ends
这样,如果要写一个新的控件,都可以类似DxForm这个窗体对象的模式定义为WinControl,如果定义GraphicControl就在第一个结构位置防止ControlInfo。这样,访问的时候,我们根据是GraphicControl还是WinControl都可以在结构体的第一个位置访问到对应的信息
目前的窗体函数就实现了创建,显示以及模态显示以及释放等。
程序的具体代码样式如下
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include DxApplication.inc
includelib DxApplication.lib
.data
Application DxApp <>
szcap db '消息',0
sztxt db '鼠标%s键按下的是位置x=%d,y=%d',0
sztitle db '不得闲测试窗体',0
szLeft db '左',0
szRight db '右',0
szout db 100 dup(0)
.code
_MouseDown proc uses esi MouseBtn:byte,xPos:dword,ypos:dword
mov esi,eax
.if MouseBtn==mbLeft
invoke wsprintf,offset szout,offset sztxt,offset szLeft, xPos,ypos
;创建一个新窗体
call RegisterFormInfo
mov esi,eax
mov [esi].DxForm.WInfo.Handle,0
mov [esi].DxForm.WInfo.ControlInfo.Parent,0
mov [esi].DxForm.WInfo.ControlInfo.WndProc,0
RGB 0,255,24
mov [esi].DxForm.WInfo.ControlInfo.Color,eax
push esi;传递空,表示创建主窗体
call Application.CreateForm
mov eax,esi
call [eax].DxForm.ShowModal;
mov eax,esi
call [eax].DxForm.WInfo.ControlInfo.Free
invoke MessageBox,[esi].DxForm.WInfo.Handle,offset szout,offset szcap,64
.else
invoke wsprintf,offset szout,offset sztxt,offset szRight, xPos,ypos
.endif
ret
_MouseDown endp
winmain proc
call RegisterFormInfo
mov edi,eax
mov [edi].DxForm.WInfo.Handle,0
mov [edi].DxForm.Caption,offset sztitle
mov [edi].DxForm.WInfo.ControlInfo.MouseDown,offset _MouseDown
mov [edi].DxForm.WInfo.ControlInfo.Parent,0
mov [edi].DxForm.WInfo.ControlInfo.WndProc,0
RGB 223,255,0
mov [edi].DxForm.WInfo.ControlInfo.Color,eax
mov Application.hInstance,0
mov Application.MainForm,edi
invoke CreateApplication,offset Application
push NULL;传递空,表示创建主窗体
call Application.CreateForm
mov eax,esi
call Application.Run
winmain endp
start:
call winmain
end start
本程序的效果就是创建一个窗体,然后指定了窗体的鼠标按下事件,在鼠标左键按下的时候会弹出一个模态窗体,然后弹出一个对话框显示鼠标点击的位置
具体程序下载地址
DxAsmVCL.zip
下一步继续封装,封装一些基础控件
[课程]Linux pwn 探索篇!