#c #winapi
#c #winapi
Вопрос:
по какой-то причине процесс создания открывает cmd, даже если он не указан, и нажатие enter приводит к появлению большего количества экземпляров cmd в командной строке.
#include <windows.h>
#include <stdio.h>
void main()
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
char cmdline[255];
ZeroMemory(amp;pi, sizeof(pi));
ZeroMemory(amp;si, sizeof(si));
si.cb = sizeof(si);
loop:
fgets(cmdline,255,stdin);
CreateProcessA(NULL,cmdline,NULL,NULL,FALSE,0,NULL,NULL,amp;si,amp;pi);
goto loop;
}
Комментарии:
1.
cmd
в вашем коде, очевидно, есть переменная, заполненная пользовательским вводом. «cmd» в вашем вопросе относится к этой переменной или кcmd.exe
?2. Я думаю, если вы отладите свою программу, вы поймете, почему она так себя ведет. Вы отладили свою программу?
3. Окно командной строки появится только в том случае, если ваша
cmd[]
переменная получит командную строку от пользователя, который вызывает консольное приложение. Если вы не хотите, чтобы окно командной строки отображалось для консольных приложений,CreateProcess()
у него естьCREATE_NO_WINDOW
доступный флаг.4. Строка будет содержать a
n
, это то, что вы ожидаете?
Ответ №1:
Во-первых, fgets
будет получена строка с символом ‘n’, когда размер вставленной строки <(255-1). Итак, давайте установим n
значение
:
fgets(cmd, 255, stdin);
cmd[strlen(cmd) - 1] = '';
CreateProcess(cmd, NULL, NULL, NULL, FALSE, 0, NULL, NULL, amp;si, amp;pi);
Второй,
в командной строке появляется больше экземпляров cmd.
Если то, что вы имеете в виду, похоже:
Это связано с тем, что фокус ввода процесса cmd и текущего процесса поочередно отображаются в одной и той же консоли, не всегда создавая новый экземпляр.
Если вы CreateProcess
с CREATE_NEW_CONSOLE
:
CreateProcess(cmd, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, amp;si, amp;pi);