【问题标题】:CreateProcess and ShellExecute differencesCreateProcess 和 ShellExecute 的区别
【发布时间】:2012-05-31 15:02:31
【问题描述】:

两者之间的主要区别是什么?我愿意从我的 (C++) 应用程序中只运行另一个 EXE。继承环境、安全特性等有什么不同吗?

【问题讨论】:

  • MSDN docs 为您提供此信息。这个问题对于SO来说完全太模糊和不具体。有几十个问题同时讨论了这两个问题,而你完全没有表现出自己研究这个问题的努力。 (作为提示:只有一个允许您指定有关环境、继承句柄和其他信息的任何内容。我将留给您的研究能力来确定哪个。)

标签: c++ windows winapi createprocess shell-exec


【解决方案1】:

CreateProcessShellExecute 之间的主要区别如下:CreateProcess 更面向低级别,ShellExec 更面向高级用户,在资源管理器中看到用户。

例如使用CreateProcess 可以使用长度大于MAX_PATH 的命令行。它有 32,768 个字符的限制。您还可以使用CreateProcess 在另一个 Windows 桌面(如登录屏幕)上启动程序(如果您有足够的权限)。

另一个例子。您可以使用ShellExecute 启动控制面板或打开计算机上存在的任何程序来编辑JPG 文件。因此,您可以使用ShellExecute 接近 Windows 资源管理器中的相应操作。

【讨论】:

  • 如果程序的路径超过 MAX_PATH,则 CreateProcess 无法启动进程。它可以将长参数传递给可以启动的程序,但这是不同的。目前基本上没有办法启动一个比 MAX_PATH 更深的程序(除非有一个短的 8.3 等效项)
  • @nikos:可以同时使用lpApplicationNamelpCommandLine 来指定带有参数的程序。 lpCommandLine 的最大长度限制为 32,768 个字符。您可以在the documentation 中读到“如果 lpApplicationName 为 NULL,则 lpCommandLine 的模块名称部分仅限于 MAX_PATH 字符。”。通过同时使用非 NULL lpApplicationNamelpCommandLine,应该能够将长度较大的模块部分指定为 MAX_PATH。我认为应该在路径中使用“\\?\”前缀
  • @nikos:此外,从 Windows 10 版本 1607 开始,MAX_PATH 限制已从常见的 Win32 文件和目录函数中删除(请参阅 the initial announcementthe documentation)。
  • @nikos:在许多实际情况下,可以使用更简单的解决方法来开始将长路径缩短到另一条更短的路径。可以将GetShortPathName 与以"\\?\" 开头的输入路径一起使用,并获得更多短名称,您可以使用它来代替。不一样,我之前写的,但是对减少更多短路径文件很有帮助。
  • 试着开始一个真正深入的程序,然后告诉我你是否成功;)理论与实践相去甚远。更多信息请参见zabkat.com/blog/long-8.3-path-names.htm
【解决方案2】:

主要区别在于灵活性。 ShellExecute 更容易使用,但没有很大的灵活性。 CreateProcess 使用起来很痛苦,但可以让你做任何事情。

例如,使用CreateProcess,您可以指定句柄(管道或文件)以用于子项中的标准输入/输出/错误流。 ShellExecute 不会给你想要的方法。

可能还值得注意的是,虽然ShellExecute 可以用于直接启动可执行文件,但其主要目的是“执行”文档文件——例如,告诉它“执行” “whatever.html”,它会启动您的默认 Web 浏览器并将指定的 HTML 文件加载到其中。您也可以使用CreateProcess 来执行此操作,但要执行此操作,您(通常)首先调用FindExecutable 以查找与相关数据文件关联的程序,然后执行将您的数据文件作为参数传递的程序。

【讨论】:

    【解决方案3】:

    CreateProcess 返回已启动进程的句柄和 id,它是 PROCESS_INFORMATION 结构中的主线程

    【讨论】:

      猜你喜欢
      • 2017-01-03
      • 2015-07-19
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      相关资源
      最近更新 更多