Процесс создания, вызывающий проблемы

#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);
  

Вы увидите, что была создана только новая консоль cmd.
введите описание изображения здесь