知识点:
创建一个进程需要用到CreateProcess函数,其在MSDN的描述如下:
The CreateProcess function creates a new process and its primary thread. The new process runs the specified executable file in the security context of the calling process.
即这个函数创建了一个新进程和它的主线程。这个新进程在安全环境中调用进程时运行指定的可执行文件。
这个函数的定义如下:
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 进程信息
);
各个参数具体设置如下:
1、lpApplicationName: 指向一个字符串选定可执行模块。这个字符串可以是可执行文件的全路径,或者是一部分名字。在一部分名字的情况下,函数会用当前的驱动器和当前的目录来完成指向。如果这个参数是NULL,这个模块名字是第一个被命令行参数限定空间的字符串
2、lpCommandLine:这个参数是NULL时,函数会用第一个参数,即lpApplicationName指定的字符串作为命令行参数
3、lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构体,来决定返回的句柄是否被子进程继承。如果这个参数设置为NULL,
那将不能被继承。
4、lpThreadAttributes:同上,只是来决定主线程是否被继承,为NULL时将不能被继承
5、bInheritHandles:指出新的进程是否会继承当前的进程的句柄。如果是TRUE,则可。反之为FALSE。
6、dwCreationFlags:指向用来控制优先权类和创建进程的标志。值有很多,具体参看MSDN,这里用的是CREATE_NEW_CONSOLE,
说明进程有新的控制台,而不是继承父进程。
7、lpEnvironment:如果这个参数为NULL,那么就会用当前进程的环境
8、lpCurrentDirectory:如果这个参数为NULL,那么就会用当前进程的驱动和目录
9、lpStartupInfo:Pointer to a STARTUPINFO structure that specifies how the main window for the new process
should appear
10、lpProcessInformation:Pointer to a PROCESS_INFORMATION structure that receives identification information
about the new process.
STARTUPINFO结构体的具体参数参照MSDN,本例中,用了其中的俩个参数。dwFlags 和 wShowWindow。第一个参数用来指定有效性,第二个则是指定窗口是否显示。
而PROCESS_INFORMATION结构体:
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess; 新建进程内核句柄
HANDLE hThread; 新建进程主线程句柄
DWORD dwProcessId; 新建进程ID
DWORD dwThreadId; 新建进程主线程ID
} PROCESS_INFORMATION;
关于ID号:当一个进程对象创建以后,系统会为一个内核对象分配一个唯一ID号,在系统中不会再有其他内核对象的ID号与此相同。
关闭句柄可以用CLoseHandle()函数,参数是要关闭的句柄.