2009-10-20 90 views
12

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 del sistema(), el programa ejecuta la consola en la ejecución.Ocultar la consola en la función del sistema C(), Win

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; 
    } 

Exists otra función, o una modificación que no muestra la consola?

Gracias! Atentamente.

+6

Dev C++ es obsoleto, le recomiendo que elija otro – KeatsPeeks

+0

¿Cómo espera que el comando "pausa" funcione si no se muestra la ventana de la consola? También cmd.exe es una aplicación de consola: no hay una manera fácil de evitar que se muestre la ventana de la consola. –

+0

@Larry Osterman, Encantado de verte en SO Larry; ¡Disfruto el blog! – BobbyShaftoe

Respuesta

12

Puede 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); 
} 
+0

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

+1

Probé tu código en * windows 7 *, pero no funciona. Quiero ejecutar ** adb shell am broadcast -a NotifyServiceStart **. Por cierto, he agregado ** adb ** en ** PATH **, y ** system() ** puede ejecutar bien esta línea. – chenzhongpu

+0

http://msdn.microsoft.com/en-ca/library/windows/desktop/ms682425%28v=vs.85%29.aspx "La cadena puede especificar la ruta completa y el nombre de archivo del módulo para 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 usará la ruta de búsqueda. Este parámetro debe incluir la extensión del nombre del archivo; la extensión es asumida." –

3

Como se ha indicado FigBug, CreateProcess() es el camino a seguir, pero no creo que CreateProcess() puede ejecutar una cáscara si declaración. Puede que tenga que pasar algo así como una orden:

"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 utilizar CreateFile() para comprobar si existe un archivo y CopyFile() para copiarlo.

+0

+1 Finalmente lo hice, es la mejor solución en este caso. – a0rtega

10

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

+1

Esto no funcionó en Windows XP ... –

+0

Gracias. Estoy en 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 CreateProcess() no está permitido por MS, y system() tiene una ventana de consola en la parte posterior (y por lo tanto no es una opción atractiva). Gracias tu! – BuddhaLight

0

NOTA: Mi respuesta no está necesariamente adaptada a su pregunta específica, pero esta Q & A es la parte superior Google result para "sistema Windows sin símbolo del sistema" y otras consultas similares.

Aquí hay una forma de ejecutar comandos sin una nueva ventana cmd.exe. Basado en Roland Rabien's answer y MSDN, he escrito una función de trabajo.

int windows_system(const char *cmd) 
{ 
    PROCESS_INFORMATION p_info; 
    STARTUPINFO s_info; 
    LPSTR cmdline, programpath; 

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

    cmdline  = _tcsdup(TEXT(cmd)); 
    programpath = _tcsdup(TEXT(cmd)); 

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

Funciona en todas las plataformas de Windows. Llame al igual que lo haría system().

Cuestiones relacionadas