Diferencia entre Windows y la aplicación de consola


39

¿Qué diferencias hay entre las aplicaciones de Windows y de la consola?

Al crear un nuevo proyecto en Visual C++, solicita elegir cualquiera de los anteriores.

62

La única diferencia es que una aplicación de consola siempre genera una consola si no se inicia desde una (o si la consola se suprime activamente al iniciarse). Una aplicación de Windows, por otro lado, no genera una consola. Es puede todavía adjuntar a una consola existente o crear uno nuevo usando AllocConsole.

Esto hace que las aplicaciones de Windows sean más adecuadas para aplicaciones GUI o aplicaciones en segundo plano porque normalmente no desea tener una ventana de terminal creada para ellas.

En una nota más técnica, la única diferencia entre una consola y un ejecutable de Windows es un byte en el encabezado PE del archivo exe. Alternar este byte de forma manual (por ejemplo, utilizando un editor hexadecimal) convierte el tipo de aplicación. Este es un truco bien publicado que se usa para crear aplicaciones de consola en VB6 (donde este tipo de aplicación no fue explícitamente compatible).

Para determinar y cambiar el tipo de subsistema de una aplicación, debe leer partes del encabezado PE. Sin embargo, la dirección de los datos del subsistema no es fija, porque es parte del encabezado opcional del archivo cuya posición está determinada por una dirección almacenada en el encabezado del archivo DOS (en el miembro e_lfanew). En realidad, esta dirección apunta al registro _IMAGE_NT_HEADERS que, a su vez, incluye la estructura IMAGE_OPTIONAL_HEADER32. Tiene un miembro int161) llamado Subsystem. El valor del miembro es 2 para una aplicación de Windows y 3 para una aplicación de consola. Existen otros subsistemas (en particular, POSIX y kernel). He escrito una pequeña aplicación VB6 para cambiar el subsistema de una aplicación, que se puede descargar desde ActiveVB como código fuente.

El formato PE no está muy bien documentado pero este documento puede servir como introducción: Peering Inside the PE: A Tour of the Win32 Portable Executable File Format.


1) Esto en realidad no contradice mi afirmación de que sólo un byte es diferente: el byte más significativo de este miembro es siempre 0. Solamente los mínimos cambios significativos bytes.

  0

Gracias Konrad - gran :-) 22 feb. 092009-02-22 13:24:33

  0

@Rakesh, se debería aceptar su solución si te gusta, es la pequeña V al lado de la respuesta. 22 feb. 092009-02-22 13:27:07

  0

@Olafur, ¿podría decirme cuál es la importancia del valor '4' justo arriba de la pequeña V junto a la respuesta? 22 feb. 092009-02-22 13:29:21

  0

ese es el número de "Votos ascendentes": 4 personas (5 ahora) han votado a favor de esta respuesta. 22 feb. 092009-02-22 13:36:16

  0

¿qué es ese '2' al lado de la pregunta? 22 feb. 092009-02-22 13:39:15

  0

¿No hay diferencias en los archivos DLL a los que se hace referencia también? 22 feb. 092009-02-22 13:40:13

  0

@Rakesh - No de votos a favor para su pregunta 22 feb. 092009-02-22 13:40:39

  0

@SoapBox: vea la respuesta actualizada. La dirección no es fija, tiene que calcularse. He publicado un enlace a un código VB6 para leer esta información. El artículo de MSDN también muestra cómo hacer esto. 22 feb. 092009-02-22 16:15:27

  0

Mi padre solía reemplazar el vinculador con un programa personalizado que cambiaba la línea de comando del vinculador en el archivo apropiado y luego ejecutaba el vinculador real en él. El resultado final es lo mismo que alternar el byte en el ejecutable, por supuesto :) 31 may. 132013-05-31 05:10:53


1

aplicación de consola se extiende desde una línea de comandos de Windows (Inicio/Ejecutar/cmd)

Una aplicación de ventana está preestablecido para que pueda programar una aplicación de interfaz gráfica de usuario que se ejecuta en el entorno Windows.


15

Además de la diferencia mencionada por Konrad, consola y aplicaciones de Windows se comportan de manera diferente cuando se llama de forma interactiva desde el símbolo del sistema:

Cuando se inicia una aplicación de consola, el símbolo del sistema no se restablece hasta que se cierra la aplicación de consola. Cuando inicia una aplicación de Windows, el comando regresa inmediatamente.

Esto no se aplica a los archivos por lotes; siempre esperarán hasta que la aplicación salga. (Siempre puede usar el comando start para iniciar una aplicación sin esperar.)


2

La diferencia está en la forma en que se apagan las aplicaciones. Cuando utiliza la plantilla de la consola, tiene un talón que se encenderá en una consola. Si ya se está ejecutando en una consola, ignora la llamada para girar una.

De la misma manera, una aplicación de Windows está diseñada con un formulario predeterminado. Si desea borrarlo, puede crear una aplicación sin forma de Windows Forms que sea esencialmente una aplicación de consola sin una ventana de consola.

En lo que respecta a las agallas de la aplicación, son esencialmente lo mismo. La diferencia principal se agrega en la etapa de compilación.


1

bucle de mensajes es también uno de la diferencia:

http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows


2

Puede cambiar el subsistema con el Editbin.exe (MSDN Entry on EDITBIN.exe)