Ocultar consola en función C system(), Win

5 minutos de lectura

avatar de usuario
a0rtega

Estoy codificando un programa C en Dev-C++ y necesito usar un par de comandos de Windows (CMD). Es fácil, pero cuando se ejecuta el comando en la función system(), el programa ejecuta la consola en la ejecución.

Un ejemplo:

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

    int main()
    {
      system("if not exist c:\my_docs\doc.txt (xcopy /Y doc.txt c:\my_docs\)"); // Cmd command
      system("pause");
      return 0;
    }

¿Existe otra función, o alguna modificación que no muestra la consola?

¡Gracias! Atentamente.

  • Dev C ++ está obsoleto, le recomiendo que elija otro

    – KeatsPeeks

    20 de octubre de 2009 a las 21:16

  • ¿Cómo espera que funcione el comando “pausa” si no se muestra la ventana de la consola? Además, cmd.exe es una aplicación de consola: no hay una manera fácil de evitar que se muestre la ventana de la consola.

    –Larry Osterman

    20 de octubre de 2009 a las 23:01

  • @Larry Osterman, Encantado de verte en SO Larry; Disfruto el blog!

    – BobbyShaftoe

    21 de octubre de 2009 a las 1:07

  • Dios mío, la última versión estable de Dev-C++ es de 2005… es un poco obsoleta, eso sí. +1 a Samuel.

    – a0rtega

    21 de octubre de 2009 a las 16:17

  • Sí, Larry, también pensé esto, pero preguntar es gratis y no hay preguntas similares en stackoverflow 😉

    – a0rtega

    21 de octubre de 2009 a las 16:27

avatar de usuario
sergio madrazo

Puedes usar WinExec("your cmd command", SW_HIDE); en lugar de system("cmd command").

  • Gracias. Soy de los días de Windows de 16 bits, pero olvidé esta función. Fue útil en un escenario importante para Windows LogOn (Cred. Provider DLL), donde MS no permite CreateProcess(), y system() tiene una ventana de consola en la parte posterior (y por lo tanto no es una opción atractiva). ¡Gracias!

    – Gran Sol Central

    28 de junio de 2017 a las 12:49

  • Está system("chcp 936") en mi código. Está configurando el cosole para mostrar caracteres chinos. Si lo ejecuto en otra aplicación, sería inútil.

    – Zhang

    4 de diciembre de 2020 a las 9:06

Puedes hacerlo con CreateProcess.

STARTUPINFOW si;
PROCESS_INFORMATION pi;

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

if (CreateProcessW(command, arg, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

  • +1 Gracias, lo probaré. No es exactamente lo que estaba buscando, pero es una buena respuesta.

    – a0rtega

    21 de octubre de 2009 a las 16:19

  • Probé tu código en ventanas 7, pero no funciona. quiero ejecutar adb shell am broadcast -a NotifyServiceStart. Por cierto, he añadido el adb en el SENDEROy sistema() puede ejecutar esta línea bien.

    – Chenzhongpu

    11 de enero de 2015 a las 3:13

  • msdn.microsoft.com/en-ca/library/windows/desktop/… “La cadena puede especificar la ruta completa y el nombre de archivo del módulo a ejecutar o puede especificar un nombre parcial. En el caso de un nombre parcial, la función usa la unidad actual y el directorio actual para completar la especificación. La función no use la ruta de búsqueda. Este parámetro debe incluir la extensión del nombre del archivo; no se asume ninguna extensión predeterminada”.

    -Roland Rabien

    11 de enero de 2015 a las 16:04


Como dijo FigBug, CreateProcess() es el camino a seguir, pero no creo que CreateProcess() pueda ejecutar una declaración de shell if. Es posible que deba pasar algo como esto como un comando:

"cmd.exe /c \"if not exist c:\my_docs\doc.txt (xcopy /Y doc.txt c:\my_docs\)\""

Pero una mejor solución podría ser usar Crea un archivo() para probar si existe un archivo y Copiar archivo() para copiarlo.

avatar de usuario
MD XF

NOTA: Mi respuesta no se adapta necesariamente a su pregunta específica, pero esta sesión de preguntas y respuestas es la mejor resultado de Google para “Sistema de Windows sin símbolo del sistema” y otras consultas similares.

He aquí una forma de ejecutar comandos sin un nuevo cmd.exe ventana. Basado en la respuesta de Roland Rabien y MSDNhe escrito una función de trabajo.

#include "AtlBase.h"
#include "AtlConv.h"
  int windows_system(const char *cmd) {
    PROCESS_INFORMATION p_info;
    STARTUPINFO s_info;
    DWORD ReturnValue;
    CA2T programpath(cmd);

    memset(&s_info, 0, sizeof(s_info));
    memset(&p_info, 0, sizeof(p_info));
    s_info.cb = sizeof(s_info);

    if (CreateProcess(programpath, NULL, NULL, NULL, 0, 0, NULL, NULL, &s_info, &p_info)) {
      WaitForSingleObject(p_info.hProcess, INFINITE);
      GetExitCodeProcess(p_info.hProcess, &ReturnValue);
      CloseHandle(p_info.hProcess);
      CloseHandle(p_info.hThread);
    }
    return ReturnValue;
  }

Funciona en todas las plataformas de Windows. Llama como lo harías system().

avatar de usuario
Matt Stead

int win_system(const char *command)
{
    // Windows has a system() function which works, but it opens a command prompt window.
    
    char            *tmp_command, *cmd_exe_path;
    int         ret_val;
    size_t          len;
    PROCESS_INFORMATION process_info = {0};
    STARTUPINFOA        startup_info = {0};

    
    len = strlen(command);
    tmp_command = malloc(len + 4);
    tmp_command[0] = 0x2F; // "https://stackoverflow.com/"
    tmp_command[1] = 0x63; // 'c'
    tmp_command[2] = 0x20; // <space>;
    memcpy(tmp_command + 3, command, len + 1);
    
    startup_info.cb = sizeof(STARTUPINFOA);
    cmd_exe_path = getenv("COMSPEC");
    _flushall();  // required for Windows system() calls, probably a good idea here too
    
    if (CreateProcessA(cmd_exe_path, tmp_command, NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &startup_info, &process_info)) {
        WaitForSingleObject(process_info.hProcess, INFINITE);
        GetExitCodeProcess(process_info.hProcess, &ret_val);
        CloseHandle(process_info.hProcess);
        CloseHandle(process_info.hThread);
    }
    
    free((void *) tmp_command);
    
    return(ret_val);
}

  • ¿Podría incluir alguna explicación/comentario sobre su bloque de código?

    – dsillman2000

    28 de octubre de 2021 a las 2:26

  • Su respuesta podría mejorarse con información de apoyo adicional. Edite para agregar más detalles, como citas o documentación, para que otros puedan confirmar que su respuesta es correcta. Puede encontrar más información sobre cómo escribir buenas respuestas en el centro de ayuda.

    – Comunidad
    Bot

    28 de octubre de 2021 a las 5:55

  • ¿Podría incluir alguna explicación/comentario sobre su bloque de código?

    – dsillman2000

    28 de octubre de 2021 a las 2:26

  • Su respuesta podría mejorarse con información de apoyo adicional. Edite para agregar más detalles, como citas o documentación, para que otros puedan confirmar que su respuesta es correcta. Puede encontrar más información sobre cómo escribir buenas respuestas en el centro de ayuda.

    – Comunidad
    Bot

    28 de octubre de 2021 a las 5:55

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad