关于我滥用CreateProcess的症状,我有一个问题。我使用lpcommandline参数来提供我的可执行文件的路径和参数。我的误用是我没有用引号将路径引到exe。
我的问题是,为什么CreateProcess在大多数计算机上都能正常工作,而在其他计算机上却不能呢?我知道路径在大多数时间都会有一个空间,但在90%的XP机器上它是有效的。当然,我在那10%的问题上找到了问题所在。但我想知道在它不工作的机器上有什么不同?有没有你们任何人知道的设置或政策。是的,我会解决报价问题。只是好奇为什么这样的事情不会一下子就失败了。
因此,代码应该类似于下面的内容,szCommandLine参数应该类似于下面的内容。请注意,exe的路径两边没有引号。
"C:\Program Files\My Company\doit.exe parameter1 parameter2“
CreateProcess(
NULL,
szCommandLine,
NULL,
NULL,
FALSE,
NULL,
NULL,
NULL,
&si,
&pi ) 发布于 2008-11-21 07:27:44
正如马丁·约克链接到的文档所暗示的那样,CreateProcess()具有一些与前长名称程序的反向比较行为。
"c:\program files\sub dir\program name arg1 arg2“将查找:
"c:\program.exe“files\sub dir\program name arg1 arg2 "c:\program files\sub.exe”dir\program name arg1 arg2 "c:\program files\sub dir\program.exe“name arg1 arg2 "c:\program files\sub dir\program name.exe”arg1 arg2
因此,如果这些文件中的任何一个存在,Windows将调用它们,而不是您的程序。另外,我假设如果您对这些可能的匹配项所在的任何文件夹都没有读取权限,那么CreateProcess()可能会立即失败,而不是检查您是否已经读取了以后可能的匹配项。(默认情况下,Windows只检查最终文件夹的读访问权限。)
发布于 2008-11-05 16:58:33
你应该阅读这个页面:
http://msdn.microsoft.com/en-us/library/ms682425.aspx
如果应用程序名称为NULL (第一个参数),则返回
再说一次,代码值得一百万个单词:
它看起来是这样的:
char commandline[] = "C:\Program Files\My Company\doit.exe parameter1 parameter2";
CreateProcess(NULL,commandline, .... );或者你在什么地方生成路径名?
记住,泛型问题只能得到泛型答案。
在你得到一个明确的答案之前,你必须明确为什么会有太多的猜测。
发布于 2009-12-17 22:31:10
我只是在很长一段时间里都在努力解决同样的问题。因此,即使这个问题很久以前就提出了,只是为了记录,这里是我的问题所在:
如果命令行没有用引号引起来并且包含空格,CreateProcess将尝试按照西蒙的回答中所描述的那样解决歧义。如果直到空格字符的任何测试部分也解析为没有扩展名或.exe扩展名的现有文件,则将使用此文件,而不是预期的完整路径。
示例:
char cmdline[] = "C:\Program Files\App One\bin\app.exe param1 param2";
CreateProcess(NULL, cmdline, ...);不幸的是,在我的例子中,实际上有一个名为"C:\Program Files\App“(没有扩展名)的现有文件。CreateProcess发现了这个文件,假设它是一个没有.exe扩展名的可执行文件,并试图执行它。结果:错误193 "%1不是有效的Win32应用程序“。
底线:使用引号或更好的方法,将第一个参数用于CreateProcess,或者查找可能与部分违规路径匹配的任何其他文件。
https://stackoverflow.com/questions/265650
复制相似问题