只需要记住一个头文件和一个函数
头文件:
<windows.h>
创建函数:
createProcess函数
BOOL CreateProcess(//返回值是BOOL型,可以通过这个判断是否创建成功
LPCTSTR lpApplicationName, //要创建的进程名称,可执行文件
LPTSTR lpCommandLine, //命令行参数
这里说明下:
在第一个参数和第二个参数里都可以放你的.exe文件的名字,具体做法有以下几种:
文件名字是字符串 可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。
1.文件名字放第一个位置,命令参数写为NULL,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。
2.第一个位置写为NULL,.exe文件名字(注意是字符串,可以先存字符数组里面)直接放在第二个位置,那么这个字符串中的第一个被空格分隔的要素指定可执行模块名。如果文件名不包含扩展名,那么.exe将被假定为默认的扩展名。若文件名中不包含路径,Windows将按照如下顺序寻找这个可执行文件:
1).当前应用程序的目录。
2).父进程的目录。
3).Windows 系统目录
4).列在PATH环境变量中的目录
3.第一个第二个位置都放了,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。
以下这些参数不用深究,,如果你只是做操作系统作业的话。。哈哈哈。。。
LPSECURITY_ATTRIBUTES // 是否继承进程句柄
LPSECURITY_ATTRIBUTES //是否继承线程句柄
BOOL bInheritHandles //是否继承句柄
DWORD dwCreationFlags //有没有创建标志
LPVOID lpEnvironment // 是否使用父进程环境变量
LPCTSTR lpCurrentDirectory//使用父进程目录作为当前目录,可以自己设置目录
LPSTARTUPINFO lpStartupInfo//STARTUPINFOW结构体详细信息(启动状态相关信息)
LPPROCESS_INFORMATION//PROCESS_INFORMATION结构体进程信息
当然在创建之前要进行准备工作:
譬如对创建的进程的初始信息结构体的大小的初始化,
进程句柄的设定。
#include<stdio.h>
#include <windows.h>
int main()
{
STARTUPINFO si = {sizeof(si)}; //记录结构体有多大,必须要参数
PROCESS_INFORMATION pi; //进程id,进程句柄,线程id,线程句柄存在于这个结构体
char lpPath[] = "test.exe"; //这是用于新进程执行的文件(当前目录下的嗷用的是想对路径)
CreateProcess(NULL,lpPath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
printf("子进程ID:%d\n",pi.dwProcessId);
return 0;
}
新创建出来的进程就是原来main进程的子进程。当然需要你先写一个test.cpp然后产生.exe文件,再运行这个程序,你会发现你通过这个程序打开了test.exe文件。
再介绍寻找进程ID的方法:
<windows.h>中
1.获取当前进程ID函数:
DWORD PID;
PID = GetCurrentProcessId();
printf("ID:%d\n",PID);
可以用来获取父进程的ID
也可以获取子进程(写在子进程中)
2.直接通过上面代码里面的pi.dwProcessId()来获得
也就是你创建一个进程的时候的pi可以看作是这个进程的虚拟对象。