定义:
一般定义为正在运行程序的一个实例,由以下两部分组成:
系统创建一个进程时,会自动为进程创建第一个线程,称为主线程。
应用程序类型 |
入口点函数 |
嵌入可执行文件的启动函数 |
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++运行库也许不能执行正确清理工作。因为它造成进程当场死亡,可能没来得及执行清理工作。 |
应该避免 |
另一个进程调用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 |