Pregunta

aplicaciones de Windows GUI escritas en C / C ++ tienen 'WinMain' como punto de entrada (en lugar de 'principal'). Mi comprensión de esto es que el compilador genera una función 'principal' para ser llamado por el tiempo de ejecución C. Esta función 'principal' configura el entorno necesario para la interfaz gráfica de usuario y llama a 'WinMain' (especificando la instancia maneja etc.).

En resumen, creo que la consola y arranque de la aplicación GUI difieran de la siguiente manera:

aplicación de consola: C Runtime -> función 'principal' (codificado a mano)

aplicación GUI: C Runtime -> función 'principal' (compilador genera-) -> función 'WinMain' (codificado a mano)

Me gustaría tanto validar este conocimiento y saber cómo puedo codificar manualmente una interfaz gráfica de usuario de Windows con sólo una función 'principal' (es decir, sin tener que escribir 'WinMain').

¿Fue útil?

Solución

Tiene una comprensión incorrecta. La diferencia entre el principal y WinMain, aparte de algún código de inicialización differet, son los parámetros que se le pasan.

principal es el siguiente:

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 los parámetros y realizar la llamada, y ese es el código de inicio. Al compilar y vincular un programa, uno de los parámetros de unión es el punto de entrada, y que será, en función de una aplicación de consola o GUI, un poco diferente del código de inicio.

Por supuesto que puede escribir su propio código de inicio, sólo tiene que ir a su directorio fuente de Visual C ++ y se puede encontrar el código de inicio, se llama crt0.c y está en el directorio VC \ CRT \ src.

Otros consejos

Con Justo principal, no se puede codificar WinMain. Para justificaciones, las declaraciones siguientes fueron tomadas de   http://blogs.msdn.com/oldnewthing/archive/ 2007/12/03 / 6644060.aspx

  

[En Windows de programación,] ¿Por qué no fue el punto de entrada de la aplicación llama   ¿principal? Bueno, por un lado, el nombre principal ya estaba tomada, y   Ventanas no tenía la autoridad para reservar una definición alternativa.   No había ningún comité de normalización del lenguaje C en ese entonces; C fue   Dennis lo que dijo que era, y fue casi garantizado que Dennis   tomaría las medidas especiales para preservar código fuente de Windows   la compatibilidad en cualquier versión futura del lenguaje C. Desde K & R   no especifican que las implementaciones podrían ampliar las formas aceptables   de la función principal, que era muy posible que hubo un legal   C compilador que rechazó programas que declararon principal incorrectamente. los   estándar del lenguaje C actual permite explícitamente aplicación específica   definiciones alternativas para principal, pero que requiere que todos los compiladores para apoyar   esta nueva versión específica de Windows con el fin de elaborar programas de Windows   se sepa restringir el conjunto de compiladores que podría utilizar para   escribir los programas de Windows.

     

Si se las arregló para superar este obstáculo, tendría el problema de que   la versión Windows del principal tendría que ser algo como esto:

int main(int argc, char *argv[], HINSTANCE hinst,
         HINSTANCE hinstPrev, int nCmdShow);
     

Debido a la forma se realizó C vinculación, todas las variaciones de una función tenían que ponerse de acuerdo sobre el   parámetros que tenían en común. Esto significa que la versión de Windows   habría que sumar sus parámetros en el extremo de los más largos existentes   versión del principal, y luego tendría que cruzar los dedos y esperar   que el lenguaje C no añade otra versión alternativa de principal. Si   usted fue esta ruta, los dedos cruzados que fracasaron, porque resulta   que un tercer parámetro principal fue introducido en algún momento posterior, y   en conflicto con la versión de Windows de usar.

     

Supongamos que logró convencer a Dennis no permitir que   versión de tres parámetros de principal. Usted todavía tiene que llegar a los   dos primeros parámetros, lo que significa que el código de inicio de todos los programas   debe contener un analizador de línea de comandos. En los días de 16 bits,   Economizaron personas para salvar cada byte. Diciéndoles: "Oh, y todo su   programas van a ser 2KB más grande" probablemente no le haría mucho   de amigos. Quiero decir, eso es cuatro sectores de E / S de un disquete!

     

Pero probablemente la razón por la cual se le dio el punto de entrada de Windows una   nombre diferente es hacer hincapié en que se trata de una ejecución diferente   ambiente. Si se llama principal, la gente se tome los programas en C   diseñado para un entorno de consola, los echan en sus ventanas   compilador y, a continuación, ejecutar ellos, con resultados desastrosos.

Espero que esto aclare sus dudas.

funciona a la inversa. Hay un archivo de objeto enlazado estáticamente que viene con el compilador que mantiene el punto de entrada real. Ese punto de entrada hace inicialización y luego llama a su punto de entrada (es decir WinMain).

¿Qué parte estática que espera llamar pueden ser modificables. Por ejemplo, en Visual Studio hay un campo para el nombre del punto de entrada en la configuración de engarce.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top