【问题标题】:CreateProcess causing problemsCreateProcess 导致问题
【发布时间】:2019-04-12 18:00:15
【问题描述】:

由于某种原因创建进程打开 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
  • 我想如果你调试你的程序你就会明白为什么它会这样。你调试过你的程序吗?
  • 出现命令窗口的唯一方式是,如果您的 cmd[] 变量从调用控制台应用程序的用户那里接收到命令字符串。如果您不希望控制台应用程序显示命令窗口,CreateProcess() 确实有一个可用的CREATE_NO_WINDOW 标志。
  • 字符串将包含\n,这是您所期望的吗?

标签: c winapi


【解决方案1】:

首先,fgets 将在插入字符串的大小 \n 设置为\0

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

第二,

在命令行中弹出更多 cmd 实例。

如果你的意思是这样的:

这是因为cmd进程的输入焦点和当前进程交替出现在同一个控制台,并不总是创建一个新的实例。

如果你CreateProcessCREATE_NEW_CONSOLE

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

您会看到只创建了一个新的 cmd 控制台。

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多