关于通过ShellExecute()启动CMD的环境变量问题

本文最后更新于:2021年11月20日 下午

前情提要

CMD(命令提示符)是Windows上的命令解释程序

我们可以快速地在系统菜单中启动CMD,并执行一系列快捷操作

但作为一个程序员,我们可能经常需要在程序中调用CMD来执行指令以辅助执行任务

这就涉及到外部程序调用

众所周知,我们可以在C/C++中使用system()函数来执行CMD指令

でもね,system()是阻塞函数,顾名思义,在CMD指令执行完毕之前,程序流都会阻塞在system()

有时候,这并不是我们想要的效果。(比如在执行耗时指令时)

正片

此时,就需要非阻塞函数来开启CMD进程

比如:ShellExecute() 注意事项

1
ShellExecute(NULL, "open", "cmd", NULL, NULL, SW_SHOW);

但是,我惊奇地发现,用ShellExecute()开启的CMD与手动开启的CMD有些许不同

比如:有些环境变量在后者正常使用,却在前者无法被识别

提示:XXX不是内部或外部命令,也不是可运行的程序或批处理文件

百思

なんだろうね

どうしてんだよ

なぜだだだだだだだだだだだ

(。´・ω・)?

为啥呀,明明启动的是同一个exe文件

难道是工作目录不同?不对,我已经设置了对应的工作目录,而且环境变量无关工作目录

难道是…

我还发现一个细节:不是所有的环境变量都不能使用,而是某些…

欸,某些!

我遂进入环境变量设置入口查看

环境变量

原来环境变量分为两种:用户变量系统变量

用户变量只能被特定用户识别,而系统变量可以为所有用户使用

而且,那些不能被ShellExecute()启动的CMD识别的环境变量就在用户变量的PATH中

其解

破案了

虽然不知道为什么,但

ShellExecute()启动的CMD貌似不能识别用户变量

遂,将之设为系统变量,重启,solve!

!!!记得一定要重启哈 <-解决99%问题


关于通过ShellExecute()启动CMD的环境变量问题
https://mrbeancpp.github.io/2021/08/21/关于通过ShellExecute-启动CMD的环境变量问题/
作者
MrBeanC
发布于
2021年8月21日
许可协议