winapi — Начинающий C ++ CreateProcess () Ошибка 2

Я пытаюсь создать процесс, который отправляет команду cmd.exe и получает ошибку 2,
Зачем? Это возможно? Как?

    STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

String pathexe = "C:\Windows\system32\cmd.exe";
String command= "notepad.exe";

if(!CreateProcess(
pathexe.c_str(),  // lpApplicationName
command.c_str(),  // lpCommandLine
NULL,   // lpProcessAttributes
NULL,   // lpThreadAttributes
FALSE,  // bInheritHandles
0,      // dwCreationFlags
NULL,   // lpEnvironment
NULL,   // lpCurrentDirectory
&si,    // lpStartupInfo
&pi     // lpProcessInformation
))
{
AnsiString error = GetLastError();
ShowMessage("Error: " + error);
}
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

PD: 1) Предполагается, что вы можете использовать CreateProcess () для этой цели, я не должен делать это с ShellExecute () или system ().
2) Я читал об этом на форуме и не могу найти решение этой ошибки, есть много ответов на подобные вопросы, но они не обращаются к ошибке, предлагаются другие функции или смешиваются с командой route.
3) Я не думаю, что проблема разрешает, потому что я построил в то время как манифест.
4) В настоящее время я использую C ++ Builder, в win7, 32бит, но это не важно.
5) Я полагаю, что проблема будет оценена как отрицательная и дублирующая (как обычно), но предлагаемые примеры тестирования также получают ошибки.
Спасибо всем

ПЕРВЫЕ ВЫВОДЫ:

Ошибка 2: система не может найти указанный файл.

Функция ссылки: https://msdn.microsoft.com/es-es/library/windows/desktop/ms679360(v=vs.85).aspx
Ошибка ссылки: https://msdn.microsoft.com/es-es/library/windows/desktop/ms681382(v=vs.85).aspx

С ошибкой 2: проверьте синтаксис, путь к файлу и существование.

работает:

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

String command = "notepad.exe";

if(!CreateProcess(
NULL,   // lpApplicationName
commmand.c_str(), // lpCommandLine
NULL,   // lpProcessAttributes
NULL,   // lpThreadAttributes
FALSE,  // bInheritHandles
0,      // dwCreationFlags
NULL,   // lpEnvironment
NULL,   // lpCurrentDirectory
&si,    // lpStartupInfo
&pi     // lpProcessInformation
))
{
AnsiString error = GetLastError();
ShowMessage("Error: " + error);
}
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

Этот пример работает и для exe

String command = "cd C:\\sample\\calc.exe";

Но нет с общими командами cmd, должен быть способ отправить команды в cmd как:

notepad.exe && cd C:\sample\ && sample1.txt

СПАСИБО ВСЕМ

-1

Решение

Вы пытаетесь запустить эту команду:

cmd notepad

(Вы делаете это не совсем правильно; аргумент lpCommandLine должен включать всю строку, а не только notepadи вы не правильно процитировали обратную косую черту.)

Но даже если вы исправите эти проблемы, это не сработает, потому что у вас неправильный синтаксис. Вы обнаружите, что это не будет работать, если набрать в командной строке!

Вместо этого попробуйте:

String pathexe = "C:\\Windows\\system32\\cmd.exe";
String command= "cmd /c notepad.exe";

/c опция означает «запустить эту команду». Ты можешь использовать /k вместо этого, если вы хотите, чтобы командное окно оставалось открытым после завершения команды, хотя для программы это необычно.

Последнее замечание: я предполагаю, что здесь notepad это просто замена для более сложной команды. Если вы действительно хотите запустить блокнот или любой другой исполняемый файл, вы не должны вызывать cmd.exe совсем:

String command= "notepad";

if(!CreateProcess(
NULL,  // lpApplicationName
command.c_str(),  // lpCommandLine
...

Вам нужно только позвонить на cmd.exe если вам нужно запустить встроенную команду или составную командную строку.

(Собственно, звоню cmd.exe считается плохой практикой даже в этих случаях; в Windows вы, как правило, должны делать такие вещи для себя с помощью API, а не выполнять работу для интерпретатора команд. Но есть крайние случаи, и ваш пробег может отличаться.)

1

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

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