2008-11-05 85 views
2

我有一个问题关于我滥用CreateProcess的症状。我正在使用lpcommandline参数将路径提供给我的可执行文件和参数。我的误用是我没有用引号括起exe文件的路径。路径和CreateProcess

我的问题是,为什么CreateProcess在大多数计算机上工作得很好而不是其他人?我知道这条道路在大多数时间里都有空间,但是它在90%的XP机器上工作。我当然在那10%的地方发现了我的问题。但是我想知道哪些机器不起作用会有什么不同?有没有一个设置或政策,你们任何人都知道。是的,我要解决报价问题。只是好奇为什么这样的事情不会失败。

所以代码如下所示,szCommandLine参数如下所示。注意到exe文件的路径没有引号。

“C:\ Program Files文件\我的公司\ doit.exe参数1参数”

CreateProcess(
    NULL,   
    szCommandLine, 
    NULL,   
    NULL,   
    FALSE,   
    NULL, 
    NULL, 
    NULL,   
    &si,    
    &pi)  

回答

3

你应该阅读此页:如果应用程序名称为空
http://msdn.microsoft.com/en-us/library/ms682425.aspx

  • (第一参数)。
  • 它使用命令行中第一个空格分隔的字(第二个参数)作为应用程序名称。
  • 如果应用程序名称包含空格,则必须引用该空格。

同样的代码是值得一万个字:
它看起来是这样的:

char commandline[] = "C:\Program Files\My Company\doit.exe parameter1 parameter2"; 
CreateProcess(NULL,commandline, ....); 

或者,您somwhere生成的路径名?
记住一般问题只会给你通用的答案。
您必须先确定具体的答案,然后才能确定为什么只有太多的猜测。

+1

是的,我读过。这就是我知道我搞砸了报价。这个问题涉及为什么即使没有许多机器上的报价而不是其他机器上的报价。我已经解决了这个问题,我只是想知道是什么导致了这种奇怪的行为。 – DanG 2008-11-05 18:07:28

0

诊断类似问题的一个好方法是内置到您的应用程序错误和报告机制中。这有助于实现这么多目的 - 主要针对您可能永远不会看到自己的错误以及哪些用户可能会忽略并不向您报告。通过这种方式,您可以诊断命令被调用并发生故障时的参数。

此外,您可以尝试进一步探索MSDN网站和与此方法关联的高级功能。你留下他们大部分为NULL。通过探索这些扩展功能,您将学习并可能找出自己为什么会有这种差异。

另一个通用的答案,但我希望这可以帮助你评估你的特定情况。

5

正如文档Martin York所暗示的那样,CreateProcess()对于使用前长名称程序的back-compat有一些行为。

“C:\ Program Files文件\子目录\程序名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默认只读取最终文件夹的读取权限。)

2

我刚刚在同一个问题上挣扎了很长时间。因此,即使这个问题很久以前就提出了,但为了记录,这里是我的情况:

如果命令行未被引用且包含空格,CreateProcess将尝试将不明确性解决为在Simon的回答中有所描述。 如果任何达到空格字符的测试部件也解析为扩展名为.exe或.exe的现有文件,则将使用此文件而不是预期的完整路径。

例子:

char cmdline[] = "C:\Program Files\App One\bin\app.exe param1 param2"; 
CreateProcess(NULL, cmdline, ...); 

不幸的竟是所谓的 “C:\ Program Files文件\应用程序” 的现有文件(没有扩展名)在我的情况。 CreateProcess找到了这个文件,认为它是一个没有扩展名为.exe的可执行文件,并试图执行它。结果:错误193“%1不是有效的Win32应用程序”。底线:使用引号或甚至更好,第一个参数为CreateProcess,或者去寻找可能与违规路径的一部分相匹配的任何其他文件。