Windows程序设计第02章Win32编程基础知识.docx
《Windows程序设计第02章Win32编程基础知识.docx》由会员分享,可在线阅读,更多相关《Windows程序设计第02章Win32编程基础知识.docx(13页珍藏版)》请在冰豆网上搜索。
Windows程序设计第02章Win32编程基础知识
第2章Win32编程基础知识
Windows编程,大家也通常称为win32编程,或win32SDK编程,其含义是针对32位Windows操作系统。
本章节回顾了C语言的入口函数,再引入Win32入口函数,通过win32开发所需要的相关知识,巩固对Win32编程的理解。
Win32编程具体的功能是什么?
它是为Windows系统编写应用程序的工具或手段,目的是为了服务于系统用户。
当然,Win32程序就是所有可以在Windows系统下运行的程序的统称。
因为Windows是由很多窗口组成,所以这里所指的Windows程序,即为窗口程序。
通常所编写的程序,即为应用程序,是指为了完成某项或某几项特定任务而被开发运行于操作系统之上的计算机程序。
应用程序与应用软件的概念不同,但常常因为概念相似而被混淆。
软件指程序与其相关文档或其他从属物的集合。
一般视程序为软件的一个组成部分。
对于应用程序,需要了解的是,每一个应用程序运行于独立的进程、它们拥有自己独立的地址空间。
不同应用程序的分界线称为进程边界。
2.1C语言入口函数
在C语言的世界里,所有的程序都是用函数来装配的,main称之为主函数,是所有程序运行的入口。
main函数可以无参,也可以有参,但标准的C语言,main函数是有参函数,其形式如下所示:
intmain(intargc,char*argv[])
{
printf("HelloWorld!
\n");
return0;
}
在main函数之前的“int”,是主函数的返回值类型,因为有它,所以在主函数的函数体内部的最后,要加入“return0;”,需要将函数的返回值返还回去。
intargc:
argc是命令行总的参数个数,即主函数带有多少个参数。
char*argv[]:
argv是指针数组,其中argv[]是argc个参数(参数内容),其中第0个参数是程序的全名,后面的参数是命令行后面跟的用户输入的参数。
现在以DOS命令“dir”为例,假设输入:
“dir /w /p c:
\Windows”,如图2.1所示。
图2.1cmd命令行
其各个参数的含义解释如下:
argc = 4
argv[0] = dir
argv[1] = /w
argv[2] = /p
argv[3] = c:
\Windows
如果想编写带有命令行参数的程序,通过对argc与argv的配合即可实现。
当然也可以通过参数的内容来实现不能功能的加载。
2.2Win32入口函数
C语言有入口函数,当然Win32编程也有入口函数,虽然它们的写法有所不同,但同为入口函数,基本功能是一样的。
不一样的是Win32的入口函数相对来说更为复杂,它为窗口应用程序提供相应的参数。
为了让大家更好的了解Win32入口函数的参数,先来了解一下C语言的一些参数,表2.1描述了常用的数据类型。
表2.1C/C++语言基本数据类型
类型
说明
字节数
二进制位
值域
char
字符型
1
8
-128~127
signedchar
有符号字符类型
1
8
-128~127
unsignedchar
无符号字符类型
1
8
0~255
int
整型
2
16
-32768~32767
signedint
有符号整型
2
16
-32768~32767
unsignedint
无符号整型
2
16
0~65535
shortint
短整型
2
16
-32768~32767
signedshortint
有符号短整型
2
16
-32768~32767
unsignedshortint
无符号短整型
2
16
0~65535
long
长整型
4
32
-231~(231-1)
signedlong
有符号长整型
4
32
-231~(231-1)
unsignedlong
无符号长整型
4
32
0~(232-1)
float
浮点型
4
32
7位有效位数
double
双精度型
8
64
15位有效位数
char*
字符指针
4
32
-
constchar*
字符指针常量
4
32
-
在表2.1中,需要注意的是“int”类型,在turboc中,字节数是2,二进制位为16,而在本书中使用的MicrosoftVisualC++6.0中,字节数是4,二进制位32。
如果感兴趣,可以使用“sizeof(int)”语句来验证。
如果之前只做过C或C++程序的开发,那接下来的Win32的数据类型会感觉格格不入,还好在对C/C++语言的基本数据类型进行了回顾,接下来作个简单的对比,这样能更好的理解数据类型,如表2.2所示,描述了C语言与Win32常用的数据类型的对比。
表2.2C/Win32常用数据类型对比
C数据类型
Win32数据类型
char*
LPSTR,PSTR
constchar*
LPCSTR,PCSTR
void
VOID
void*
LPVOID
Win32的数据类型众多,有上百个,记忆时可以使用一些技巧,切勿死记硬背,拿“LPCSTR、PCSTR”为例:
“LP”与“P”代表同一含义,即指针;
“C”代表“const”;
“STR”则代表字符串。
合起来的意思是常量字符串指针。
C语言与Win32的数据类型已经做了简单介绍,接下来该谈一谈Win32的入口函数以及参数的作用,其标准函数原型如下:
#include
intAPIENTRYWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
MessageBox(NULL,"显示的内容","标题",MB_OK);
return0;
}
在编写Windows程序时,需要包含头文件“Windows.h”,正如第一行所示。
它包含了其他Windows头文件,这些头文件的某些头文件,又包含了其他头文件。
在这些头文件中最重要的是:
WINDEF.H基本型态定义;
WINNT.H支援Unicode的型态定义;
WINBASE.HKernel函数;
WINUSER.H用户界面函数;
WINGDI.H图形界面函数;
这些头文件涵盖了Win32编程所需要的所有功能及方法,它们是Windows文件中的一个重要组成部分。
入口函数中的“intAPIENTRY”,其中“int”为函数的返回值类型,“APIENTRY”为函数标识,它本身是通过宏来进行定义的,如图2.2所示,为“WINDEF.H”头文件中所定义的宏的原型。
图2.2APIENTRY定义
“APIENTRY”是由“WINAPI”定义而来,而“WINAPI”则是由“__stdcall”定义。
“__stdcall”是调用约定,保护如何处理参数压入栈的顺序,谁负责清理内存等。
在这里只知道写法即可,不用深究其意。
一定要注意的是,Win32的入口函数是“WinMain”而不是“main”,前面的“Win”代表的含义是“Windows”。
“HINSTANCE”,根据MSDN的翻译,为进程的实例句柄,它也为数据类型中的一种,句柄类型。
作用是加载进程映像的基本地址,在程序中,唯一标识进程。
句柄则是整个Win32编程的基础,一个句柄是指,使用的一个唯一的整数值,是指一个四字节的数值,用于标志应用程序中的不同对象的实例,例如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。
应用程序能够通过句柄访问相应的对象的信息,可以这样说,句柄就像每位同学的学号一样,唯一标识着一个窗口,需要注意的是,句柄不是一个指针,程序不能利用它来直接阅读文件中的信息。
接下来介绍一下WinMain函数各个参数的含义:
参数HINSTANCEhInstance,进程的实例句柄,在本程序中,唯一标识进程;
参数HINSTANCEhPrevInstance,指向应用程序的前一个进程句柄,在32操作系统该参数为NULL,该参数仅仅被用于16位操作系统,现已经不被使用;
参数LPSTRlpCmdLine,命令行缓冲区,不包括程序的名字,回想一下“char*argv[]”的作用,如果输入“dir/w/pc:
\Windows”,则lpCmdLine的值为“/w/pc:
\Windows”;
参数intnCmdShow,窗口的显示状态,该参数可以是下表值之一。
表2.3窗口显示状态
标识
描述
SW_HIDE
隐藏窗口并且激活另外一个窗口。
SW_MINIMIZE
最小化指定的窗口,并且激活在系统表中的顶层窗口。
SW_RESTORE
激活并显示窗口。
如果窗口已经最小化或最大化,系统将以恢复到原来的尺寸和位置显示窗口(与SW_SHOWNORMAL相同)。
SW_SHOW
激活一个窗口并以原来的尺寸和位置显示窗口。
SW_SHOWMAXIMIZED
激活窗口并且将其最大化。
SW_SHOWMINIMIZED
激活窗口并将其最小化(以图标显示)。
SW_SHOWMINNOACTIVE
将一个窗口显示为图标。
激活窗口维持活动状态。
SW_SHOWNA
以窗口的当前状态显示窗口。
激活窗口保持活动状态。
SW_SHOWNOACTIVATE
以窗口的最近一次的尺寸和位置显示窗口。
激活窗口维持激活状态。
SW_SHOWNORMAL
激活并显示窗口。
如果窗口最大化或最小化,系统将其恢复到原来的尺寸和位置(与SW_RESTORE相同)。
2.3WindowsAPI简介
API(ApplicationProgrammingInterface,应用程序编程接口),是操作系统提供给开发者的应用程序编程接口。
用户使用该接口可以调动操作系统资源,而又无需访问源码,或理解内部工作机制的细节,从而实现自己的应用程序的功能。
简单理解,API即为函数,是由操作系统提供,开发者不需要知道函数的具体实现方法,只要了解其功能及使用方法即可。
由于API是操作系统提供,所以它有一个特性,即编译环境的无关性,如果使用VB、Delphi等期编译环境,也可以同样调用相同的API功能,唯一不同的是各种编程语言上语法的不同。
API在计算机系统中的位置如图2.3所示。
图2.3API用户接口
事实上,WindowsAPI是在安装完操作系统之后,就已经存在了,它是以DLL文件的形式存在,存在“C:
\WINDOWS\system32”下,在这个目录下可以看到很多很多的DLL文件,而这些文件就是提供函数接口的地方。
DLL文件的操作与说明会在后面的章节介绍,这里就不过多说明。
常用的Win32函数库所需要的DLL文件如下:
GDI32.DLL:
屏幕显示及打印功能的函数集;
USER32.DLL:
鼠标、键盘、通信端口、声音、时钟功能的函数集;
KERNEL32.DLL:
文件及内存管理(核心部分)功能的函数集;
MPR.DLL:
Windows32网络接口库;
ADVAPI32.DLL:
Windows32、ADVAPI32核心部件。
类库和控件都是构架在WindowsAPI函数基础之上的,是封装了的API函数的集合。
它们把常用的API函数的组合在一起成为一个控件或类库,并赋予其方便的使用方法,所以极大的加速了WIN32应用程序开发的过程。
有了这些控件和类库,程序员便可以把主要精力放在程序整体功能的设计上,而不必过于关注技术细节。
2.4开发