2008-10-22 21 views
22

¿Cómo programarías una aplicación C/C++ que podría ejecutarse sin abrir una ventana o consola?Crear una aplicación sin una ventana

+1

hilo relacionadas: http://stackoverflow.com/questions/13051412/how-to-hide-the-console-window-in-a-win32-project-using-visual-studio-2010 – BuvinJ

Respuesta

34

Cuando se escribe un programa WinMain, se obtiene automáticamente la opción/Subsistema que debe ventanas en el compilador. (Suponiendo que use Visual Studio). Para cualquier otro compilador, una opción similar podría estar presente, pero el nombre de la bandera podría ser diferente.

Esto hace que el compilador cree una entrada en el formato de archivo ejecutable (PE format) que marca el ejecutable como un ejecutable de Windows. Una vez que esta información está presente en el ejecutable, el cargador del sistema que inicia el programa tratará su binario como un ejecutable de Windows y no un programa de consola y por lo tanto no provoca que las ventanas de la consola se abran automáticamente.

Pero un programa de Windows no necesita crear ninguna ventana si no lo desea, al igual que todos los programas y servicios que ve ejecutándose en la barra de tareas, pero no ve las ventanas correspondientes para ellos. Esto también puede suceder si crea una ventana, pero opta por no mostrarla.

Todo lo que tiene que hacer, para lograr todo esto es,

#include <Windows.h> 

int WinMain(HINSTANCE hInstance, 
      HINSTANCE hPrevInstance, 
      LPTSTR lpCmdLine, 
      int  cmdShow) 
    { 
    /* do your stuff here. If you return from this function the program ends */ 
    } 

La razón necesita una misma WinMain es que una vez que marque el subsistema de Windows, el enlazador supone que su función de punto de entrada (que se invoca después de que se carga el programa y la biblioteca C Run Time se inicializa) será WinMain y no main. Si no proporciona un WinMain en dicho programa, obtendrá un error de símbolo no resuelto durante el proceso de vinculación.

+0

Tengo un requisito similar cuando uso un temporizador. quiero que el programa se ejecute sin parar. En este programa, se ha configurado un temporizador. Entonces, ¿cómo lo hago? ? –

+0

no debería ser int WINAPI WinMain (...)? – uceumern

11

en Windows:

#include <windows.h> 

int APIENTRY WinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, 
        int  nCmdShow) 
{ 
    // <-- Program logic here 
    return 0; 
} 

Asegúrese de utilizar el modificador de vinculador/subsistema mencionadas por Adam Mitz.

En otras plataformas:

int main(int argc, char**argv) 
{ 
    // <-- Program logic here 
    return 0; 
} 
+0

Dos quejas: WinMain es innecesario si no incluye windows.h; y devuelve 0; es opcional en main. – coppro

+2

Desea devolver 0 para que pueda indicar el éxito de los programas que lo llaman. –

+0

Si crea una aplicación de consola y tiene int main para Windows, tendrá una ventana emergente de consola cuando haga doble clic en el archivo ejecutable. –

-7

Si está utilizando MSVC o Visual Studio sólo tiene que utilizar el nuevo asistente de proyectos y seleccione la aplicación de consola .

+0

la aplicación de consola siempre abrirá una ventana de consola cuando se ejecute – computinglife

+1

¿Estás seguro de que sabes de lo que estás hablando? http://en.wikipedia.org/wiki/Win32_console Creo que no! La última vez que miré una aplicación de consola fue una aplicación win32 no gui !!! – jussij

+1

jussij - Correcto. es una aplicación CLUI. y para interactuar con esa CLUI, Windows crea una GUI CL para usted. – Aaron

3

Si tiene una necesidad de ejecutar contiguamente su programa sin tener consola o ventana, puede encontrar deamon on *NIX o services on Windows, este ejemplo de .NET si necesita win32 simple solo un poco de google para la muestra.
Dado que su pregunta está etiquetada como win32 supongo que los servicios son más relevantes para usted.

0

Utilice el asistente de Visual Studio para crear la aplicación Win32. Pero no cree la ventana, es decir, elimine la función de creación de ventana. Alternativamente, podemos crear la aplicación Win Service.

2

En Visual Studio Express 2010 después de configurar el subsistema a Windows (como lo sugiere el usuario17224), alternativamente cambiar el principal a WinMain (como lo sugieren el usuario17224 y Brian R. Bondy), se puede establecer la función de entrada en main en propiedades, vinculador, avanzado, punto de entrada: simplemente escriba main en el cuadro de texto.

Cuestiones relacionadas