当前位置: 首页 > news >正文

关于CreateProcess函数一些经验

	TCHAR szCmdLine[]={TEXT("E:\\CPL-server\\其他工具\\restartSrv\\bin\\opensavepath.exe")};
	TCHAR static szCommandLine[MAX_PATH + 700] = {0};
	lstrcpy(szCommandLine, pProgramPath);

	STARTUPINFO si = {0};
	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(STARTUPINFO);
	GetStartupInfo(&si);
	si.wShowWindow = SW_SHOW;
	si.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

	// 运行进程
	PROCESS_INFORMATION pi;
	ZeroMemory(&pi, sizeof(pi));

	BOOL bRet = FALSE;
	bRet = CreateProcess(pProgramPath, NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);

	///<关闭Restartsrv不会关闭创建进程子窗口>
 	//BOOL bRet = CreateProcess(
 	//	NULL,					// name of executable module
 	//	szCmdLine,			// command line string
 	//	NULL,					// process attributes
 	//	NULL,					// thread attributes
 	//	FALSE,					// handle inheritance option
 	//	CREATE_NEW_CONSOLE,						// creation flags
 	//	NULL,					// new environment block
 	//	NULL,					// current directory name
 	//	&si,					// startup information
 	//	&pi);					// process information
 
 	if( bRet )
 	{
 		CloseHandle(pi.hThread);
 		CloseHandle(pi.hProcess);
 	}

	//ShellExecute(NULL, "open", szCmdLine, NULL, NULL, SW_SHOWNORMAL);
	
	return bRet;

  

都说通过createprocess函数创建的另一个进程(打开另一个程序),关闭父进程一般不会关闭子进程。

但是最近测试发现如果使用一个控制台程序使用createprocess函数打开另一个控制台程序,而且dwCreationFlags参数不指定为CREATE_NEW_CONSOLE或者DETACHED_PROCESS值。那么关闭父进程也会关闭子进程。

如果使用一个控制台程序使用createprocess函数打开的是一个窗口程序,关闭父进程确实不会关闭子进程。

另外在控制台程序中使用 ShellExecute(NULL, "open", szCmdLine, NULL, NULL, SW_SHOWNORMAL);打开一个进程控制台程序或者窗口程序,关闭父进程对子进程都没有影响。

 

所有,我猜测是因为使用控制台程序打开另一个控制台程序,不特别指定创建新控制台窗口或者脱离父进程,他们使用的是同一个控制台,没有创建新的控制台窗口,所有关闭这个控制台窗口相当于关闭了两个控制窗口。

相关文章:

  • 前端解决跨域 cors
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 斐波那契数列 的计算规则
  • react 中 props 和 state的相同与不同
  • 理解java Web项目中的路径问题
  • react 中千万不要在render里调用this.setState
  • 系统界面图片
  • HDU 3068 回文串-Manacher
  • reactJS的props.children.map函数来遍历会收到异常提示,为什么?应该如何遍历?
  • Elasticsearch 2.3.3 搜索引擎的elasticsearch-jdbc插件安装
  • Redux中同步 action 与异步 action 最大的区别是什么
  • setTimeout和setInterval的区别
  • shell脚本编程
  • 数组常用的处理方法 map,forEach,filter, every,some, set, concat, find 等
  • 阿里云自定义监控配置实例
  • centos安装java运行环境jdk+tomcat
  • JavaScript对象详解
  • JS笔记四:作用域、变量(函数)提升
  • Making An Indicator With Pure CSS
  • Rancher-k8s加速安装文档
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Spring声明式事务管理之一:五大属性分析
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 回顾 Swift 多平台移植进度 #2
  • 计算机常识 - 收藏集 - 掘金
  • 解析 Webpack中import、require、按需加载的执行过程
  • 每天一个设计模式之命令模式
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 如何利用MongoDB打造TOP榜小程序
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 如何用纯 CSS 创作一个货车 loader
  • 通过调用文摘列表API获取文摘
  • ​业务双活的数据切换思路设计(下)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (二)学习JVM —— 垃圾回收机制
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • *** 2003
  • *Django中的Ajax 纯js的书写样式1
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .axf 转化 .bin文件 的方法
  • .net 怎么循环得到数组里的值_关于js数组
  • [@Controller]4 详解@ModelAttribute
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [20160902]rm -rf的惨案.txt
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • [hdu2196]Computer树的直径
  • [IE9] IE9 RC版下载链接
  • [iOS]如何删除工程里面用cocoapods导入的第三方库