Fasm---Win32汇编学习3
第三课-完整的界面
在今天这节课程中,我们来写一个Windows的界面。
理论:
Windows程序中,在写图形界面时需要调用大量的标准 Windows GUI函数。其实这对于程序员和用户都是好事。对于用户,面对的是同一套标准的窗口,对这些窗口的操作都是一样的,所以使用不同的应用程序无须每次都要进行重新学习操作。对程序员来说,这些Gui源码都是经过了无数次的测试,随时都可以拿来用。当然至于具体地写程序对于程序员来说还是有难度的。为了创建基于窗口的应用程序,必须严格遵守Windows的规范。做到这一点不难,只要用基于模块化或面向对象的编程方法即可。。
其实我们可以这样想,在windows中我们就处于另一个虚拟世界,那么这个世界里有很多预定义的对象,那么每个对象就是windows这个世界之前静态的定义的对象的实例。。 例如,每个进程就是windows静态定义的“进程对象”的实例。。那么每个窗口也就是windows预定义的窗口对象的实例,我们必须遵守这个规则,否则我们就会被踢出局。
那么我们要想创建一个windows界面就得遵守以下的规则:
下面我就列出在桌面显示一个窗口的基本步骤。
1.得到您应用程序的句柄。
2.得到命令行参数。(可选)。
3.注册窗口类。
4.产生窗口。(必须)
5.在桌面显示窗口。
6.刷新窗口客户区。
7.进入无限获取的窗口消息循环。
8.如果有消息到达,则由负责该窗口的回调函数处理。
9.如果用户关闭窗口,进行退出处理。
对于单用户的dos下编程来说,windows下的程序框架结构是相当复杂的。但是windows和DOS是截然不同的。Windows是一个多任务的操作系统,故系统中同时有多个应用程序彼此协同工作,这就要求windows程序员必须严格恪守编程规范,养成良好的规范。
内容:下面是一段简单的窗口程序源代码。
说明:
1.你最好把这个程序中所需要的所有的结构以及常量包含到一个头文件中,然后在我们的程序中包含这个头文件。当然这个我们的fasm已经帮我们做好了,我们只需要引用一个“win32ax.inc”头文件即可,这个是个扩展的头文件,里面包含了一些扩展的宏语句,例如addr 取局部变量,否则如果我们引用“win32a.inc”,我们必须通过lea指令来获取局部内存单元的偏移地址。
2.利用library宏语句来引用相应的我们需要调用函数所在的dll动态链接库名称,这样以便我们编译器构建输入表。因为windows是以动态链接库的形式提供给我们接口函数的,我们要调用这些接口,必须通过指定相应的动态链接库名称以及函数名称,并通过特定的格式够杂输入表,这样我们的程序在被载入到内存后相应的动态链接库才会被载入内存,以及重定向我们调用函数的地址。。最后通过include语句包含相应的动态库的头文件,这里面包含了相应函数的格式。。。
3.在其他地方运用头文件定义函数原型,常数和结构体的时,要严格保持和头文件中一致,包括大小写。在函数查询时,这将节约你很多时间。
format PE GUI 4.0
include 'win32ax.inc'
macro memmov [dst, src]
{
common
push [src]
pop [dst]
}
LPSTR equ dd
;************************数据********************************
szClassName db 'first Windows',0
szWndName db '我的第一个程序',0
lpCommand LPSTR ?
hIcon rd 1
hInstanse rd 1
hCursor rd 1
hWnd rd 1
entry $
invoke GetModuleHandle,NULL ;必须的,我们必须获得我们程序的模块句柄。如上面说的,如果不遵循我们将over。
mov [hInstanse], eax ;在win32模式下, hMoudule == hInstance mov [hInstance], eax
invoke GetCommandLine,NULL ;不是必须的,如果你的程序不处理命令行,则这句代码可以省去。
mov [lpCommand], eax
stdcall _WinMain,hInstanse, NULL, [lpCommand], SW_SHOWDEFAULT ;调用主函数
invoke ExitProcess,NULL
proc _WinMain hInstance:DWORD, hPrevInstance:DWORD, lpCmdLine:DWORD, nCmdShow