关于通过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!