《Windows程序设计》第一章 起步
这些程式使用C 语言撰写并原原本本的使用Windows API 来开发程式。我将这种方法称作「古典」Windows 程式设计。这是我们在1985 年为Windows 1.0 写程式的方法,它今天仍是写作Windows 程式的有效方法。
一般而言,Windows
API 自Windows
1.0 以来一直保持一致,没什么重大改变。
Windows
API和它的语法的最大变化来自於从16位元架构向32位元架构转
化的过程中。
使用C 语言和原始的API 不是编写Windows
98程式的唯一方法。然而,这
种方法却提供给您最佳的性能、最强大的功能和在发掘Windows 特性方面最大
的灵活性。可执行档案相对较小且运行时不要求外部程式库(自然,Windows
DLL
自身除外)。
虽然我认为学习古典的Windows 程式设计对任何Windows 程式写作者都是
重要的,我没有必要建议使用C 和API 编写每个Windows 应用程式。许多程式
写作者,特别是那些为公司内部开发程式或在家编写娱乐程式的程式写作者喜
欢轻松的开发环境,例如Microsoft
Visual Basic 或者Borland
Delphi(它结
合了物件导向的Pascal 版本)。
在专业程式写作者中——特别是那些开发商业应用程式的程式写作者——
Microsoft
Visual C++和Microsoft
Foundation Class Library(MFC)是近年
来流行的选择。MFC在一组C++物件类别中封装了许多Windows程式设计中的琐
碎细节。
最近,Internet 和World
Wide Web 的流行大力推广著Sun
Microsystems
的Java,这是一个受C++启发却与微处理器无关的程式设计语言,而且结合了
可在几个作业系统平台上执行的图形应用程式开发工具组。
在原始的Windows
API 之上的任何软体层都必定将您限制在全部功能的一
个子集内。您也许发现,例如,使用Visual
Basic 编写应用程式非常理想,然
而它不允许您做一个或两个很简单的基本工作。在这种情况下,您将不得不使
用原始的API 呼叫。API 定义了作为Windows程式写作者所需的一切。没有什么
方法比直接使用API 更万能的了。
MFC 尤其问题百出。虽然它大幅简化了某些工作(例如OLE),我却经常发
现要让它们按我所想的去工作时,会在其他特性(例如Document/View 架构)
上碰壁。MFC 还不是Windows 程式设计者所追求的灵丹妙药。
编写第一个Windows程序
#include
<stdio.h>
int main()
{
printf("Hello, world\n");
return 0;
}
同样效果的Windows程序:
#include
<windows.h>
int
WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
MessageBox(NULL, TEXT("Hello, Windows 98!"), TEXT("HelloMsg"), 0);
return 0;
}
创建过程:打开VS,新建VC++下的Win32
Application。在建好的解决方案中的源代码文件夹下添加C++文件,取名为HelloMsg.c。拷贝以上代码并运行,得到提示框:Hello, Windows 98。
表头档案
WINDOWS.H 是主要的含入档案,它包含了其他Windows表头档案,这些表头
档案的某些也包含了其他表头档案。这些表头档案中最重要的和最基本的是:
WINDEF.H 基本型态定义。
WINNT.H 支援Unicode 的型态定义。
WINBASE.H
Kernel 函式。
WINUSER.H 使用者介面函式。
WINGDI.H 图形装置介面函式。
程序进入点
正如在C 程式中的进入点是函数main 一样,Windows 程式的进入点是
WinMain。
编译、连结和执行
在编译阶段,编译器从C 原始码档案产生一个.OBJ(目标)
档案。在连结阶段,连结程式结合.OBJ 档案和.LIB(库)档案以建立.EXE(可
执行)档案。
KERNEL32.LIB、
USER32.LIB 和GDI32.LIB。这些是三个主要Windows 子系统的「引用程式库」。
它们包含了动态连结程式库的名称以及放进.EXE 档案的引用资讯。Windows 使
用该资讯处理程式对KERNEL32.DLL、USER32.DLL、GDI32.DLL 动态连结程式库
中函数的呼叫。