【问题标题】:Running an exe with 2 parameter within MFC application在 MFC 应用程序中运行带有 2 个参数的 exe
【发布时间】:2013-11-26 15:22:12
【问题描述】:

我在 MFC 应用程序中运行带有 2 个参数的 exe。我怎样才能做到这一点。

例如:sox.exe a.wav b.mp3 我需要在 MFC 应用程序中执行

提前致谢。

【问题讨论】:

  • 参见 CreateProcess 函数。

标签: command-line mfc


【解决方案1】:

如果 MFC 应用程序支持 stdlib.h,您也许可以使用 system() 函数:使用您要运行的命令创建一个 C 字符串,即 "sox.exe a.wav b.mp3",并将其用作 system() 的参数函数,像这样:

system("sox.exe a.wav b.mp3");

将一组名为track01.wavtrack02.wav、...、track99.wav 的文件转换为song01.mp3song02.mp3、...

char command[100];
int i;

for (i=1;i<=99;i++)
{
  sprintf (command, "sox.exe track%.2d.wav song%.2d.mp3", i, i);
  system (command);
}

【讨论】:

  • 这是 2013 年 - UNICODE 不再是这种新奇的东西了。 system 将字符串传递给 命令解释器 进行解释。这是容易出错且不必要的。使用CreateProcess - 这就是它的目的。
  • system 在某些情况下仍然是首选,请参阅here
【解决方案2】:

这样做的首选方法是使用ShellExecuteEx

【讨论】:

  • 这是的做事方式。除非绝对必要,否则永远不要使用ShellExecuteExCreateProcess 是正确的工具。
  • @IInspectable 我非常不同意。你不是在表达意见吗?
  • 一方面,ShellExecuteEx 要求您在调用线程上初始化 COM。如果该线程恰好在 MTA 中,则游戏已经结束。它报告错误的方式至少可以说是令人困惑的。如果您在加载程序锁下运行ShellExecuteEx,您将立即陷入死锁。 CreateProcess 不存在这些问题。这些都是事实,而不是意见。
  • 这是我的最后一句话,因为我不想辩论解决方案的优点。虽然提出了一些有趣的观点,但如果我没有在这个问题的上下文中指出,那将是我的疏忽,COM may not even be required to load
  • “可能甚至不需要” 部分是一个有趣的部分,因为它继续得出结论:你永远无法知道它是否是必需的,所以你必须无论如何都要硬着头皮初始化COM。我已经说明了为什么CreateProcess 在各个方面都优越。你还没有想出一个理由,为什么人们应该更喜欢ShellExecuteEx 而不是CreateProcess。这样做,或者有充分的理由接受反对票。
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
相关资源
最近更新 更多