1. 进程的定义
进程通常被定义为一个正在运行的程序的实例.它通常有两部分组成:
(1) 由操作系统来管理进程的内核对象;
(2) 另一个是地址空间.
注意:进程是不活泼的,它必须拥有一个在它的环境中运行的线程.
2. Windows支持的两种应用程序:
(1) 基于图形用户界面的应用程序,即GUI;
(2) 基于控制台用户界面的应用程序,即CUI.
Windows应用程序必须有一个在应用程序启动运行的调用进入点函数:
应用程序类型 进入点
需要ANSI字符和字符串的GUI应用程序 WinMain
需要ANSI字符和字符串的CUI应用程序 main
需要Unicode字符和字符串的GUI应用程序 wWinMain
需要Unicode字符和字符串的CUI应用程序 wmain
3. 进程的实例句柄
加载到进程地址空间的每个可执行文件或者dll文件均被赋予一个独一无二的实例句柄.
4. 进程的命令行
当一个新进程创建时,它要传递一个命令行.该命令行几乎永远不会是空的,至少用于创建新进程的可执行文件的名字是命令行的第一个标记.
5. 进程的环境变量
每个进程都有一个和它相关的环境块.环境块是进程的地址空间中分配的一个内存块,每个环境块都包含了一组字符,其形式如下:
VarName1=VarValue1/0
VarName2=VarValue2/0
......
VarNameX=VarValueX/0
注意:(1)环境块中的所有字符串都必须按环境变量名的字母顺序进行排序.
(2)变量中的空格是有意义的,因为紧靠着等号前面或后面的任何空格均作为比较时的条件被考虑在内.
如:
XYZ=Home
XYZ =Work
是不一样的.带空格的环境变量XYZ 包含的是Work,而不包含空格的是包含Home.
(3)必须将一个0字符置于所有环境变量的结尾处,以表示环境块的结束.
4. 进程的亲缘性
一般情况下,进程中的线程可以在计算机中的任何一个cpu上执行,但是一个进程的线程可能被强制在可用cpu的子集上运行.这称为进程的亲缘性.子进程继承了父进程的亲缘性.
5. 进程的错误模式
进程可以告诉系统如何处理每一种错误,调用SetErrorMode函数.原形:
UINT SetErrorMode(UINT fuErrorMode) ;
默认情况下,子进程继承父进程的错误模式;但是,有可能子进程并没有得到这一通知,它可能还没有编写如何处理故障,就有可能被终止运行,而不通知用户.父进程可以防止子进程继承自己的错误模式,方式是调用CreateProcess时设定CREATE_DEFAULT_ERROR_MODE标志.
6. 进程的当前驱动器和目录,当前目录
可以调用:
DWORD GetCurrentDirectory(DWORD cchCurDir, PTSTR pszCurDir);
BOOL SetCurrentDirectory(PTSTR pszCurDir);
系统将对进程的当前驱动和目录保持跟踪,但是它不会跟踪每个驱动器的当前目录.如果父进程创建了一个它想传递给子进程的环境块,子进程不会自动继承父进车工的当前目录;相反,子进程的当前目录将默认为每个驱动器的根目录.如果想让子进程继承父进程的当前目录,该父进程必须创建这些驱动器的环境变量,并在生成子进程前将它们添加给环境块.通过调用GetFullPathName,父进程可以获得它的当前目录.如:要获得驱动器C的当前目录:
TCHAR szCurDir[MAX_PATH];
DWORD GetFullPathName(TEXT("C"), MAX_PATH, szCurDir, NULL);
注意:进程的环境块必须始终按照字母顺序来排,因此,驱动器的环境变量通常必须置于环境块的开始处.