C++ WinExec 已被废弃,现在改为使用createProcess

举报
福州司马懿 发表于 2024/10/31 16:24:30 2024/10/31
【摘要】 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;
}

代码解释:

  1. 命令行字符串:将命令行字符串从 std::string 转换为 std::wstring,因为 CreateProcessW 需要宽字符版本的字符串。
  2. STARTUPINFOW:用于指定进程的主窗口如何显示,这里设置为隐藏窗口 (SW_HIDE)。
  3. PROCESS_INFORMATION:用于接收关于新进程的信息。
  4. CreateProcessW:创建新进程。
    • 第一个参数是模块名,这里传入 NULL 表示使用命令行。
    • 第二个参数是命令行字符串。
    • 后续参数用于设置进程和线程的安全属性、继承选项、创建标志、环境块、当前目录等。
  5. WaitForSingleObject:等待进程结束。
  6. CloseHandle:关闭进程和线程句柄。

注意事项:

  • CreateProcessW 是宽字符版本的 CreateProcess,适用于 Unicode 字符串。如果你不需要 Unicode 支持,可以使用 CreateProcessA 并传入 ANSI 字符串。
  • 调用 CreateProcess 后,应该始终检查返回值,并处理可能的错误。
  • 使用 WaitForSingleObject 等待进程结束是一个阻塞操作,如果你不希望阻塞,可以调整等待时间或采用其他机制。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。