C++ WinExec 已被废弃,现在改为使用createProcess
【摘要】 WinExec 是一个比较老的函数,用于在 Windows 系统中执行一个程序。然而,由于其不支持等待进程结束和获取进程输出等高级功能,现代开发中更推荐使用 CreateProcess 函数。下面是如何将 WinExec("taskkill.exe /f /im fastlionscm.exe", SW_HIDE); 转换为使用 CreateProcess 的示例:#include <win...
WinExec
是一个比较老的函数,用于在 Windows 系统中执行一个程序。然而,由于其不支持等待进程结束和获取进程输出等高级功能,现代开发中更推荐使用 CreateProcess
函数。
下面是如何将 WinExec("taskkill.exe /f /im fastlionscm.exe", SW_HIDE);
转换为使用 CreateProcess
的示例:
#include <windows.h>
#include <iostream>
#include <string>
int main() {
// 命令行字符串
std::string commandLine = "taskkill.exe /f /im fastlionscm.exe";
std::wstring wCommandLine = std::wstring(commandLine.begin(), commandLine.end());
// 创建一个STARTUPINFO结构并清零
STARTUPINFOW si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE; // 隐藏窗口
// 创建一个PROCESS_INFORMATION结构并清零
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
// 创建进程
if (!CreateProcessW(
NULL, // 无模块名(使用命令行)
const_cast<LPWSTR>(wCommandLine.c_str()), // 命令行
NULL, // 进程安全属性
NULL, // 线程安全属性
FALSE, // 句柄继承选项
0, // 创建标志
NULL, // 新环境块
NULL, // 当前目录
&si, // STARTUPINFO指针
&pi) // PROCESS_INFORMATION指针
) {
// 错误处理
std::cerr << "CreateProcess failed (" << GetLastError() << ")." << std::endl;
return 1;
}
// 等待进程结束
WaitForSingleObject(pi.hProcess, INFINITE);
// 关闭进程和线程句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
代码解释:
- 命令行字符串:将命令行字符串从
std::string
转换为std::wstring
,因为CreateProcessW
需要宽字符版本的字符串。 - STARTUPINFOW:用于指定进程的主窗口如何显示,这里设置为隐藏窗口 (
SW_HIDE
)。 - PROCESS_INFORMATION:用于接收关于新进程的信息。
- CreateProcessW:创建新进程。
- 第一个参数是模块名,这里传入
NULL
表示使用命令行。 - 第二个参数是命令行字符串。
- 后续参数用于设置进程和线程的安全属性、继承选项、创建标志、环境块、当前目录等。
- 第一个参数是模块名,这里传入
- WaitForSingleObject:等待进程结束。
- CloseHandle:关闭进程和线程句柄。
注意事项:
CreateProcessW
是宽字符版本的CreateProcess
,适用于 Unicode 字符串。如果你不需要 Unicode 支持,可以使用CreateProcessA
并传入 ANSI 字符串。- 调用
CreateProcess
后,应该始终检查返回值,并处理可能的错误。 - 使用
WaitForSingleObject
等待进程结束是一个阻塞操作,如果你不希望阻塞,可以调整等待时间或采用其他机制。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)