windows 下创建进程,CreateProcess ()详解及⽤法
windows下想要创建⼀个⼦进程不如linux的fork函数来得⽅便,通过CreateProcess函数创建⼀个新的进程,函数的定义如下
下⾯写⼀个创建进程和简单的控制⽰例,⾸先创建⼀个⼩程序,作为⼦进程的实体
主要是打印进程的传⼊参数列表,下⾯是创建⼦进程的代码,运⾏后可以看到,⼦进程也能获取到传⼊参数了。
[cpp]
01.
BOOL CreateProcess(  02.
 LPCTSTR lpApplicationName, // 应⽤程序名称  03.
 LPTSTR lpCommandLine, // 命令⾏字符串  04.
 LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程的安全属性  05.
 LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程的安全属性  06.
 BOOL bInheritHandles, // 是否继承⽗进程的属性  07.
 DWORD dwCreationFlags, // 创建标志  08.
 LPVOID lpEnvironment, // 指向新的环境块的指针  09.
 LPCTSTR lpCurrentDirectory, // 指向当前⽬录名的指针  10.
 LPSTARTUPINFO lpStartupInfo, // 传递给新进程的信息  11.
 LPPROCESS_INFORMATION lpProcessInformation // 新进程返回的信息  12.
);
[cpp]
01.
#include<iostream>  02.
#include<Windows.h>  03.
04.
using namespace std;  05.
06.
int main(int argc, char *argv[])  07.
{  08.
cout << "args_num: " << argc << endl;  09.
for(int i = 0;i < argc;i ++){  10.
cout << "arg " << i << " = " << argv[i] << endl;  11.
}  12.
return 0;  13. }
[cpp]
01. #include<iostream>
02. #include<Windows.h>
03.
04. using namespace std;
05.
06. int main()
07. {
08.    char cWindowsDirectory[MAX_PATH];
09.
10.    //LPTSTR 与 wchar_t* 等价(Unicode环境下)
11.    LPTSTR cWinDir = new TCHAR[MAX_PATH];
12.    GetCurrentDirectory(MAX_PATH, cWinDir);
13.
14.    LPTSTR sConLin = wcscat(cWinDir , L"\\..\\Debug\\ a b c d");
15.
16.    STARTUPINFO si;
17.    PROCESS_INFORMATION pi;
18.
19.    ZeroMemory(&si, sizeof(si));
20.    ZeroMemory(&pi, sizeof(pi));
21.
22.    //创建⼀个新进程
23.    if(CreateProcess(
24.        NULL,  //  指向⼀个NULL结尾的、⽤来指定可执⾏模块的宽字节字符串
25.        sConLin, // 命令⾏字符串
26.        NULL, //    指向⼀个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回
的句柄可以被⼦进程继承。
27.        NULL, //    如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。createprocessa
<;同上>
28.        false,//    指⽰新进程是否从调⽤进程处继承了句柄。
29.        0,  //  指定附加的、⽤来控制优先类和进程的创建的标
30.            //  CREATE_NEW_CONSOLE  新控制台打开⼦进程
31.            //  CREATE_SUSPENDED    ⼦进程创建后挂起,直到调⽤ResumeThread函
32.        NULL, //    指向⼀个新进程的环境块。如果此参数为空,新进程使⽤调⽤进程的环
33.        NULL, //    指定⼦进程的⼯作路径
34.        &si, // 决定新进程的主窗体如何显⽰的STARTUPINFO结构体
35.        &pi  // 接收新进程的识别信息的PROCESS_INFORMATION结构体
36.        ))
37.    {
38.        cout << "create process success" << endl;
39.
40.        //下⾯两⾏关闭句柄,解除本进程和新进程的关系,不然有可能不⼩⼼调⽤
TerminateProcess函数关掉⼦进程
41. //      CloseHandle(pi.hProcess);
42. //      CloseHandle(pi.hThread);
43.    }
44.    else{
45.        cerr << "failed to create process" << endl;
46.    }
47.
48.    Sleep(100);
49.
50.    //终⽌⼦进程
51.    TerminateProcess(pi.hProcess, 300);
52.
53.    //终⽌本进程,状态码
54.    ExitProcess(1001);
55.
56.    return 0;
57. }
=======================CreateProcess()详解及⽤法=======================
CreateProcess() 函数原型如下:
[C++]  纯⽂本查看  复制代码
该函数⽤来创建⼀个新的进程。
第 1 个参数  lpApplicationName 是输⼊参数,指向启动进程的 exe ⽂件。
第 2 个参数  lpCommandLine 是输⼊参数,是启动进程的命令⾏中的参数。
当这两个参数都不为 NULL 时,第 1 个参数指定要启动的进程 exe ⽂件(不带参数),第 2 个参数指定启动进程所需参数。第 1 个参数也可以为 NULL,此时第 2 个参数就不能为 NULL,在 lpCommandLine 需要指定出要启动的程序名以及所接参数,彼此间以空格隔开,其中第 1 个参数即是程序名。
第 3 个参数  lpProcessAttributes 是输⼊参数,指向 SECURITY_ATTRIBUTES 结构变量,是进程的安全属性,可以为 NULL 则使⽤默认的安全属性。
第 4 个参数  lpThreadAttributes 是输⼊参数,同第 3 个参数⼀样,指向 SECURITY_ATTRIBUTES 结构变量。
第 5个参数  bInheritHandles 是输⼊参数,表⽰新进程是否从调⽤进程处继承了句柄。如果参数的值为 TRUE,调⽤进程中的每⼀个可继承的打开句柄都将被⼦进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限;如果设为 FALSE,那么不继承。
第 6 个参数  dwCreationFlags 是输⼊参数,表⽰进程的创建标志以及优先级控制。如 : CREATE_NEW_CONSOLE 会使新建的控制台程序拥有⼀个新的控制台; DEBUG_PROCESS 调⽤进程将被当作⼀个调试程序,并且新进程会被当作被调试的进程。系统把被调试程序发⽣的所有调试事件通知给调试器。
第 7 个参数  lpEnvironment 是输⼊参数,指向新进程的环境变量块,如果设置为 NULL,那么使⽤⽗进程的环境变量。
第 8 个参数  lpCurrentDirectory 是输⼊参数,指定创建后新进程的当前⽬录,如果设置为 NULL,那么就在⽗进程所在的当前⽬录。
第 9 个参数  lpStartupInfo 是输⼊参数,指向⼀个 STARTUPINFO 结构,该结构⾥可以设定启动信息,可以设置为 NULL 。
第 10 个参数  lpProcessInformation 是输出参数,指向⼀个 PROCESS_INFORMATION 结构,返回被创建进程的信息。
测试代码:
[C++]  纯⽂本查看  复制代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。