路径和CreateProcess

时间:2008-11-05 16:14:43

标签: c++ winapi

我对我滥用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 )       

4 个答案:

答案 0 :(得分:5)

正如Martin York链接到暗示的那样,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仅对最终文件夹进行读访问。)

答案 1 :(得分:3)

您应该阅读本页:
http://msdn.microsoft.com/en-us/library/ms682425.aspx

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

再次代码值得一百万字:
它看起来像这样:

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

或者您是否正在生成路径名称? 请记住,通用问题只能为您提供通用答案 在得到特定答案之前,你必须具体说明为什么会有太多的猜测。

答案 2 :(得分:2)

我在相当一段时间内遇到了同样的问题。所以,即使这个问题在很久以前提出过,只是为了记录,这就是我的问题所在:

如果命令行未引用且包含空格,CreateProcess将尝试解决模糊性,如Simon的回答中所述。 如果任何一个空格字符的测试部分也解析为没有扩展名或.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的第一个参数,或者查找可能与违规路径的一部分匹配的任何其他文件。

答案 3 :(得分:0)

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

此外,您可以尝试进一步探索MSDN站点以及与此方法相关的高级功能。你把大部分都留空了。通过探索这些扩展功能,您将学习并可能找出自己可能存在这种差异的原因。

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