详细简单的WIN下创建进程(C语言)

只需要记住一个头文件和一个函数

头文件:

创建函数:
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 
#include 

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的方法:


1.获取当前进程ID函数:

	DWORD PID;
	PID  = GetCurrentProcessId();
	printf("ID:%d\n",PID);
可以用来获取父进程的ID
也可以获取子进程(写在子进程中)

2.直接通过上面代码里面的pi.dwProcessId()来获得
也就是你创建一个进程的时候的pi可以看作是这个进程的虚拟对象。

你可能感兴趣的:(c,操作系统)