poner - notas rapidas windows 10 no aparecen
¿Cómo puedo escribir una aplicación de Windows sin usar WinMain? (3)
Funciona de otra manera. Hay un archivo de objeto enlazado estáticamente que viene con el compilador que contiene el punto de entrada real. Ese punto de entrada realiza la inicialización y luego llama a su punto de entrada (es decir, WinMain).
Lo que esa parte estática espera llamar puede ser modificable. Por ejemplo, en Visual Studio hay un campo para el nombre del punto de entrada en la configuración del enlazador.
Las aplicaciones GUI de Windows escritas en C / C ++ tienen ''WinMain'' como punto de entrada (en lugar de ''main''). Mi comprensión de esto es que el compilador genera una función ''principal'' que el C Runtime llamará. Esta función ''principal'' configura el entorno necesario para la GUI y llama a ''WinMain'' (especificando los identificadores de instancia, etc.).
En resumen, creo que el inicio de la aplicación de consola y GUI difiere de la siguiente manera:
Aplicación de consola: C Runtime -> función ''main'' (codificada a mano)
Aplicación GUI: C Runtime -> función ''principal'' (generada por el compilador) -> función ''WinMain'' (codificada a mano)
Me gustaría validar este entendimiento y descubrir cómo puedo codificar manualmente una GUI de Windows con solo una función ''principal'' (es decir, sin tener que escribir ''WinMain'').
Tienes una comprensión incorrecta. La diferencia entre main y WinMain, aparte de algún código de inicialización diferente, son los parámetros que se le pasan.
El principal se ve así:
int main(int argc, char* argv[]);
Mientras WinMain se ve así:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);
Algo tiene que configurar esos parámetros y hacer la llamada, y ese es el código de inicio. Cuando compila y vincula un programa, uno de los parámetros del enlazador es el punto de entrada, y eso será, dependiendo de una consola o aplicación GUI, un bit diferente de código de inicio.
Ciertamente puede escribir su propio código de inicio, solo vaya a su directorio de código fuente visual de C ++ y puede encontrar el código de inicio, se llama crt0.c y está en el directorio VC / crt / src.
Con Just main, no puedes codificar Winmain. Para justificaciones, las siguientes afirmaciones fueron tomadas de http://blogs.msdn.com/oldnewthing/archive/2007/12/03/6644060.aspx
[En la Programación de Windows,] ¿Por qué el punto de entrada de la aplicación no se llamó main? Bueno, para empezar, el nombre principal ya estaba ocupado, y Windows no tenía la autoridad para reservar una definición alternativa. No había un comité de normalización del lenguaje C en aquel entonces; C fue lo que Dennis dijo que era, y no estaba garantizado que Dennis tomaría medidas especiales para preservar la compatibilidad del código fuente de Windows en cualquier versión futura del lenguaje C. Dado que K & R no especificó que las implementaciones podían extender las formas aceptables de la función principal, era completamente posible que hubiera un compilador de C legal que rechazara los programas que declaraban principal incorrectamente. El estándar de lenguaje C actual permite explícitamente definiciones alternativas específicas para implementación para main, pero requerir que todos los compiladores admitan esta nueva versión específica de Windows para compilar programas de Windows restringiría de forma gratuita el conjunto de compiladores que podría usar para escribir programas de Windows.
Si lograras superar ese obstáculo, tendrías el problema de que la versión principal de Windows tendría que ser algo como esto:
int main(int argc, char *argv[], HINSTANCE hinst, HINSTANCE hinstPrev, int nCmdShow);
Debido a la forma en que se realizó el enlace C, todas las variaciones de una función debían estar de acuerdo con los parámetros que tenían en común. Esto significa que la versión de Windows debería agregar sus parámetros al final de la versión existente más larga de main, y luego tendría que cruzar los dedos y esperar que el lenguaje C nunca agregara otra versión alternativa de main. Si siguió esta ruta, sus dedos cruzados le fallaron, porque resulta que un tercer parámetro se agregó a main algún tiempo después, y entró en conflicto con su versión amigable para Windows.
Supongamos que logras convencer a Dennis para que no permita esa versión de tres parámetros de main. Todavía tiene que encontrar esos dos primeros parámetros, lo que significa que el código de inicio de cada programa debe contener un analizador de línea de comando. En los días de 16 bits, las personas escatimaban para guardar cada byte. Decirles, "Ah, y todos tus programas serán 2KB más grandes", probablemente no te harían muchos amigos. Quiero decir, ¡eso es cuatro sectores de E / S de un disquete!
Pero probablemente la razón por la cual el punto de entrada de Windows recibió un nombre diferente es para enfatizar que se trata de un entorno de ejecución diferente. Si se llamara main, las personas tomarían programas C diseñados para un entorno de consola, los lanzarían a su compilador de Windows y luego los ejecutarían, con resultados desastrosos.
Espero que esto aclare tus dudas.