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小时内删除。
发表评论