《Windows核心编程》笔记——进程

定义:

一般定义为正在运行程序的一个实例,由以下两部分组成:

  1. 一个内核对象,操作系统用它管理进程。
  2. 一个地址空间,其中包含所有可执行文件或DLL。

系统创建一个进程时,会自动为进程创建第一个线程,称为主线程。

 

应用程序类型

入口点函数

嵌入可执行文件的启动函数

ANSI的GUI应用程序

_tWinMain

WinMainCRTStartup

Unicode….GUI….

_tWinMain

wWinMainCRTStartup

ANSI….CUI….

_tmain

mainCRTStartup

Unicode….CUI….

_tmain

wmainCRTStartup

 

CUI和GUI程序的区别在于编译器链接不同入口点函数,在项目属性的子系统里设置:
/SUBSYSTEM:CONSOLE
/SUBSYSTEM:WINDOWS
如果删除该选项,则由程序自动确定。

 

获取环境变量:
GUI:调用GetEnvironmentStrings函数
CUI:通过传递进来的main函数所接受的TCHAR* env[]参数来实现

判断环境变量是否存在:
调用GetEnvironmentVariable函数。
获取环境变量的值:
WCHAR *pszVarName = TEXT("%USERPROFILE%");
WCHAR pszVarValue[MAX_PATH];
ExpandEnvironmentStrings(pszVarName,pszVarValue,MAX_PATH);
这时pszVarValue的值就变成了pszVarName所代表环境变量的具体路径。

添加或删除环境变量:
调用SetEnvironmentVariable函数,第一个参数为函数名,第二个参数为函数路径,如果第二个参数为NULL,则删除。

线程可以调用GetCurrentDirectory和SetCurrentDirectory来获取和设置其所在的当前驱动器和目录:
WCHAR str[MAX_PATH];
GetCurrentDirectory(MAX_PATH,str);

获取当前系统版本:
调用GetVersion/GetVersionEx函数,使用OSVERSIONINFOEX结构。
Vista提供了VerifyVersionInfo函数,用来比较主机系统的版本和应用程序的版本。

创建新进程:
调用CreateProcess函数。如果系统成功创建了新进程和其主线程,返回TRUE。
该函数的第二个参数pszCommandLine用来表示命令行的参数,也可传进完整的程序路径,执行程序。
传进去的该是个“非常量字符串”
编译器有个/ZI开关,允许“调试时编辑并继续”/GF用来消除重复的常量字符串。
即使第一个参数给了要执行的参数,CreateProcess仍会将pszCommandLine参数中的内容作为新进程的命令行传递给它。
psaProcess、psaThread、bInheritHandles参数是用来指定新进程的安全性的,如果给NULL,则使用默认的安全属性。
psiStartInfo参数用来传递一些启动参数,比如窗口大小、坐标等,一般用默认值,但要注意,在使用前要将该结构清空。
STARTUPINFO si = { sizeof(si) };

还有几个属性,用到时再说吧,下面给段简单的CreateProcess使用代码:
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
TCHAR szCommandLine[] = TEXT(“NOTEPAD”);
CreateProcess(NULL,szCommandLine,NULL,NULL,
                         FALSE,0,NULL,NUL,&si,&pi);

方法

优缺点

其他

主线程返回

进程中的对象都会被正确析构和销毁

操作系统将正确释放线程栈使用的内存

系统将进程的退出代码设为入口函数返回值

系统递减进程内核对象使用计数

一切都会被正确清理

进程中一个线程调用ExitProcess函数

调用ExitProcess和ExitThread会导致进程或线程直接终止运行。C/C++运行库也许不能执行正确清理工作。因为它造成进程当场死亡,可能没来得及执行清理工作。
详见P101给出代码

应该避免

另一个进程调用TerminateProcess函数

任何线程都可以调用TerminateProcess来终止自己或其他进程。它是异步的,为了确保进程已经终止,应调用WaitForSingleObject来进行确认。

应该避免,一旦进程终止,操作系统保证不会泄露任何东西

自然死亡

小概率事件……基本不会发生

系统终止时进行的操作:P103


子进程:
生成一个新的进程来帮我们完成工作,新的进程称为子进程。
在使用子进程时,需要调用WaitForSingleObject来确认是否执行完成,详见P105



函数列表:

函数名 功能 所在页
GetModuleHandle 获取实例句柄 P71
GetModuleHandleEx 获取实例句柄 P72
GetCommandLine 获得指向进程的命令行指针 P73
GetEnvironmenStrings 获取环境变量块 P74
FreeEnvironmentStrings 释放GetEnvironmentStrings P76
GetEnvironmentVariable 判断环境变量是否存在 P78
SetEnvironmentVariable 增、删、改一个环境变量 P79
SetErrorMode 告诉系统如何处理错误 P79
GetCurrentDirectory 获取当前驱动器和目录 P80
GetFullPath 获取父进程当前目录 P81
GetVersion
GetVersionEx
获取系统版本 P82
VerifyVersionInfo 比较主机与软件要求的版本 P83
CreateProcess 创建一个进程  
ExitProcess
TerminateProcess
终止进程 P100
GetCurrentProcessId
GetProcessId
GetThreadId
GetProcessIdOfThread
获取当前进程ID
获取指定进程ID
获取线程ID
获取某线程所对应线程的ID
P100
posted @ 2009-04-29 10:44  飘啊飘  阅读(899)  评论(0编辑  收藏  举报