如何将 std::string 环境块传递给 CreateProcess?

Posted

技术标签:

【中文标题】如何将 std::string 环境块传递给 CreateProcess?【英文标题】:How do I pass an std::string environment block to CreateProcess? 【发布时间】:2013-04-19 16:41:30 【问题描述】:

我目前正在尝试将CreateProcess 与路径、参数和环境变量一起使用。我的变量存储在字符串中。

在下面的示例中,filePath 和 cmdArgs 工作正常,但我无法让 envVars 工作。

std::string filePath = "C:\\test\\DummyApp.exe";
std::string cmdArgs  = "Arg1 Arg2 Arg3";
std::string envVars  = "first=test\0second=jam\0";  // One

//LPTSTR testStr = "first=test\0second=jam\0";      // Two

CreateProcess(
   LPTSTR(filePath.c_str()),           //path and application name
   LPTSTR(cmdArgs.c_str()),            // Command line
   NULL,                               // Process handle not inheritable
   NULL,                               // Thread handle not inheritable
   TRUE,                               // Set handle inheritance
   0,                                  // Creation flags
   LPTSTR(envVars.c_str()),            // environment block
   //testStr                      //this line works
   NULL,                               // Use parent's starting directory 
   &si,                                // Pointer to STARTUPINFO structure
   &pi )                               // Pointer to PROCESS_INFORMATION structure

)

当我运行此代码时,返回的错误是“错误 87:参数不正确”。

我不明白的是,如果我注释掉标有“一”的行并将其替换为标有“二”的行(并在函数调用中进行匹配交换),那么它可以正常工作。

【问题讨论】:

【参考方案1】:

您使用的std::string 的构造函数将复制"first=test\0second=jam\0" 直到第一个\0(C 样式字符串)。

要传递所有字符串,请使用另一个constructor:

std::string envVars("first=test\0second=jam\0", 22);
                     ^^^^^^^^^^^^^^^^^^^^^^^^   ^
                                                |
                           22 characters -------+

【讨论】:

完美,谢谢...这么快,我什至无法接受:)

以上是关于如何将 std::string 环境块传递给 CreateProcess?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Unicode 集将 std::string 传递给 CreateDirectory

将 std::string 的 xvalue 传递给采用 std::string_view 的函数

我可以将 std::string 传递给 DLL 吗?

将`char []`传递给接受`std :: string&`的函数是不是是一种好习惯

将 std::string_view 传递给执行 const std::string& 的 API

将 javascript 字符串传递给 std::string 打印垃圾值