使用 CreateProcess 运行批处理文件

2023-12-28

我正在尝试使用 CreateProcess 启动一个新的环境块并在新的环境块中运行批处理文件。我已经阅读了 CreateProcess 的 msdn 示例,并得出了如下所示的代码。

发生了什么,它将打开新的命令提示符,并停在那里。由于某种原因,它不会运行我的 .bat 文件。使用 system("CALL path") 将调用 .bat 文件。

#include <iostream>

#define WINDOWS_LEAN_AND_MEAN
#include <Windows.h>

#include <strsafe.h>

#define BUFSIZE 4096

int main()
{
    //system("CALL C:\\HFSS\\setup_vars.bat");

    //return 0;

    LPWCH chNewEnv;
    LPTSTR lpszCurrentVariable;
    DWORD dwFlags = 0;
    TCHAR szAppName[] = TEXT("C:\\windows\\system32\\cmd.exe");
    TCHAR cmdArgs[] = TEXT("C:\\HFSS\\setup_var.bat");

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    BOOL fSuccess;

    // Copy environment strings into an environment block. 
    chNewEnv = GetEnvironmentStrings();

    lpszCurrentVariable = (LPTSTR)chNewEnv;
    if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("MySetting=A"))))
    {
        printf("String copy failed\n");
        return FALSE;
    }

    lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
    if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("MyVersion=2"))))
    {
        printf("String copy failed\n");
        return FALSE;
    }

    // Terminate the block with a NULL byte. 

    lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
    *lpszCurrentVariable = (TCHAR)0;

    // Create the child process, specifying a new environment block. 

    SecureZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);

#ifdef UNICODE
    dwFlags = CREATE_UNICODE_ENVIRONMENT;
#endif

    fSuccess = CreateProcess(szAppName, cmdArgs, NULL, NULL, TRUE, dwFlags,
        (LPVOID)chNewEnv,   // new environment block
        NULL, &si, &pi);

    if (!fSuccess)
    {
        printf("CreateProcess failed (%d)\n", GetLastError());
        return FALSE;
    }

    std::cout << "In new environment\n";
    WaitForSingleObject(pi.hProcess, INFINITE);

    return TRUE;
}

一些问题:

  1. 您需要通过/C选项cmd.exe为了使其执行.bat 文件。
  2. 第二个参数为CreateProcess必须是可修改的字符串。不是字面意思。
  3. 您需要转义文字中的反斜杠字符。
  4. lpszCurrentVariable指向返回的缓冲区GetEnvironmentStrings。您无法修改该缓冲区。您需要分配一个足够长度的新缓冲区并将环境复制到其中。然后添加您的修改。
  5. 环境块以双空终止。标准字符串函数对于双空终止字符串没有用处。
  6. 使用类似的函数StringCchCopy而不是 C 运行时函数只是令人困惑。不要将 MSDN 示例代码视为风格的典范。
  7. C 字符串是一个可以使用的绑定。但是你使用 C++ 所以使用std::wstring以及其他标准库类和函数。
  8. 你需要定义WINDOWS_LEAN_AND_MEAN导入前Windows.h.
  9. 对于 C++ 来说,int main(void)是不正确的。没有争论main is int main().

以下代码向您展示了如何执行此操作:

#include <cstring>
#include <string>
#include <iostream>

#define WINDOWS_LEAN_AND_MEAN
#include <Windows.h>

std::wstring GetEnvString()
{
    wchar_t* env = GetEnvironmentStrings();
    if (!env)
        abort();
    const wchar_t* var = env;
    size_t totallen = 0;
    size_t len;
    while ((len = wcslen(var)) > 0)
    {
        totallen += len + 1;
        var += len + 1;
    }
    std::wstring result(env, totallen);
    FreeEnvironmentStrings(env);
    return result;
}

int main()
{
    std::wstring env = GetEnvString();
    env += L"myvar=boo";
    env.push_back('\0'); // somewhat awkward way to embed a null-terminator

    STARTUPINFO si = { sizeof(STARTUPINFO) };
    PROCESS_INFORMATION pi;

    wchar_t cmdline[] = L"cmd.exe /C C:\\Desktop\\MyBatFile.bat";

    if (!CreateProcess(NULL, cmdline, NULL, NULL, false, CREATE_UNICODE_ENVIRONMENT,
        (LPVOID)env.c_str(), NULL, &si, &pi))
    {
        std::cout << GetLastError();
        abort();
    }

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CreateProcess 运行批处理文件 的相关文章

  • 检测到 NuGet 包的版本冲突

    我正在开发 ASP Net core 2 1 Web 应用程序项目 我的解决方案中有 1 个项目和 3 个其他库 它是高级架构 数据访问层 DAL 业务层 BL 公共层 CL 所以我需要添加引用来连接一些库和项目 我已经添加了CL参考我的项
  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • 在使用 XP 模式的 Windows 7 上构建 Visual Studio 2010 Silverlight 4 项目时出错

    我在 Windows 7 上的 XP 模式 VM 中安装了 Visual Studio 2010 Beta 2 然后我创建了一个简单的 Silverlight 4 测试版 项目并尝试构建它 我收到以下错误 错误 1 ValidateXaml
  • Spring Security,JUnit:@WithUserDetails 用于在 @Before 中创建的用户

    在使用 Spring MockMVC 的 JUnit 测试中 有两种方法用于验证 Spring Security 用户的身份 WithMockUser使用提供的凭据创建一个虚拟用户 WithUserDetails获取用户名并将其解析为正确的
  • Spark Streaming Kafka 流

    我在尝试使用 Spark Streaming 读取 kafka 时遇到一些问题 我的代码是 val sparkConf new SparkConf setMaster local 2 setAppName KafkaIngestor val
  • 使用python正则表达式来匹配时间

    我正在尝试解析一个 csv 文件 其时间格式为下午 6 30 或上午 7 点或午夜 我已经用谷歌搜索并阅读了 python 文档中的正则表达式文档 但未能成功实现它们 我第一次尝试匹配它们是 re findall r d 1 2 d 1 2
  • 带过滤器的 Web Api $extend IQueryable

    我有一个设置 我获得了一个 WebApi OData 服务 该服务返回 客户 返回客户的代码是 public IHttpActionResult GetCustomers ODataQueryOptions
  • Java 8 流中聚合运行时异常

    假设我有一个抛出运行时异常的方法 我正在使用一个Stream对列表中的项目调用此方法 class ABC public void doStuff MyObject myObj if throw new IllegalStateExcepti
  • 如何在kivy+python中从数据库获取数据并显示在表格中

    list py import kivy kivy require 1 9 0 replace with your current kivy version import sqlite3 as lite from kivy uix scree
  • PHP foreach 更改原始数组值[重复]

    这个问题在这里已经有答案了 我对多维数组非常陌生 这让我很烦恼 我的数组如下 fields array names gt array type gt text class gt name name gt name text before g
  • JavaScript 倒计时和重定向

    我有一个 javascript 脚本 它运行倒计时 然后重定向到另一个链接 由于我现在所有网站都使用静态域运行相同的代码 因此我想知道是否可以编辑脚本以使其根据其周围的 span 标签重定向到不同的链接 我还删除了这段代码 所以如果有人有更
  • 在外部存储器/SD卡上缓存图像的推荐路径

    当我在 Android 文件传输或 Astro 文件管理器中查看 SD 卡根目录时 发现很混乱 因为应用程序到处都存储着文件 作为开发人员 我们通过缓存图像 文件等来遵循最佳实践 以使我们的应用程序更快 并且我们使用Environment
  • 如何仅向测试人员发布新版本的 Chrome 扩展程序

    我有一个有很多用户的 Chrome 扩展程序 我想更新它 我已准备好一切 但我需要测试更新以确保当前用户不会丢失数据 有没有办法只将新版本发布给受信任的测试人员 我创建了一个测试组 我插入受信任的测试人员电子邮件帐户 我已在测试帐户下登录
  • 架构和数据字典有什么区别?

    模式的定义是数据库中数据的逻辑结构 它由用户拥有并与数据库用户同名 模式包含表的名称 它的列类型是什么等 数据字典也仅包含元数据 当然它是在数据库级别而不是用户级别 模式和数据字典之间的确切区别是什么 这些定义来自我的经验 20 多年的程序
  • VBS代码中的With语句,在PowerShell中如何表达

    有没有可以快速将VBS代码转换为PowerShell代码的软件或工具 另外 我想知道的是 以下WithVBS代码中的语句 在PowerShell中如何表达 The With语句很棒 可以缩短代码 我可以在PowerShell中实现类似的功能
  • 错误:未授予权限...react-native-image-picker

    我正在尝试使用客户端应用程序中的内存上传图像 反应本机图像选择器 0 26 4 执行以下示例片段后 我以意想不到的方式得到了响应 ImagePicker showImagePicker options response gt console
  • WPF 应用程序基于角色的访问控制 - 最佳实践

    我需要实施某种RBAC http en wikipedia org wiki Rbac对于我目前正在编写的 WPF 应用程序 自 v2 0 起 ASP NET 就拥有了安全性 成员身份和角色管理基础架构 如所述here http weblo
  • jaxws-api 2.2 未在 Maven 构建中加载

    我已经使用 Apache CXF 工具 wsdl2java 生成了 Java 代码 在我的服务评论中 它说我应该支持 Jaxws API 2 2 但不知道这意味着什么 在我的 Maven POM 中我有这个
  • 如何以编程方式圆角并设置随机背景颜色

    我想圆化视图的角 并根据运行时的内容更改视图的颜色 TextView v new TextView context v setText tagsList get i if i 2 0 v setBackgroundColor Color R
  • 以编程方式在 Swift 中模拟滑动手势

    我正在实现一个用于在 Swift 中滑动的手势识别器 我希望能够模拟卡片的投掷 以编程方式滑动视图 我以为会有一个内置函数来实现这一点 但我发现的只是点击手势而不是滑动手势 这就是我实现滑动手势的方式 let gesture UIPanGe
  • 如何在 VS Code 中自定义多个主题的 textMateRules? [复制]

    这个问题在这里已经有答案了 In VS Code 我想定制一些textMateRules多个主题相同 例如 两者都用于Atom One Dark and Default Dark 但在不影响任何其他主题的情况下 我想让keywords it
  • 使用 CreateProcess 运行批处理文件

    我正在尝试使用 CreateProcess 启动一个新的环境块并在新的环境块中运行批处理文件 我已经阅读了 CreateProcess 的 msdn 示例 并得出了如下所示的代码 发生了什么 它将打开新的命令提示符 并停在那里 由于某种原因