(редактировать: избегать использования _execv
в Windows, как описано в комментариях)
Чтобы исправить использование _execv
, задайте в первом аргументе точный путь. Затем измените второй параметр (arguments
), чтобы имя пути указывалось в двойных кавычках (а также в других аргументах, которые пробелятся с пробелом):
char program[] = "c:\\foler name\\path name.exe";
char *arguments[] = {
"\"c:\\foler name\\path name.exe\"",
"\"(x 1)\"",
"\"(x 2)\"",
nullptr
};
_execv(program, arguments);
Теперь получатель должен видеть argv[0]
как "c:\\foler name\\path name.exe"
, argv[1]
как "(x 1)"
...
Вы также можете использовать CreateProcess
и поместить имя программы и аргументы в одну строку.
#include <windows.h>
...
std::string cmd;
cmd += "\"c:\\folder name\\path name.exe\" "; //<- add extra space manually
cmd += "a "; //<- add extra space manually
cmd += "b c d ";
cmd += "\"Hello World!\" "; //<- add extra space manually
STARTUPINFOA si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcessA(0, cmd.data(), 0, 0, 0, 0, 0, 0, &si, &pi);
//* if cmd.data() is not supported then copy to char buffer
//optional: wait until process is finished
//WaitForSingleObject(pi.hProcess, INFINITE);
//CloseHandle(pi.hProcess);
//CloseHandle(pi.hThread);
Смотри также
Синтаксический анализ аргументов командной строки C ++