【问题标题】:Confusion over Win32 CreateProcess对 Win32 CreateProcess 的困惑
【发布时间】:2010-07-30 16:47:44
【问题描述】:

我对前 2 个参数、模块和命令行感到困惑。我发现除非我同时填充两者,否则它无法正常工作,而且文档似乎另有说明。

我想调用“testApp.exe param1=123”

我发现唯一可行的方法是:

CreateProcess("testApp.exe","testApp.exe param1=123",...

我认为其中任何一个都应该有效,但到目前为止还没有运气:

CreateProcess("testApp.exe","param1=123",...
CreateProcess(NULL,"testApp.exe param1=123",...

我已经阅读了几次 msdn 文档,所以我错过了什么?

【问题讨论】:

  • 那是您的 exact 代码与确切的命令行吗? (顺便说一句,请注意命令行不能是字符串文字;参数必须是非const 字符串。)
  • The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.
  • 您认为自己安全是因为您没有使用 Unicode 版本吗?这仍然不是一个好主意。 (这是一般性建议,而不是对您问题的回答。)
  • 重点是我不认为你的第一条评论是正确的“不能是字符串文字”,除非你限定它。
  • 好的,好的。我应该说它“不应该是字符串文字”。然而,微软表示 Unicode 版本会改变字符串,但它并没有承诺 ANSI 版本不会。无论如何,如果您将来使用 UNICODE 进行编译,这是一个非常糟糕的主意。

标签: c++ winapi


【解决方案1】:

第一个参数是要运行的可执行文件的名称。第二个参数是命令行。命令行不需要包含可执行文件的名称,但如果它不包含并且您传递类似

"param1 param2"

然后在您的程序中,argv[0] == "param1"argv[1] == "param2"。因此,您通常必须将可执行文件的名称作为第一个值传递以满足程序的要求,而不是 Windows。

如果不传递可执行文件名,则从命令行字符串的第一个值中提取。

【讨论】:

  • 被调用的进程是一个 C# 应用程序,其中包含 not 可执行文件名称的 static int Main(string[] args)。是这个问题吗?
  • @John,命令行始终作为单个字符串传递给进程(正是您作为第二个参数传递给CreateProcess 的字符串),这取决于进程的运行时间解析它。 C# 是否忽略该字符串中的第一个标记是无关紧要的。
【解决方案2】:

我在一篇文章 here 中讨论了让 CreateProcess 运行 exe 的问题。有多种情况可能会出错,包括要求完全限定的路径,以及命令行中缺少 exe 名称。

【讨论】:

    【解决方案3】:

    不要给出可执行文件的名称,而是尝试给出带有可执行文件名称的完整路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多