系统与ShellExecute - 有何不同?

11

在C++中,system()shellexecute()主要有哪些区别?

在什么情况下应该使用system()shellexecute()


2
ShellExecute与C++无关。 - ildjarn
系统是标准的,Shellexecute 不是,请使用前者。 - 111111
1
@111111 你为什么这么说?假设你正在编写要在 Windows 上运行的代码,想要在用户默认浏览器中打开一个 URL?那么使用 ShellExecute 肯定是正确的解决方案。 - David Heffernan
2
@111:错误。当编写 Windows 代码且不关心可移植性时,应始终优先选择 ShellExecute。仅在您绝对需要编写可在多个平台上工作的可移植代码时才使用 system。即使如此,我仍建议使用 #ifdef 而非 system - Cody Gray
1个回答

9
在标准C++中不存在shellexecute,因此它们没有区别。但是Win32函数ShellExecute存在,但它不像system一样是一个C++标准函数。 ShellExecutesystem的功能不同。system(或多或少)相当于在命令行上输入命令。而ShellExecute相当于双击文件(或右键单击并从列表中选择“动词”)。
它们完全没有任何共同点。

我认为,如果您调用 system 控制,程序将在执行完成之前不会返回,而 ShellExecute 则不等待完成。 - Jesse Good
4
ShellExecute 是一个非常强大的函数,它可以做很多事情。它的关键在于能够通过参数指定“动作”,告诉函数要执行什么操作。因此,把它归纳为一种特定的行为有些不准确,因为它可以被指示以各种方式运行。当然,这是它强大和实用的关键所在。编写Win32代码时,应始终优先考虑使用 ShellExecute 而不是 system - Cody Gray
@CodyGray:但它们并不是做同样的事情。system会在路径中搜索可执行文件。如果您要运行一个可执行文件,ShellExecute必须被“告知”可执行文件的位置。虽然ShellExecute可以运行可执行文件,但比起直接使用system来运行它们,这种方式就不太方便了。 - Nicol Bolas
1
我不确定我理解你的意思。你可以简单地执行 ShellExecute(NULL, "open", "notepad.exe", NULL, NULL, SW_SHOWNORMAL); 来启动记事本。我想不起来有什么需要你指定完全限定路径到某个在你路径上的东西。 - Cody Gray
1
@CodyGray:我在文档中没有看到任何关于它会搜索当前搜索路径以查找可执行文件的内容。 我从未使用过该功能,因此我只能按照MSDN上所说的行事。 - Nicol Bolas
5
@NicolBolas说:ShellExecute甚至不需要告诉它可执行文件是什么,更别提它在哪里了。比如,ShellExecute(NULL, "open", "http://stackoverflow.com/", NULL, NULL, SW_SHOWNORMAL);将会打开默认浏览器。请参阅KD837633以获取一些背景信息。 - MSalters

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