Как передать блок среды std :: string в CreateProcess?

Я сейчас пытаюсь использовать 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: параметр неверен».

Чего я не понимаю, так это того, что, если я закомментирую строку, помеченную как «один», и заменю ее строкой, помеченной как «два» (и сделаю соответствующий обмен в вызове функции), тогда она будет работать правильно.

3

Решение

Конструктор std::string вы использовали будет копировать "first=test\0second=jam\0" до первого \0 (Строка в стиле C).

Чтобы передать всю строку, используйте другой конструктор:

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

Другие решения

Других решений пока нет …