0

0

C++如何调用外部EXE程序并等待结束_C++使用CreateProcess或system【执行】

冰火之心

冰火之心

发布时间:2026-02-06 14:59:06

|

333人浏览过

|

来源于php中文网

原创

c++如何调用外部exe程序并等待结束_c++使用createprocess或system【执行】

CreateProcess 启动 EXE 并同步等待退出

这是 Windows 下最可控的方式,能捕获进程句柄、设定启动参数、控制窗口行为,且可准确等待子进程结束。CreateProcess 不经过 shell,避免了空格路径或特殊字符被错误解析的问题。

关键点:

  • CreateProcess 的第一个参数(lpApplicationName)建议设为 nullptr,把完整路径和参数都塞进第二个参数(lpCommandLine),否则路径含空格时极易失败
  • 必须用 WaitForSingleObject(hProcess, INFINITE) 等待,不能只调 CloseHandle
  • 获取退出码要用 GetExitCodeProcess(hProcess, &exitCode),不是直接返回值
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
if (CreateProcess(nullptr, "C:\\tools\\mytool.exe -v --input data.txt", nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi)) {
    WaitForSingleObject(pi.hProcess, INFINITE);
    DWORD exitCode = 0;
    GetExitCodeProcess(pi.hProcess, &exitCode);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

system() 看似简单但隐患多

system() 本质是调用 cmd.exe /c,所有命令都经 shell 解析——这意味着路径空格、重定向符 >、管道 | 都可能被意外触发,且无法获取真实退出码(Windows 下它只返回 cmd.exe 的状态,不是目标程序的)。

仅适合调试或执行极简命令,例如:system("pause")system("notepad.exe")。一旦涉及参数、路径或需判断成败,就该换掉。

立即学习C++免费学习笔记(深入)”;

  • 路径含空格时,system("C:\Program Files\tool.exe") 会失败,必须手动加双引号:`system("\"C:\\Program Files\\tool.exe\"")`
  • 无法设置工作目录、隐藏窗口、继承句柄等
  • 在服务或无桌面会话中可能卡死(cmd.exe 等待交互)

需要传参、设工作目录或隐藏窗口?只能用 CreateProcess

system() 完全不支持这些需求;而 CreateProcess 通过 STARTUPINFOCREATE_NO_WINDOW 等标志可精细控制。

ThinkAny
ThinkAny

一个RAG驱动的AI搜索引擎,由独立开发者idoubi开发

下载
  • 设工作目录:填 lpCurrentDirectory 参数,如 "C:\\data"
  • 隐藏子窗口:在 dwCreationFlags 中加 CREATE_NO_WINDOW(适用于控制台工具不想弹黑窗)
  • 重定向 stdin/stdout:需先用 CreatePipe 创建句柄,再填入 STARTUPINFO.hStdXXX,并设 STARTF_USESTDHANDLES

注意:CREATE_NO_WINDOW 对 GUI 程序无效,对控制台程序才起作用;若目标本身是 GUI,它本来就不会显示控制台窗口。

跨平台?别指望 CreateProcesssystem 直接移植

CreateProcess 是 Windows API,Linux/macOS 下不存在;system() 虽然 POSIX 有定义,但行为差异大:Linux 下它调 /bin/sh -c,同样有 shell 注入风险,且无法可靠获取子进程 PID 或等待精确退出。

如果真要跨平台,得封装一层:

  • Windows 路径用 CreateProcess
  • Linux/macOS 用 fork() + execv() + waitpid()
  • 或者用 C++17 的 std::process(尚未标准化)或第三方库如 boost::process

硬写 #ifdef _WIN32 分支比强行统一接口更实际,尤其当项目只跑 Windows 时。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1263

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

275

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2196

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

34

2026.01.19

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

952

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1137

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

814

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

456

2023.08.02

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

33

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.6万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号