【问题标题】:C++ Executing external processC++ 执行外部进程
【发布时间】:2012-02-24 23:10:13
【问题描述】:

我正在尝试从 c++ 程序运行可执行文件。我查看并找到了 2 个选项:
system("C:\filepath\file.exe");

ShellExecute(GetDesktopWindow(), "open", "C:\filepath\file.exe", NULL, NULL, SW_SHOWNORMAL);
一切都很美好,只是它不起作用。
对于第一个选项,除了 windows.h 之外,我还必须包含 cstdlib,否则我的代码无法构建。
当我运行程序时,我收到错误:
“file.exe”不被识别为内部或外部命令
我已经为我的项目设置了公共语言运行时支持 (/clr) 选项(并且我还必须为运行时库设置选项多线程调试 DLL (/MDd),否则它不会再次构建)。 即使包含两个库,第二个选项也不会构建。我收到错误:
错误 C3861:“ShellExecute”:找不到标识符

我在 Windows7 上使用 VS2010 - 并且希望它能够在多平台上运行...

我要求太多了吗?
谢谢。

【问题讨论】:

  • 如果你希望它是多平台的,你不能使用 Windows 特定的ShellExecute。您的system 命令是正确的;听起来你给了它一个不正确的路径。
  • 尝试将字符串参数中的反斜杠转义为system()system("C:\\filepath\\file.exe");。您的第一个代码 sn-p 很有可能会按预期工作。
  • 我确实逃脱了\\,我的路径是正确的
  • 嗯,没有。 Hans Passant 在编辑您的问题时避开了您的反斜杠。尝试@FrédéricHamidi 和 Hans 建议的代码,如果路径正确,它将起作用。
  • 当我最初发布时 - 只有两行 TEXT。我的实际路径不在文件路径目录中,并且我的可执行文件未命名为文件。从一开始我的代码中就有双反斜杠......我希望解决方案如此简单。

标签: c++ process


【解决方案1】:

当我运行程序时,我得到了错误: “file.exe”不被识别为内部或外部命令

如果我启动命令行提示符并输入 file.exe 这就是我得到的:

Microsoft Windows [Version 6.1.7100]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\>file.exe
'file.exe' is not recognized as an internal or external command,
operable program or batch file.

C:\>

【讨论】:

    【解决方案2】:

    你需要用双反斜杠替换你的反斜杠,否则编译器会将它们解释为转义序列:

    system("C:\\filepath\\file.exe");
    

    关于ShellExecute,你需要包括Shellapi.h和Windows.h,你不需要设置/clr标志。 ShellExecute 是 Windows API 的一部分,因此无法在其他平台上运行。

    【讨论】:

    • @user1217150 您确定您的文件存在并且在您所说的位置吗?
    • 在包含 Shellapi.h 之后 - 构建变得有趣了。从 INSIDE Shellapi.h 中列出一些错误后,我什至得到以下信息:“致命错误 C1003:错误计数超过 100;停止编译”。我不认为这个程序喜欢我。
    • spencercw:我实际上正在运行另一个 C++ 程序,并且我从 Debug 复制了它的路径。
    • @user1217150 您是否首先包含了 Windows.h?如果您不首先包含 Windows.h,则大多数 Windows 标头根本不起作用。
    • 我已经能够使用系统运行一些东西(ShellExecute 不会构建)。
      我的问题 - 并没有消失 - 是我正在尝试将其作为一部分“单元测试”(使用每个必需且不可能的命令行选项运行该特定程序),如果我用 BOOST_AUTO_TEST_CASE(stuff) 包围我的系统命令,它就不起作用(当我删除 #include 并用 main 替换了 BOOST_AUTO_TEST_CASE。想以这种方式运行测试用例是完全错误的吗?
    【解决方案3】:

    请注意,我在问题中写道:我已设置公共语言运行时支持 (/clr) 选项。我这样做是因为以前的错误提示它。
    删除该选项后,我就可以运行可执行文件。也许非托管代码必须保持非托管......

    【讨论】: