Я сейчас пытаюсь использовать 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: параметр неверен».
Чего я не понимаю, так это того, что, если я закомментирую строку, помеченную как «один», и заменю ее строкой, помеченной как «два» (и сделаю соответствующий обмен в вызове функции), тогда она будет работать правильно.
Конструктор std::string
вы использовали будет копировать "first=test\0second=jam\0"
до первого \0
(Строка в стиле C).
Чтобы передать всю строку, используйте другой конструктор:
std::string envVars("first=test\0second=jam\0", 22);
^^^^^^^^^^^^^^^^^^^^^^^^ ^
|
22 characters -------+
Других решений пока нет …