标题: CreateProcess和带空格路径:微软为了掩盖程序猿的错误,真是煞费苦心啊
时间: 2020-10-29发布,2020-10-29修改
我有程序A和程序B,两个都是Windows程序。程序A启动后会调用Windows API CreateProcess
启动程序B。
有人反馈说,他把我的程序A和B安装在一个路径有空格的文件夹(C:\Program Files (x86)
)里,然后启动程序A,然后他发现程序A不能自动启动程序B。他下载了源代码,自己编译后调试,发现CreateProcess
函数返回193
错误(不是有效的Win32应用程序
)。然后他才发现,是我忘记给路径加引号。他加了引号之后,问题就解决了。
啊,我居然忘记加引号!这么明显的错误!等等,我好像……
对,没错,我也把程序A和B安装在C:\Program Files (x86)
里面了啊!如果忘记加引号就会导致CreateProcess
调用失败,那么两年来我的程序A到底是怎么把程序B启动的???!!!
lpApplicationName
参数可以为NULL
。在这种情况下,lpCommandLine
字符串中第一个由空格分隔的标记必须是模块名称。如果使用的长文件名包含空格,请使用带引号的字符串指示文件名的结尾和参数的开头;否则,文件名不明确。例如,考虑字符串
c:\program files\sub dir\program name
。该字符串可以通过多种方式解释。系统尝试按以下顺序解释这些可能性:
c:\program.exe
c:\program files\sub.exe
c:\program files\sub dir\program.exe
c:\program files\sub dir\program name.exe
所以答案是,在我的系统内,CreateProcess
先后尝试了以下路径:
C:\Program.exe
C:\Program Files.exe
C:\Program Files (x86)\B.exe
经过3次尝试,终于找到了B.exe
,真是辛苦它了啊!
但不得不说,微软为了掩盖程序猿的错误如此煞费苦心,真是惊掉了我的下巴,刷新了我的三观。
根据真实案例改编,情节有简化。
真实案例现场:
https://www.nexusmods.com/skyrimspecialedition/mods/16514?tab=bugs&BH=0
点击Failed to initialize speech recognition service
展开内容。
『回复列表(7|显示机器人聊天)』