📄 win32asm可视化编程.txt
字号:
对比那些高极编程语言,ASM算是比较复杂的,也因此吓跑了不少新手,在我的这篇文章中我将尽量
避开这个,以通俗易懂类VC的编程方法解决这个问题,当然我还是建议大家看一下完全用API建一个窗
口的方法参考一下"汇编全接触"里的Iczelion的Win32汇编教程,里面有详细的资料,我将在这里告诉
大家怎样用资源文件结合RadAsm实现可视化编程,下面让我们来了解下资源文件:
Windows 的资源文件
不管在Dos下编程还是在Windows下编程,我们总是要用到除了可执行文件外的很多其他数据,
如声音数据,图形数据,文本等等,在Dos下编程,我们可以自己定义这些文件的格式,但这样一来
就造成了很多资源共享的问题,大家可能还记的Dos下的很多游戏,它们的图形都是按自己的格式存
放的,你无法用标准的看图软件来看。也无法把它另存为其他格式。虽然在Win32编程中,我们仍然
可以这样做,但Win32编程给了我们一个方案 ---- 就是格式统一的资源文件,把字符串、图形、对
话框包括上面的按钮,文本等定义到一个资源文件中,就可以方便的在不同的文件中使用它,最重
要的是,如果我们用自己的文件格式,使用时就要涉及到这些文件的读写操作,比较复杂,但使用
资源文件时,Windows提供了一系列的API来装入资源。非常方便。
......
在程序中使用资源
在程序中,要使用资源之前必须先装如内存,Windows定义了一系列的API来装入资源,如
LoadMenu,LoadString,LoadBitmap 等等,); 这些Load函数的返回值是一个句柄,调用参数中一
般至少为两项: hInstance 和ResouceName,这个 ResouceName(如BitmapName,MenuName)就是在资
源文件中的 #define 指定的值,如果你用 #define MY_ICON 10/ MY_ICON ICON "Main.ico" 定义
了一个图标,那么在程序中要使用 Main.ico 图标就可以用 LoadIcon(hInstance,10) 来装入已经
定义为10号的图标文件。另一个参数 hInstance 是执行文件的句柄,它对应资源所在的文件名,你
可以在程序开始执行时用 invoke GetModuleHandle,NULL 获得 hInstance。另外一些资源并不是显
式地装入的,如对话框资源,它是在建立对话框的函数中由Windows自己装入的,如下面例子中的
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,0 ,是在屏幕上显示一
个资源文件中已经定义好了的对话框,就并不存在 LoadDialogBox 之类的API来先装入对话框
介绍了这么多相关的东西,现在让我们来进入正题:
1.打开第一节练习的工程,方法是:文件-打开,选择"D:\RadASM\Masm\Projects\MyBox\MyBox.rap",
如果已经没有了,请新建一个!
2.再随后出现的右栏中双击*.Asm(MyBox.Asm),把下面的代码覆盖到里面:
代码:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Programmed by hacker0058, nohacks@nohacks@126.com
; Website: http://nohacks.ys168.com
; 第一个窗口程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.486
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include kernel32.inc
include shell32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
includelib shell32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 数据 RC资源
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN equ 1000
.data
.data?
hInstance HINSTANCE ?
.code
;********************************************************************
_ProcDlgMain proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
mov eax,wMsg
cmp eax,WM_CLOSE ;对话框关闭时
je boxClose
cmp eax,WM_INITDIALOG ;对话框初始化时
je boxStart
cmp eax,WM_COMMAND ;按下对话框上的按钮时
je commoand
retFalse:
mov eax,FALSE
ret
boxClose:
invoke EndDialog,hWnd,NULL
jmp retTrue
boxStart:
jmp retTrue
commoand:
mov eax,wParam
;代码
retTrue:
mov eax,TRUE
ret
_ProcDlgMain endp
;********************************************************************
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,0 ;显示对话框
invoke ExitProcess,NULL
;********************************************************************
end start
3.在右栏中选择"MyBox.Asm",然后单击右键,新建→对话框,接着会弹出一个"添加新对话框"的对话
框,随便输入一个文件名(如:dlg),点保存,就到了对话框修改界面,如图:
4.你可以给对话框改个名字,方法是:右下角属性里的"caption"项,如:"我的第一个窗口程序"
当然改完后别忘了"回车"保存!
最后,构建→构建并运行,是不是看到了一个标题为"我的第一个窗口程序"的窗口程序,如图:
下面我们就重点来讲解一下:
DLG_MAIN equ 1000
定以资源文件,其中1000是对话框属性里的ID,前面的"DLG_MAIN"可以随便取个名字,只要不违反
MASM的命名规则就行
_ProcDlgMain proc uses ebx edi esi, \
proc 的语句应该是不陌生的,要重复讲解一下的是 uses 和 下面的参数,uses 下的寄存器表
示要编译器自动插入保存及恢复这些寄存器的指令,\ 是在 Masm32 中接下一行的符号,表示下一
行是本行的继续内容,以避免一行中的内容过长。下面的 hWnd:DWORD 等语句定义了调用这个子程
序的参数,如果有以下定义 MyProc proc dwPara1:DWORD,dwPara2:DWORD,dwPara3:DWORD,然后你
用 invoke MyProc 1,2,3 来调用它,那么,1,2,3 将分别被赋值给 dwPara1,dwPara2,dwPara3,你
可以在子程序中使用这些传递过来的参数。如果参数的类型是双字,那么:DWORD可以省略
最后要讲到的就是 DialogBoxParam 这个API了,在Windows中,所有的窗口都要指定一个子程
序,当Windows检测到鼠标、定时器等和这个窗口有关的动作时,它回调用这个子程序,这就是
Windows基于消息的体系的最基本的概念,换句话说,在Dos下,我们通过INT指令调用系统,而在
Windows 下,有很多时候是你指定子程序地址让Windows来调用你。
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset
_ProcDlgMain,0中的 offset _ProcDlgMain 就指定了如果有消息发生,Windows就来执行这个
子程序,参数中的 DLG_MAIN 就是在资源文件中定义的对话框模板ID。 hInstance 是对话框所在的
资源文件的句柄。
另外,在_ProcDlgMain 子程序中,Windows传给我们4个参数hWnd,wMsg,wParam,lParam,其
中,hWnd是对话框的窗口句柄,wMsg表示现在发生的消息事件,如这个对话框初始化时Windows会以
WM_INITDIALOG为消息调用,关闭时为WM_CLOSE,按下对话框上的按钮时为WM_COMMAND等,wParam和
lParam是附加的参数,对应不同的消息对应不同定义,具体可以参考:
Win32Programmer'sreference。
课后练习:
根据下面的提示写一个"QQ任我聊"程序,下次再见时我会仔细讲解:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 数据 RC资源
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN equ 1000
IDC_EDT equ 1001 ;编辑框
IDC_IDOK equ 1002 ;按纽
QQ_N equ 12 ;设置QQ号的最大位数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
temp db "tencent://message/?uin=",'%s',"&Site=im.qq.com&Menu=yes",0
.data?
posBuffer db 50+QQ_N dup (?)
qqtemp db QQ_N dup (?)
hInstance HINSTANCE ?
invoke GetDlgItemText,hWnd,IDC_EDT ,addr qqtemp,QQ_N ;取用户输入到文本
invoke wsprintf,addr posBuffer,addr temp,addr qqtemp ;连接文本串
invoke ShellExecute,NULL,NULL,addr posBuffer,NULL,NULL,SW_HIDE ;执行IE命令
要求:程序有一个编辑框,一个按纽,在编辑框里输入任意QQ号可以打开对应的QQ临时对话框
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -