CreateProcess выполняет только половинную команду - PullRequest
1 голос
/ 11 ноября 2019

У меня проблема с CreateProcess. Я создал следующий исходный код:

STARTUPINFOA si;
PROCESS_INFORMATION pi;

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

CreateProcessA(nullptr,
    "plink.exe -telnet -P 9999  192.168.230.75 < C:\\Users\\Mahre\\Scripts\\Telenet_Script.txt",
    nullptr,//security
    nullptr,// security
    FALSE,//inherits handles
    0,
    nullptr,
    nullptr,
    &si,
    &pi);

WaitForSingleObject(pi.hProcess, INFINITE);

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);

Проблема в том, что CreateProcess выполняет команду только пополам. Команда plink.exe -telnet -P 9999 192.168.230.75 выполнена, но CreateProcess игнорирует эту часть < C:\\Users\\Mahre\\Scripts\\Telenet_Script.txt. Я почти уверен, что это знак «меньше».

Со злом system() он работает очень хорошо и выполнил полную команду:

system("plink.exe -telnet -P 9999  192.168.230.75 < C:\\Users\\Mahre\\Scripts\\Telenet_Script.txt");

Может кто-нибудь объяснить мне, какЯ могу сделать это с помощью CreateProcess?

1 Ответ

3 голосов
/ 11 ноября 2019

Оператор перенаправления ввода обеспечивается оболочкой, в данном случае cmd.exe.

Чтобы сделать это с помощью CreateProcess(), вам нужно сделать это самостоятельно.

Сначала откройтефайл, который вы хотите использовать в качестве ввода для чтения, используя CreateFile() и установите дескриптор как наследуемый. Когда вы вызываете CreateProcess(), вам нужно установить флаг наследуемых дескрипторов в TRUE и заполнить структуру STARTUPINFO, чтобы содержать дескриптор, который вы хотите использовать для стандартного ввода.

При этом,вам не следует указывать часть команды «<имя файла», потому что вы установили ее вручную. </p>

Для получения дополнительной информации прочитайте документацию CreateProcess в MSDN. В документации приведены примеры вариантов этого случая.

...