关于通过ShellExecute()启动CMD的环境变量问题
本文最后更新于:2021年11月20日 下午
前情提要
CMD(命令提示符)是Windows上的命令解释程序
我们可以快速地在系统菜单中启动CMD,并执行一系列快捷操作
但作为一个程序员,我们可能经常需要在程序中调用CMD来执行指令以辅助执行任务
这就涉及到外部程序调用
众所周知,我们可以在C/C++中使用system()函数来执行CMD指令
でもね,system()是阻塞函数,顾名思义,在CMD指令执行完毕之前,程序流都会阻塞在system()
有时候,这并不是我们想要的效果。(比如在执行耗时指令时)
正片
此时,就需要非阻塞函数来开启CMD进程
1 | |
但是,我惊奇地发现,用ShellExecute()开启的CMD与手动开启的CMD有些许不同
比如:有些环境变量在后者正常使用,却在前者无法被识别
提示:XXX不是内部或外部命令,也不是可运行的程序或批处理文件
百思
なんだろうね
どうしてんだよ
なぜだだだだだだだだだだだ
(。´・ω・)?
为啥呀,明明启动的是同一个exe文件
难道是工作目录不同?不对,我已经设置了对应的工作目录,而且环境变量无关工作目录
难道是…
得
我还发现一个细节:不是所有的环境变量都不能使用,而是某些…
欸,某些!
我遂进入环境变量设置入口查看

原来环境变量分为两种:用户变量与系统变量
用户变量只能被特定用户识别,而系统变量可以为所有用户使用
而且,那些不能被ShellExecute()启动的CMD识别的环境变量就在用户变量的PATH中
其解
破案了
虽然不知道为什么,但
ShellExecute()启动的CMD貌似不能识别用户变量
遂,将之设为系统变量,重启,solve!