CreateProcess和ShellExecute的区别

12

这两者之间的主要区别是什么?我想从我的(C ++)应用程序中仅运行另一个EXE。在继承环境,安全功能等方面是否存在任何差异?


1
MSDN文档提供了这些信息。这个问题对于SO来说过于模糊和不具体。有很多问题都讨论了这两个方面,而你没有展示出自己进行研究的努力。(提示一下:只有一个允许你指定环境、继承句柄和其他信息。我会留给你自己的研究能力去找出哪一个是它。) - Ken White
3个回答

15

主要区别在于灵活性。 ShellExecute 更易于使用,但灵活性不高。 CreateProcess 使用起来很麻烦,但可以让你做任何事情。

举个例子,使用 CreateProcess,你可以指定处理程序(管道或文件)用于子进程中的标准输入/输出/错误流。 ShellExecute 没有提供这样的功能。

也值得注意的是,尽管 ShellExecute 可以 直接启动可执行文件,但其主要意图是“执行”文档文件-例如,告诉它“执行”“whatever.html”,它会启动您的默认网络浏览器,将指定的 HTML 文件加载到其中。您也可以使用 CreateProcess 来实现此操作,但通常需要先调用 FindExecutable 查找与所需数据文件关联的程序,然后将您的数据文件作为参数传递给该程序来实现。


15
CreateProcessShellExecute之间的主要区别在于: CreateProcess 更加注重底层,而ShellExec更加注重用户界面。例如使用CreateProcess可以使用超过MAX_PATH字符限制的命令行长度,即32768个字符。您还可以使用CreateProcess在另一个Windows桌面上启动程序(如果您具有足够的权限),比如在登录屏幕上。另一个例子是,您可以使用ShellExecute启动控制面板或打开计算机中存在的任何程序进行JPG文件的编辑,因此您使用ShellExecute接近于Windows资源管理器中的相应操作。

只需尝试并启动一个真正深入的程序,然后告诉我你是否成功 ;) 理论远离实践。请参阅此处以获取更多信息:http://zabkat.com/blog/long-8.3-path-names.htm - nikos
@nikos:我不是很理解你的目标或问题。我现在无法在旧操作系统上进行测试。我更改了旧答案的文本,仅指定lpCommandLine的长度,以减少不必要的讨论。如果您需要使用长路径创建进程,则建议您使用RtlCreateUserProcessRtlCreateProcessParameters。您可能还需要使用NtResumeThreadNtWaitForSingleObjectRtlDestroyProcessParametersRtlInitUnicodeString(并且RtlDosPathNameToNtPathName_U也会很有帮助)。 - Oleg
@nikos:你可以很容易地创建一个演示,该演示基于此代码示例这个示例,使用本机API。如果你有问题,可以提出新的问题,我会在我的回答中发布相应的代码示例。 - Oleg
我尝试了你的未记录的东西(运行示例),但仍然不行。我尝试了一个路径长度为307个字符的简单EXE,无论系统LongPathsEnabled设置如何,在调用RtlCreateUserProcess时都会失败。事实上,你的示例甚至不能启动一个简单的进程 :) - nikos
1
我并不是在寻求答案。你之前的断言是错误的,我正在纠正你。你不能启动一个> MAX_PATH的进程,这是毋庸置疑的事实。 - nikos
显示剩余5条评论

3

CreateProcess函数会在PROCESS_INFORMATION结构中返回启动的进程及其主线程的句柄和ID。


ShellExecuteEx 也可以做到。 - 273K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接