#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
using namespace std;
DWORD WINAPI ThreadProc(LPVOID lpParameter);
int main(int argc, char* argv[])
{
STARTUPINFO info;//info里面有巨多的参数,可以控制进程的信息,比如说是否全屏,是否显示程序在程序栏等等
ZeroMemory(&info,sizeof(STARTUPINFO));
info.cb = sizeof (STARTUPINFO);//Windows编程很多地方都需要初始化大小
info.dwFlags = STARTF_RUNFULLSCREEN;
PROCESS_INFORMATION si;
//注意,实际的地址是只有 一个'\',但是这个在语言中需要转义字符,所以就成对出现
if(!CreateProcess(L"H:\\AllCode\\Qt\\Windows-Study\\build-Windows16-test-Desktop_Qt_5_14_2_MinGW_64_bit-Debug\\debug\\Windows16-test.exe",/*应用程序的名字以及全路径,只是名字,不能给程序传递参数*/
L"参数1 参数2",/*字符串,命令行字符串,可以没有命令行,可以用来给程序传递参数*/
NULL,/*一个指向SECURITY_ATTRIBUTES结构的指针,
这个结构体中最重要的是安全描述符,他决定了新产生的进程对象,
能否被其他子进程继承,这个进程对象,可以被哪些用户访问。
如果这个参数是NULL,那么产生的进程的进程对象不能被继承*/
NULL,/*一个指向SECURITY_ATTRIBUTES结构的指针,
是一个线程安全描述符,是指主线程的安全描述符
如果=NULL,表明新线程的句柄不能被继承*/
FALSE,/*产生的句柄可不可以被继承*/
CREATE_NEW_CONSOLE,/*创建标志,规定如何创建这个进程以及优先级
可以决定父进程和子进程是否同属一个框(有一个参数可以做到),
可以决定父进程和子进程是继承关系还是平行关系,
可以创建组群等,
可以指定计算机用哪个CPU*/
NULL,/*指向环境变量块*/
NULL,/*指向当前目录*/
&info,/*启动信息,一般是默认值*/
&si)/*可以用于后续的关闭*/)
{
int i = GetLastError();
_tprintf(L"CreateProcess failue! %d\n",i);
}
else
{
_tprintf(L"CreateProcess sucess!\n");
}
cout << "waiting for child_process exit!" << endl;
WaitForSingleObject(si.hProcess, INFINITE/*INFINITE:无限等待*/);
//这个函数会阻塞程序运行,只有当si.Process进程退出后,这个函数才返回
cout << "child_process exite" << endl;
//进程内核对象代表一个进程,我们用一个进程句柄来访问进程
//进程消失后,进程的内核对象可能会消失,也可能不会消失,但是进程不死,进程的内核对象一定不会消失
//那什么时候销毁进程内核对象呢?当进程内核对象的引用计数为0时,才会销毁内核对象
/*
* 当进程退出的时候,进程的内核对象的状态会发生变化,我们把进程退出后,
* 代表进程的内核对象的状态称为激发态。
* 如果进程正在运行,那么代表进程内核对象的状态称为非激发态,
* 此时,如果有类似WaitForSingleObject函数这样需要等待进程内核对象的话,
* 这种函数会被阻塞,直到进程退出,进程内核对象处于激发态
*/
if(!CloseHandle(si.hProcess))//直到调用这个函数,代表这个子进程的内核对象才可能被销毁
{
cout << "CloseHandle error! " << GetLastError() << endl;
}
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
cout << "Thread start" << endl;
Sleep(2);//INFINITE无限
cout << "Sleep" << endl;
ExitProcess(-1);
cout << "ExitProcess" << endl;
return 0;
}
被打开的test程序:
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
for(int i = 0; i<argc; i++)
{
printf("%s\n",argv[i]);
}
getchar();
return 0;
}