本章内容:
• 对象—以前和现在
• 多任务和多线程
• Win32内存管理
• Win32的错误处理
本章介绍Win32 API和Win32系统。还要讨论Win32系统的功能以及它与16位系统在功能上的几个 主要区别。本章内容不是关于 Win32系统的详细文档,而只是让对Win32系统有一个基本的了解。当已 经基本了解Win32操作后,就可以在任何需要的时候使用 Win32系统提供的高级功能了。
3.1 对象:以前和现在
对象这个术语可以用于不同的场合。我们谈论 Win32的体系结构时,实际上并不是指面向对象编 程或组件对象模型 (COM)中的对象。在不同的场合对象具有完全不同的含义,甚至 16位Windows中的对象与Win32中的对象也有细小的差别,这使对象的概念很容易混淆。我们在这里重点介绍 Win32中的 对象。
Win32环境中有两种基本的对象类型:内核对象和 GDI/用户对象。
3.1.1 内核对象
内核对象是 Win32系统原有的,包括事件、文件映射、文件、邮件槽、互斥、管道、进程、信号 灯和线程。Win32 API 包含有针对不同内核对象的函数。在讨论内核对象之前,我们先要讨论进程的 概念,因为这是理解 Win32环境如何管理对象的基础。
1. 进程和线程
可以认为一个进程就是一个正在运行的应用程序或一个应用程序的实例。因此,在 Win32环境中 可以同时激活几个进程。每个进程可以为它的代码和数据获得 4GB的地址空间。在这4GB地址空间中, 存在着已分配的内存、线程、文件映射等。另外,由进程调用的动态链接库也在进程的地址空间中。 这章后面的3.3节“Win32内存管理”将详细介绍Win32的内存管理。
进程是惰性的。换句话说,进程本身并不执行任何代码。然而,每个进程拥有一个主线程,由 主线程在进程的环境中执行代码。一个进程可以拥有几个线程;但是,一个进程只能有一个主线 程。
注意 线程是一种操作系统对象,代表着一个进程中要被执行的代码的路径。每一个Win32应 用程序至少有一个线程—通常称为主线程或默认线程—但应用程序可以自由地创建其他线 程来执行其他任务。第11章“编写多线程应用程序”将进一步介绍线程的用法。
当一个进程被创建后,系统就会为它创建一个主线程。如果需要的话,该主线程还可以创建其他 线程。Win32系统把CPU时间片分配给这些线程。
表3-1显示了Win32 API 中有关进程的函数。
表3-1 进程函数
函 数 用 途
CreateProcess() 创建进程及其主线程。该函数代替Windows 3.11 中使用的WinExec()函数
ExitProcess() 退出当前进程,并终止与此进程有关的所有线程
GetCurrentProcess() 返回当前进程的句柄。但该句柄只能认为是当前进程句柄的副本。真正的 进程句柄是通过调用 DuplicateHandle()函数获得的
DuplicateHandle() 复制一个内核对象的句柄
GetCurrentProcessID() 返回当前进程的ID,它在整个系统中唯一地标识一个进程,直到该进程终 止
GetExitCodeProcess() 返回指定进程的退出状态
GetPriorityClass() 返回指定进程的优先级类别。它和每个线程的优先级类别共同决定了该线 程的基本优先级
GetStartupInfo() 返回进程创建时被初始化的TStartupInfo结构的内容
OpenProcess() 返回用进程ID指定的进程的句柄 SetPriorityClass()