CreateProcess вызывает проблемы

почему-то процесс создания открывает cmd даже если это не указано и нажатие ввода вызывает появление дополнительных экземпляров cmd в командной строке.

#include <windows.h>
#include <stdio.h>

void main()
{
    PROCESS_INFORMATION pi;
    STARTUPINFO si;
    char cmdline[255];

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

    loop:
         fgets(cmdline,255,stdin);
         CreateProcessA(NULL,cmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
         goto loop;
}
cmd в вашем коде, очевидно, это переменная, заполненная пользовательским вводом. Относится ли «cmd» в вашем вопросе к этой переменной или к cmd.exe?
Ben Voigt 12.04.2019 20:15

Думаю, если вы отлаживаете свою программу, то понимаете, почему она ведет себя именно так. Вы отладили свою программу?

David Heffernan 12.04.2019 20:38

Единственный способ появления командного окна — это если ваша переменная cmd[] получает командную строку от пользователя, который вызывает консольное приложение. Если вы не хотите, чтобы окно команд отображалось для консольных приложений, у CreateProcess() есть доступный флаг CREATE_NO_WINDOW.

Remy Lebeau 12.04.2019 23:30

Строка будет содержать \n, вы этого ожидаете?

Drake Wu 13.04.2019 08:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, fgets получит строку с символом '\n', когда размер вставляемой строки <(255-1). Итак, давайте установим \n на \0:

fgets(cmd, 255, stdin);
cmd[strlen(cmd) - 1] = '\0';
CreateProcess(cmd, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

Второй,

more instances of cmd to popup in the command line.

Если то, что вы имеете в виду, похоже на:

Это связано с тем, что фокус ввода процесса cmd и текущего процесса поочередно появляются в одной и той же консоли, не всегда создавая новый экземпляр.

Если вы CreateProcess с CREATE_NEW_CONSOLE:

CreateProcess(cmd, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

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

Другие вопросы по теме