本笔记参考《windows程序设计》Charles Petzold,汇编版本参考《汇编通讯》Zoologist
开始
学习windows程序设计的条件有三:
1 熟悉windows操作系统,只要使用电脑的人八成都挺熟悉
2了解C语言,作者这么说,我想我会c++应该没什么问题吧
3准备好开发环境VC6汇编版本使用Masmplus
Window简史
无非是操作系统的更新换代,微软就这么赢了。但还是跟着intel的脚步走的吧,intel拿出什么CPU,他就对应更新一下。为了不至于像苹果那么惨就拖泥带水的在保护模式下有什么虚拟8086.这样就可以运行大量8086那个时代的软件。
关于DLL
书上关于dll做了一些简单的叙述,应用程序和dll是多对多的关系,如果一个dll为多个应用程序使用,那么该dll为共享dll文件。Dll文件和可执行文件一样包含可执行代码,但必须由应用程序直接或间接的调用。如果是静态连接就是将所有代码编写入一个可执行文件,此时当多个应用程序,要调用某个函数时就会有多个拷贝,浪费了内存空间。若采用动态连接,则根据描述信息定位到相应的函数就可以了。并不会有多个拷贝,因为Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。
关于API
API是系统函数和相关数据类型和数据结构的集合。总之是系统现成提供给我们的资源。
Windows版HelloWorld
//========================
// (c)狗尾草2008.1.18
//========================
#include<windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
MessageBox(NULL,"HelloWorld!","Henry's first windows program",MB_OK);
return 0;
}
|
有了IDE直接点编译连接即可,运行结果见图。
|
头文件windows.h中包含了其他windows头文件,例如
WINDEF.H 基本型态定义。
WINNT.H 支持Unicode的型态定义。
WINBASE.H Kernel函数。
WINUSER.H 使用者接口函数。
WINGDI.H 图形设备接口函数。
他们包含了系统的一些函数,数据类型和结构。以及一些常量的定义。
其中WINAPI会比较让人感到疑惑,其实就是一种调用函数的约定,书上并未给出解释
#define WINAPI _stdcall
他表示的是一种函数参数的入栈方式,分为c和pascal类型,c是从最后一个参数开始而pascal则刚好相反,其实c的入栈方式可以保证参数个数不确定的情况出现。
大致如下,关于产生函数修饰名没有什么意义就不讲了。
_cdecl
从右至左入栈,由调用者把参数弹出。
_stdcall
从右至左入栈,由被调用者把参数弹出。
WinMain参数诠释
hInstance是该实例的句柄,用来唯一标识一个实例的常量。
hPrevInstance是该实例前运行的副本,如果已有一个程序运行,可以直接从它那里获取一些资源。
CmdLine执行程序的命令列,用惯命令的人一定知道的。就是命令后跟着的那些一般带杠的参数
nShowCmd是程序最初的显示方式。
MessgeBox函数
第一个参数是窗口句柄,这里没有定义窗口类,自然也没什么窗口实例。所以为NULL
第二个参数是显示的内容
第三个参数是标题栏内容
#define MB_OK 0x00000000L
最后一个是对话框按钮,是一些带MB_前缀的常量。还可以使用或运算符指定图示。实验中发现定义图示时弹出对话框的声音也发生变化,看来这些常量背后还很复杂。
汇编版本
;========================
; (c)狗尾草 2008.1.18
;========================
.386
.Model Flat, StdCall
Option Casemap :None
include windows.inc
include user32.inc
include kernel32.inc
IncludeLib user32.lib
IncludeLib kernel32.lib
.data
titles db 'henry''s first windows program'
content db 'HelloWorld!'
.data?
.code
start:
invoke MessageBox,NULL,offset content,offset titles,MB_OKCANCEL
invoke ExitProcess,0
end start
|
.386是指令集指定
.model用来指定内存模式Flat是平坦模式
Option Casemap :None大小写不区分
Invoke是函数调用语句,其实和c没什么区别,参数用逗号分隔
编写过程中
titles db 'henry''s first windows program'
汇编没有转义字符,所以这里的''是对引号的特殊处理,天杀说是由编译器处理的。