C++程序使用WinExec、CreateProcess、ShellExecute和ShellExecuteEx来启动程序(附源码)

本文介绍了在Windows环境下使用WinExec、CreateProcess、ShellExecute和ShellExecuteEx四种API函数启动程序的方法,包括参数解析、功能区别和示例代码,特别提到了Unicode支持和权限提升。

目录

1、使用WinExec启动

2、使用CreateProcess启动

3、使用ShellExecute启动

4、使用ShellExecuteEx启动


       有时,我们需要在主程序中启动另一个exe程序(创建一个进程),可以有多种实现方法,可以调用WinExec、CreateProcess、ShellExecute和ShellExecuteEx多个API函数来实现,今天我们就来简单地介绍这方面的内容。

1、使用WinExec启动

        可以调用API函数WinExec启动一个程序(进程)。WinExec API函数的声明如下:

WINBASEAPI
UINT
WINAPI
WinExec(
    __in LPCSTR lpCmdLine,
    __in UINT uCmdShow
    );

该函数有两个参数:

1)LPCSTR lpCmdLine:一般传入的是要启动的exe程序名称与要传递给exe程序命令行参数的构成式,中间用空格隔开,即“exe名称+空格+命令行参数”。
2)UINT uCmdShow:使用ShowWindow API函数的参数,一般使用SW_SHOW和SW_HIDE,即显示窗口和掩藏窗口。

       我们可以调用WinExec将cmd.exe窗口起来并执行指定

<think>好的,我现在需要回答用户的问题:如何在C++中通过调用cmd来启动一个exe程序,并提供示例代码。用户已经给出了一些参考资料,我需要先仔细阅读这些引用内容,然后整理出正确的方法。 首先,用户提供的引用[1]提到C++本身不提供CMD命令,但可以通过系统调用来执行。引用[2]、[3][4]则分别提到了使用WinExecCreateProcessShellExecuteShellExecuteEx这些API函数来启动程序,以及如何在CMD中调用生成的exe程序。 接下来,我需要确定每种方法的具体实现步骤示例代码。根据引用[2][3],主要的API有WinExecCreateProcessShellExecuteShellExecuteEx。此外,引用[4]展示了如何在C++程序中处理命令行参数,这可能与通过CMD传递参数有关。 首先,WinExec是最简单的方法,但可能已过时。例如,WinExec("notepad.exe", SW_SHOW); 这样的代码可以启动记事本。但需要注意路径问题,如果exe不在系统路径中,可能需要完整路径。 其次,CreateProcess函数更灵活,可以更详细地控制进程的创建。需要填充STARTUPINFOPROCESS_INFORMATION结构,并处理命令行参数。例如,使用CreateProcess启动指定路径的exe,并传递参数。 然后,ShellExecute函数适合启动与文件关联的程序,比如用默认应用打开文件,但也可以用来启动exe。例如,ShellExecute(NULL, "open", "explorer.exe", "/select, \"C:\\file.txt\"", NULL, SW_SHOW);。这里可以调整参数来启动特定的exe。 此外,用户提到通过cmd调用,可能需要使用system函数,例如system("start notepad.exe");。但这种方法可能依赖于环境变量,且安全性较低。 现在需要整理这些方法的示例代码,并指出它们的优缺点。例如,WinExec简单但可能不够灵活;CreateProcess功能强大但复杂;ShellExecute适合打开文件或执行关联操作;system函数简单但有限。 还要注意,用户可能需要处理带有空格的路径,这时候需要用引号包裹路径,或者在代码中转义引号。例如,在CreateProcess中,命令行参数需要正确格式化。 最后,根据引用[4]中的代码示例,处理命令行参数时,可能需要将参数转换为适当的类型,如使用atof函数转换字符串为数值类型。 总结,回答应包括四种方法:WinExecCreateProcessShellExecutesystem函数,每种方法的示例代码简要说明,以及注意事项如路径处理参数传递。需要确保代码正确,符合C++语法,并引用提供的资料。</think>在C++中调用CMD启动EXE程序,可以通过系统API或标准库函数实现。以下是四种常用方法及示例代码: --- ### 1. 使用`WinExec`函数 **特点**:简单易用,但功能有限(适合快速调用) ```cpp #include <windows.h> int main() { // 启动记事本(需注意路径问题) WinExec("notepad.exe", SW_SHOW); // 启动指定路径的程序(路径含空格需用双引号包裹) WinExec("\"C:\\Program Files\\MyApp\\app.exe\"", SW_SHOW); return 0; } ``` **注意**:若路径含空格,需用`\"`转义双引号[^3]。 --- ### 2. 使用`CreateProcess`函数 **特点**:灵活控制进程属性(如输入输出流、环境变量) ```cpp #include <windows.h> #include <tchar.h> int main() { STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; TCHAR cmdLine[] = _T("\"D:\\MyApp.exe\" arg1 arg2"); if (CreateProcess( NULL, // 可执行文件路径已在命令行中指定 cmdLine, // 完整命令行(包含参数) NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi )) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } return 0; } ``` **关键点**:命令行参数需整合到`cmdLine`中,路径含空格必须用双引号包裹。 --- ### 3. 使用`ShellExecute`函数 **特点**:支持文件关联操作(如用默认程序打开文件) ```cpp #include <windows.h> #include <shellapi.h> int main() { // 直接启动程序 ShellExecute(NULL, _T("open"), _T("calc.exe"), NULL, NULL, SW_SHOW); // 启动资源管理器并选中文件 ShellExecute(NULL, _T("open"), _T("explorer.exe"), _T("/select,\"C:\\test.txt\""), NULL, SW_SHOWNORMAL); return 0; } ``` **优势**:自动处理文件关联,适合打开文档或URL[^2]。 --- ### 4. 使用`system`函数 **特点**:依赖CMD环境,适合简单命令 ```cpp #include <cstdlib> int main() { // 通过CMD执行命令(需注意路径中的反斜杠转义) system("start \"\" \"D:\\Program Files\\MyApp\\app.exe\" arg1"); return 0; } ``` **注意**:`start ""`用于避免CMD窗口标题被误解析为参数,路径含空格需用双引号包裹[^4]。 --- ### 对比与选择建议 | 方法 | 复杂度 | 控制粒度 | 适用场景 | |---------------|--------|--------------|------------------------| | `WinExec` | 低 | 低(仅启动) | 快速调用无参数程序 | | `CreateProcess`| 高 | 高(全控制) | 需要精细控制进程属性 | | `ShellExecute`| 中 | 中(关联操作)| 打开文件/URL或默认程序 | | `system` | 低 | 低(依赖CMD)| 简单命令或快速测试 | --- ### 路径处理注意事项 - **含空格路径**:必须用双引号包裹,例如`"C:\\Program Files\\app.exe"` - **转义字符**:在C++字符串中需使用`\\`表示单个反斜杠 - **环境变量**:可使用`%PATH%`,如`system("start %ProgramFiles%\\MyApp\\app.exe")` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dvlinker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值