CreateProcess
创建进程的API
1.它会创建一个内核对象
但是这个内核对象其实并不代表当前进程的本身,因为进程所代表的是内存中的一个区域
内核对象是一个结构体
里面有一个使用计数的成员
主要是用于内核对象的清理
当内核对象被创建的时候,使用计数置为1,使用完后减1,当操作系统发现使用计数为0时,会将其回收掉
2.操作系统会为新进程创建一个虚拟地址空间
我们没法直接修改物理内存,一是因为内存是有限的,需要使用虚拟地址空间技术,二来是为了安全,如果每个程序都能直接操作物理内存,那么程序就很容易崩溃(一不小心修改了其它程序的数据)
3.给新进程的主线程创建一个新的线程
也会有一个自己的线程内核对象,也会有使用计数,并且将其置为1注意:当以上事情做完之后返回true,但事实上还有的许多工作,是由已经启动了的进程去做的
之后由这个进程创建出来的新进程,形成父子关系,启动的进程为“父进程”,被启动的进程为“子进程”,但是,要注意的是,尽管他们是父子关系,但它们也是独立的两个独立的进程,不能够直接进行通信
原型
BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information);
参数
lpApplicationName
指定新进程要使用的执行体文件的名称
执行体文件:exe文件
如果传入的是一个路径,那么有绝对路径和相对路径之分,此时的相对路径是相对于当前目录路径(以exe所在的目录为基准),如果没有找到,就不会执行
可以为空,如果为空,则需要下一个参数lpCommandLine指明文件的路径,如果不为空,lpCommandLine会被作为命令行参数传递
lpCommandLine
如果第一个参数为空,则会执行这个参数指定的文件路径。其实经常是通过这个参数来指定文件路径,而不是使用上一个参数
如果是一个相对路径,会按照以下顺序来搜索:
1.所在目录
2.当前目录
3.Windows系统目录(System32目录)
4.Windows目录
5.Path环境变量中列出的目录
特别注意:CreateProcess内部会修改这个参数,所以我们不应该传递一个常量指针
lpProcessAttributes
设置进程内核对象的安全属性,可以设置为NULL
lpThreadAttributes
设置主线程内核对象的安全属性,可以设置为NULL
bInheritHandles
是否允许被继承,可以设置为false
dwCreationFlags
进程创建方式标志
CREATE_NO_WINDOW
标识只是系统不要为应用程序创建任何控制台窗口
可以使用这个标识来执行没有用户界面的控制台应用程序
还有很多标志,用时自查
lpEnvironment
它指向一个内存块, 其中包含了新进程要会用的环境变量字符串
一般设置为NULL
子进程继承父进程使用的一组环境变量字符串
lpCurrentDirectory
允许父进程设置子进程的当前驱动器和目录
如果参数为NULL, 新进程的工作目录与生成新进程的应用程序相同
lpStartupInfo
注意:此结构体一定要清零, 否则成员间包含主调线程对站上的垃圾数据
待续…
lpProcessInformation
待补充…