说明
- system、ShellExecuteEx和CreateProcess都是用于在Windows操作系统上执行外部程序的函数
- system是C标准库函数,可以执行简单的命令行命令,但其缺点是无法获得外部程序的详细信息和返回值
- ShellExecuteEx函数可以执行任意类型的文件,并且可以指定外部程序的工作目录和参数。但需要依赖Windows Shell,有时会因为文件关联或路径问题而无法执行
- CreateProcess函数是Windows API提供的一个创建新进程的函数。可以创建进程并指定进程的可执行文件路径、工作目录、命令行参数、环境变量等信息。相对于其他两个函数来说更加灵活,可以控制进程的各种属性,而且不依赖Windows Shell,因此在某些情况下更加可靠
- 推荐使用CreateProcess函数,因为更加灵活、可靠,并且可以获得进程的详细信息和返回值
方式一:使用 system() 函数
#include <stdlib.h>
int main()
{
system("notepad.exe");
return 0;
}
- system函数是标准库函数,允许在Windows平台上启动任何可执行文件
- 需要注意它可以启动任何可执行文件,包括恶意软件
方式二:使用 ShellExecute() 函数
#include <windows.h>
#include <shellapi.h>
int main()
{
SHELLEXECUTEINFO sei = { 0 };
sei.cbSize = sizeof(sei);
sei.lpVerb = L"open";
sei.lpFile = L"notepad.exe";
sei.nShow = SW_SHOWDEFAULT;
ShellExecuteEx(&sei);
return 0;
}
- ShellExecute可以启动指定的应用程序,并且支持检查安全性问题
- ShellExecute 和 ShellExecuteEx 函数都是Windows API中的函数,主要用于启动外部程序,打开文件,链接,甚至可以用来打开网页等
- ShellExecute 在调用程序中启动指定文件的函数,会调用与文件关联的默认程序,并且不会等待程序执行完成
- ShellExecuteEx 是更加强大的版本,可以等待程序执行完成,且提供了更多的参数和选项。可以用于打开一个外部程序、打开一个文档文件或网址、打印文档、以及执行其他Windows Shell中的操作
- 推荐使用 ShellExecuteEx 函数,因为它提供了更多的参数和选项,并且可以控制程序的执行状态,同时还可以提供错误信息和进程信息。在一些需要控制程序执行状态或者需要处理进程信息的场合,ShellExecuteEx 函数会更加方便和可靠
方式三:使用 CreateProcess() 函数
C++创建子进程
PROCESS_INFORMATION m_Process;
SecureZeroMemory(&m_Process, sizeof(m_Process));
STARTUPINFO si;
SecureZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
BOOL bSuccess = CreateProcess(strExePath.c_str(),
szParams,
NULL,
NULL,
FALSE,
(nGCUDebugEn > 0) ? NORMAL_PRIORITY_CLASS : CREATE_NO_WINDOW,
NULL,
NULL,
&si,
&m_Process);
//if(nullptr != m_Process.hProcess)
// {
// CloseHandle(m_Process.hProcess);
//}
// if(nullptr != m_Process.hThread)
// {
// CloseHandle(m_Process.hThread);
// }
- CreateProcess函数是Windows API中用于启动其他程序的函数
- CreateProcess函数可以用于启动任何可执行文件,包括自己编写的可执行程序。与ShellExecuteEx不同,CreateProcess可以与新进程进行交互,例如向其传递命令行参数或者读取其输出
- ShellExecuteEx比CreateProcess更通用,因为它可以打开任何已经注册的文件类型,并且它还可以自动检测文件类型并使用适当的程序来打开它。而CreateProcess函数则更加专业化,它只能用于启动可执行文件