【问题标题】:How do I open an .exe from another C++ .exe?如何从另一个 C++ .exe 打开 .exe?
【发布时间】:2013-03-04 09:06:17
【问题描述】:

我想做的是从另一个 .exe 打开一个 .exe。我真的不知道该怎么做,所以我搜索了互联网。我尝试了一些网上推荐的方法,但没有奏效。

这是我的代码:

#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
    system ("OpenFile.exe");
    system ("pause");
    return 0;
}

当我在 DEV C++ 中运行它时,它会编译,但我得到一个错误。有人可以帮帮我吗?

【问题讨论】:

  • 错误是什么?无论如何,凭直觉,man system - 试试#include &lt;stdlib.h&gt;
  • 你可以试试fopen()。它会打开你的 .exe。
  • RageD,感谢它编译,但程序仍然没有打开 openfile.exe
  • @KerrekSB 我很确定 OP 正在尝试 执行 文件,而不是实际读取其内容。在这种情况下,system 将是正确的选择。我很确定@RageD 给出了正确的答案,缺少#inlcude &lt;stdlib.h&gt;
  • @S.Y 你确定文件在正确的位置吗?也就是说,与您的程序的可执行文件位于同一位置?尝试在 Dev-C++ 之外运行,它可能会对你的执行路径做一些晦涩的事情。

标签: c++ windows exe


【解决方案1】:

您应该始终避免使用system(),因为

  • 资源繁重
  • 它破坏了安全性——你不知道这是一个有效的命令,或者在每个系统上做同样的事情,你甚至可以启动你不打算启动的程序。 危险在于,当您直接执行程序时,它会获得与您的程序相同的权限——这意味着,例如,如果您以系统管理员身份运行,那么您刚刚无意中执行的恶意程序也会以系统管理员身份运行行政人员。如果这不会吓到您,请检查您的脉搏。
  • 反病毒程序讨厌它,您的程序可能会被标记为病毒。

你应该使用CreateProcess()

您可以使用 Createprocess() 来启动一个 .exe 并为其创建一个新进程。 该应用程序将独立于调用应用程序运行。

这是我在一个项目中使用的示例:

#include <windows.h>

VOID startup(LPCTSTR lpApplicationName)
{
   // additional information
   STARTUPINFO si;     
   PROCESS_INFORMATION pi;

   // set the size of the structures
   ZeroMemory( &si, sizeof(si) );
   si.cb = sizeof(si);
   ZeroMemory( &pi, sizeof(pi) );

  // start the program up
  CreateProcess( lpApplicationName,   // the path
    argv[1],        // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    0,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi             // Pointer to PROCESS_INFORMATION structure (removed extra parentheses)
    );
    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

编辑:您遇到的错误是因为您需要指定 .exe 文件的路径,而不仅仅是名称。 Openfile.exe 可能不存在。

【讨论】:

  • msdn.microsoft.com/en-us/library/windows/desktop/… 中有一个很好的例子(在这个答案的链接末尾,但很容易错过)。还有一个小提示,如果有人使用 lpApplicationName 和包含空格的 exe 路径,它应该" 包围,只有当 exe 和命令行都在 argv[1 ].
  • 我认为你必须将函数从 void 更改为 bool,并根据 CreateProcess() 的成功返回 true/false
  • CreateProcess 是否将程序作为后台进程启动(可能在完成执行后保持打开状态)?
  • 我不明白你为什么把 argv[1] 作为 CreateProcess 的第二个参数。
  • 这里也一样。这很令人困惑。 @iBug 你能澄清一下 char argv[1] 实际上是什么吗?我假设命令行参数?
【解决方案2】:

我在这方面取得了巨大的成功:

#include <iostream>
#include <windows.h>

int main() {
    ShellExecute(NULL, "open", "path\\to\\file.exe", NULL, NULL, SW_SHOWDEFAULT);
}

如果你有兴趣,完整的文档在这里:

http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx.

【讨论】:

  • CreateProcess() 优于 ShellExecute()
  • @Michael 那是个人意见 - 验证是什么?我认为情况正好相反,原因有很多: 1. ShellExecute 是一种操作系统功能,可以得到适当的保护。 2. ShellExecute 肯定更简单,随着时间的推移可能不会发生太大变化。 CreateProcess - 您应该使用 CreateProcessEx 来“正确”。 3. CreateProcess 的使用有很多歧义,对于新用户来说安全和标志设置是不明显的。我实际上不确定 CreateProcess 有什么具体好处?请解释你的理由。
  • CreateProcess 也是一个操作系统函数。见docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/…。如果您查看软件项目,我想您会发现 CreateProcess 用于我猜想的更专业的项目,因为您可以控制:LPSECURITY_ATTRIBUTES lpProcessAttributes、LPSECURITY_ATTRIBUTES lpThreadAttributes,以及 bInheritHandles、dwCreationFlags、lpEnvironment、lpCurrentDirectory、lpStartupInfo 和 lpProcessInformation
  • @DavidLannan,刚刚有机会了解为什么 CreateProcess 优于 ShellExecuteEx,并希望与您分享。如果您希望运行 CMD 命令并等待命令完成,最好的方法是使用 CreateProcess(),然后使用以下代码行检查执行是否完成: WaitForSingleObject(ShExecInfo.hProcess, INFINITE); DWORD 退出代码 = 0; if (GetExitCodeProcess(ShExecInfo.hProcess, &exitCode) && exitCode != STILL_ACTIVE) { }
【解决方案3】:

试试这个:

#include <windows.h>

int main ()

{
    system ("start notepad.exe") // As an example. Change [notepad] to any executable file //

    return 0 ;
}

【讨论】:

  • 能否请您 edit 解释为什么这段代码回答了这个问题?纯代码答案是 discouraged,因为它们不教授解决方案。
  • 你在这里所做的和 S.Y 所做的有什么区别?
  • 这是更好的解决方案 imo
  • 如果路径中有空格,system 的语法可能会有点混乱。我花了一段时间来制作这个system("cmd /C \"\"C:\\Program Files (x86)\\My Cool App\\My Cool App.exe\"\"");。我基于这个答案stackoverflow.com/questions/9964865/…
【解决方案4】:

您收到此错误是因为您没有提供完整路径。 (C:\用户...\file.exe) 如果您想删除此错误,请提供完整路径或将该应用程序(您要打开)复制到您的项目(.exe)所在/保存的文件夹中。

#include <windows.h>
using namespace std;
int main()
{
  system ("start C:\\Users\\Folder\\chrome.exe https://www.stackoverflow.com"); //for opening stackoverflow through google chrome , if chorme.exe is in that folder..
  return 0;
}

【讨论】:

    【解决方案5】:

    当可执行路径在系统中有空格时,调用

    #include<iostream>
    using namespace std;
    int main()
    {
        system("explorer C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe ");
        system("pause");
    return 0;
    }
    

    【讨论】:

    • 这没有意义 - 你是在问如果有空格你应该怎么做,还是你想解释在这种情况下应该怎么做?
    • 是的,我试着解释一下!这样就可以使用“系统”了,没有函数。
    • 简短直接,不代表不好
    【解决方案6】:

    提供文件openfile.exe的完整路径 切记不要在路径中加上斜线/,例如 c:/users/username/etc.... 而不是那种用途 c:\\Users\\username\etc (适用于窗户)

    也许这会对你有所帮助。

    【讨论】:

      【解决方案7】:

      我知道这有点晚了,但这是为了帮助所有新的 c++ 开发人员。

      基本上我发现如果你将文件路径设置为该位置然后调用程序你可以绕过错误。

              cout << "Opening Firefox";
              system("cd C:\\Program Files\\Mozilla Firefox");
              Sleep(1000);
              system("start firefox.exe -P");
      

      如您所见,我将文件路径设置为 Firefox 的位置,然后启动它。就我而言,我正在启动 Firefox 的配置文件管理器,如果您只想启动 Firefox,请删除 -P。我还输入了一个 Sleep() 让我的计算机有时间切换文件路径。 如果您想返回默认文件路径,请使用system(cd C:\\Windows\\System32);。我通过在 windows 的命令行中复制命令来做到这一点,尽管如果你正在使用 Linux 特定的命令 + 文件路径,你会使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多