2011-07-29 14 views
5

En MFC, wWinMain se define en appmodul.cpp. Este archivo está integrado en mfc90ud.dll por lo que puedo ver. Sin embargo, cuando ejecuto mi aplicación, la pila de llamadas muestra MyApplication.exe!wWinMain. ¿Cómo se tomó la función wWinMain que se exportó en appmodul.obj y la colocó en mi aplicación?¿Cómo termina el wWinMain de MFC en el ejecutable?

Respuesta

10

Haga clic con el botón derecho en la ventana del Explorador de soluciones, Propiedades, Enlazador, Línea de comandos. Escriba/verbose en el cuadro "Opciones adicionales". Reconstruye tu proyecto. La ventana Salida ahora muestra un rastro de donde el enlazador encontró un símbolo. Buscarla para "WinMain" para encontrar esto:

1> Searching c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\lib\mfcs90ud.lib: 
1>  Found [email protected] 
1>  Referenced in msvcrtd.lib(wcrtexew.obj) 
1>  Loaded mfcs90ud.lib(appmodul.obj) 

Nota el nombre de biblioteca, mfcs90ud.lib es una librería de enlace estática. Si se busca "mfcs90ud.lib", entonces también puede ver cómo quedó referenciado esa biblioteca:

1>Starting pass 1 
1>Processed /DEFAULTLIB:mfc90ud.lib 
1>Processed /DEFAULTLIB:mfcs90ud.lib 
1>Processed /DEFAULTLIB:msvcrtd.lib 
etc.. 

si se busca el código fuente MFC para "MFC", encontrará cómo consiguió inyecta esta opción/defaultlib . Desde afx.h:

  #ifdef _DEBUG 
        #pragma comment(lib, "mfc" _MFC_FILENAME_VER "ud.lib") 
        #pragma comment(lib, "mfcs" _MFC_FILENAME_VER "ud.lib") 
      #else 
        #pragma comment(lib, "mfc" _MFC_FILENAME_VER "u.lib") 
        #pragma comment(lib, "mfcs" _MFC_FILENAME_VER "u.lib") 
      #endif 

En pocas palabras, una aplicación MFC vincula dos bibliotecas. Mfc90u.lib es la biblioteca de importación para la versión DLL de MFC. Mfcs90u.lib es una biblioteca de enlaces estáticos que contiene los bits que se vinculan a su ejecutable. Incluyendo WinMain().

+0

Excelente, gracias por una respuesta completa :) –

+0

El motivo de la pregunta es que quería anular algunos de los inicios iniciales en MFC. Mi primer pensamiento fue ir a WinMain, pero ahora sé que puedo usar AfxWinMain en su lugar. –

1

El enlazador hace todo eso. Toma todos los archivos de objeto, archivos de biblioteca y coincide con lo que necesita. Junto con las decoraciones, puede hacer coincidir las declaraciones correctas con las definiciones, etc.

1

La mágica es hecho por el constructor de CWinApp:

  1. se declara una variable global de este tipo (en su mayoría de tipo derivado).
  2. CWinApp :: CWinApp se llama (antes de cualquier rutina principal).
  3. Configura alguna estructura de datos, que luego es devuelta por AfxGetApp(). ¡Es algo bastante complicado!
  4. wWinMain se llama, que utiliza la estructura de datos configurada por el constructor de CWinApp.

Pruebe la depuración desde wWinMain, o desde su constructor personalizado CWinApp -derivado.

+0

Hola, gracias por tu respuesta, pero eso en realidad no respondió mi pregunta. –

+0

¿Te refieres a la inclusión de appmodul.obj? – Ajay

+0

Sí, prácticamente, no me di cuenta de que MFC consistía en una biblioteca estática y una biblioteca dinámica. –

Cuestiones relacionadas