开始
最近有幸拜读了Charles Petzold的大作《Windows程序设计》,真有种相见恨晚的感觉。这是一本1999年出版、主要讲述在Windows平台下如何使用C语言调用API函数进行软件开发的老书。在当今RAD工具充斥市场的今天,该书依然是新手从事Windows下软件开发入门的不二之选。本人从事Windows平台软件开发已近三年,Windows相关的书籍和文档也阅读过不少,直到接触该书之后,好多以往含糊不清的概念才一下子豁然开朗。说到这里,不得不佩服Charles Petzold先生的文笔和才识,能够把windows程序开发知识讲解的如此简洁明了、浅显易懂。
第一章讲述的主要是些介绍性的、基础性的文字内容。
接触该书的先决条件是安装有Windows系统、了解C语言、安装有可进行Windows编程的开发环境。
Winows是支持抢占式多任务、多线程的图形操作系统。支持CUI(控制台用户接口)和GUI(图形用户接口)两种编程方式。所有基于GUI的Windows程序至少有一个窗口,支持鼠标和键盘控制,每一个时刻可以有多个Windows程序同时运行,互不冲突。
Winows运转的核心是一个被称作“动态连接”的概念。通过“动态连接”功能可调用Windows提供的系统函数即API,这些函数主要包含在Kernel.dll(包含内存管理、文件I/O、任务处理API函数)、User.dll(包含用户界面API函数)、GDI.dll(包含图形设备接口API函数)三个动态连接库中。以往调用C库函数,只要包含头文件,就可以将C库函数中的机器代码连接到我们的程序中;调用Windows API函数,除了需包含头文件,还需要一个对应的“导入库(import library)”文件,用以指明dll动态库的函数调用入口,而且dll动态库并不被连接到我们的程序中,只有在程序运行时,系统才将相应dll动态库载入到内存中。
在16位版本Windows中,通过分段模式(内存地址由一个16位段地址和一个16位偏移量组成)进行内存管理,C语言中的int数据类型是16位宽。在32位版本Windows中,Windows支持32位模式的平面内存模式,C语言中的int数据类型也扩充32位宽。考虑到程序兼容性,目前32位版本的Windows都支持Win16 API和Win32 API,调用Win16函数通过一个转换层被转化为Win32函数调用,然后被操作系统调用。
使用C语言和原始API不是编写Windows程序的唯一办法,却是深入透彻理解Windows系统运作原理最有效的办法。当然,MFC、VCL等大型库源码还是非常有参考价值的,它可以让你明白专家级的Windows编程是怎么一回事。
推荐使用Visual C++ 6.0作为编程环境。MSDN是Windows开发者的宝库。
下面是基于控制台模式的典型代码:
#include <stdio.h>
main()
{
printf(“hello,world!\n”);
}
下面是基于图形模式的典型代码:
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PSTR szCmdLine,int iCmdShow)
{
MessageBox(NULL,TEXT(“Hello,Windows 98!”),TEXT(“HelloMsg”),0);
return 0;
}
windows.h包含了多个其他Windows头文件,如windef.h(基本类型定义)、winnt.h(支持unicode的类型定义)、winbase.h(内核函数)、winuser.h(用户接口函数)、wingdi.h(图形设备接口函数)。
如基于控制台模式程序的入口点函数是main一样,windows图形模式程序的入口点是WinMain,总是想这样出现:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,PSTR szCmdLine,int iCmdShow)
WINAPI是一个调用约定,等价于__stdcall。
HINSTANCE是一种句柄类型,其值用以标识对象。第一个参数用以表示该程序实例;
第二参数现已废弃,总是NULL,我们不必理会;第三个参数为运行程序的命令行;第四个参数指出程序初始显示的方式。
MessageBox显示一个消息对话框。第一个参数指出父窗口句柄,设置为NULL即没有父窗口;第二个参数显示消息内容;第三个参数显示对话框标题;第四个参数指出对话框上的按钮组合和显示图标;返回值是一个整型值,标识是按下了对话框上哪个按钮。
编译此程序时,生成一个.OBJ文件,链接阶段,链接程序结合.OBJ文件和.LIB文件建立.EXE文件。通过在Project选项上选择Setting,然后单击link标签,可以看到导入库(import library)列表。
在Visual C++中,可以选择不同配置编译和链接程序,默认有Debug和Release两种配置。