Я пытаюсь создать процесс, который отправляет команду 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
СПАСИБО ВСЕМ
Вы пытаетесь запустить эту команду:
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, а не выполнять работу для интерпретатора команд. Но есть крайние случаи, и ваш пробег может отличаться.)
Других решений пока нет …