Search code examples
c++windowsmfcwinmain

How does MFC's wWinMain end up in the executable?


In MFC, wWinMain is defined in appmodul.cpp. This file is built into mfc90ud.dll from what I can see. However, when I run my application, the call stack shows MyApplication.exe!wWinMain. How has it taken the wWinMain function that was exported in appmodul.obj and placed it in my application?


Solution

  • Right-click your project in the Solution Explorer window, Properties, Linker, Command Line. Type /verbose in the "Additional Options" box. Rebuild your project. The Output window now shows a trace of where the linker found a symbol. Search it for "winmain" to find this:

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

    Note the library name, mfcs90ud.lib is a static link library. If you search for "mfcs90ud.lib" then you can also see how that library got referenced:

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

    If you search the MFC source code for "mfcs", you'll find how this /defaultlib option got injected. From 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
    

    Long story short, an MFC app links two libraries. Mfc90u.lib is the import library for the DLL version of MFC. Mfcs90u.lib is a static link library that contains the bits that get linked into your executable. Including WinMain().