如何从另一个C++ .exe文件中打开一个.exe文件?

54
我想要做的是从一个.exe文件中打开另一个.exe文件。我真的不知道如何做到这一点,所以我在网上搜索了一下。我尝试了一些来自互联网的建议方法,但它们并没有起作用。
这是我的代码:
#include <iostream>
#include <windows.h>
using namespace std;

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

我在DEV C++中运行它时编译通过,但出现了错误。有人能帮我吗?


3
错误在哪里?无论如何,凭直觉,尝试使用“man system”命令(http://linux.die.net/man/3/system)- 请尝试包含“<stdlib.h>”。 - RageD
12
你可以尝试使用fopen()来打开你的.exe文件。 - Kerrek SB
1
@KerrekSB 我相信原帖的意思是要执行文件,而不是实际读取其内容。在这种情况下,system 是正确的方法。我很确定 @RageD 给出了正确的答案,只是漏掉了 #include <stdlib.h> - JSQuareD
@JSQuareD 在控制台顶部告诉我它是哪个 exe,无论如何,在程序要求输入之前,我有一些文本出现。 - S.Y
@S.Y 你应该接受对你有用的答案,我认为Jona的回复在你的情况下可以解决问题。 - SAAD
显示剩余4条评论
7个回答

98

您应该避免使用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可能不存在。


4
我认为你需要将函数从void改为bool,并根据CreateProcess()的成功与否返回true/false。 - Michael Haephrati
CreateProcess函数是否将程序作为后台进程启动(在执行完成后可能保持其打开状态)? - user8951490
1
我不确定我理解为什么你把argv [1]作为CreateProcess的第二个参数。 - aj.toulan
3
同感。这很令人困惑。@iBug,你能澄清一下char argv [1]实际上是什么吗?我假设是命令行参数? - Digital Human
你最好展示如何调用这个函数,因为我现在对LPCTSTR和字符串参数感到困惑。 - Azzurro94
显示剩余3条评论

26

CreateProcess()比ShellExecute()更好。 - Michael Haephrati
2
@Michael 这是个人观点 - 有什么验证吗?我认为相反的情况是正确的,原因如下:
  1. ShellExecute 是一个操作系统函数,可以得到适当的保护。
  2. ShellExecute 显然更简单,并且在未来可能不会发生太大变化。CreateProcess - 你应该使用 CreateProcessEx 来做到“正确”。
  3. 对于 CreateProcess 的使用存在许多歧义,对于新用户来说,安全和标志设置并不明显。实际上我不确定 CreateProcess 具体有什么好处?请解释一下你的理由。
- David Lannan
1
CreateProcess也是一个操作系统函数。请参阅https://learn.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createprocessa。如果您审查软件项目,我认为您会发现CreateProcess在更专业的项目中使用,因为它可以控制: LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, 以及bInheritHandles,dwCreationFlags,lpEnvironment,lpCurrentDirectory,lpStartupInfo和lpProcessInformation。 - Michael Haephrati
1
@DavidLannan,我刚刚有机会意识到为什么CreateProcess比ShellExecuteEx先进,并想与您分享。如果您希望运行CMD命令并等待命令完成,最好的方法是使用CreateProcess(),然后使用以下代码检查执行的完成情况: WaitForSingleObject(ShExecInfo.hProcess, INFINITE); DWORD exitCode = 0; if (GetExitCodeProcess(ShExecInfo.hProcess, &exitCode) && exitCode != STILL_ACTIVE) { } - Michael Haephrati

7

试试这个:

#include <windows.h>

int main ()

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

    return 0 ;
}

5
请您编辑一下,解释一下为什么这段代码可以回答问题。鼓励提供含有解释的答案,因为单纯的代码无法传授解决方案。(参考链接:http://meta.stackexchange.com/q/148272/274165) - Nathan Tuggy
你在这里做的和S.Y做的有什么区别? - user6054931
在我看来,这是更好的解决方案。 - Charlie
1
如果您的路径中有空格,system的语法可能会让您感到有些困惑。我花了一些时间来编写这个命令,system("cmd /C \"\"C:\\Program Files (x86)\\My Cool App\\My Cool App.exe\"\"");。我基于这个答案 https://dev59.com/sWkw5IYBdhLWcg3wVpFi。 - user875234

1
当系统中的可执行路径包含空格时,请调用:
#include<iostream>
using namespace std;
int main()
{
    system("explorer C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe ");
    system("pause");
return 0;
}

1
这没有意义 - 你是在问如果有空格应该做什么,还是试图解释在那种情况下别人应该做什么? - Mogsdad
是的,我尝试解释!这样,您可以使用“system”,而不需要<windows.h>函数。 - CHE98
简短而直接,不代表质量差。 - Charlie

1
提供openfile.exe文件的完整路径,记得不要在路径中使用正斜杠/,例如c:/users/username/etc....,而是使用c:\\Users\\username\etc(适用于Windows)。这可能会对您有所帮助。

0
您之所以出现此错误,是因为您没有提供完整路径。(C:\Users...\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;
}

0

我知道有点晚了,但这是为了帮助所有新的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,则应使用特定于Linux的命令和文件路径。


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