转载:https://blog.csdn.net/bzhxuexi/article/details/23950701
先写一个简单的程序:
1 #include<iostream> 2 #include<Windows.h> 3 4 using namespace std; 5 6 int main(int argc, char *argv[]) 7 { 8 cout << "args_num: " << argc << endl; 9 for(int i = 0;i < argc;i ++){ 10 cout << "arg " << i << " = " << argv[i] << endl; 11 } 12 system("pause"); 13 return 0; 14 }
然后写一个程序,通过CreateProcess执行上面的程序生产的exe文件
1 #include<iostream> 2 #include<Windows.h> 3 4 using namespace std; 5 6 int main() 7 { 8 char cWindowsDirectory[MAX_PATH]; 9 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\another.exe 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),那么句柄不能被继承。<同上> 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 }