本笔记参考《windows程序设计》Charles Petzold,汇编版本参考《汇编通讯》Zoologist

开始

学习windows程序设计的条件有三:

熟悉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'

汇编没有转义字符,所以这里的''是对引号的特殊处理,天杀说是由编译器处理的。