Как MFC wWinMain попадает в исполняемый файл? - PullRequest
5 голосов
/ 29 июля 2011

В MFC wWinMain определяется в appmodul.cpp.Этот файл встроен в mfc90ud.dll из того, что я вижу.Однако, когда я запускаю свое приложение, стек вызовов показывает MyApplication.exe!wWinMain.Как он взял функцию wWinMain, которая была экспортирована в appmodul.obj, и поместил ее в мое приложение?

Ответы [ 3 ]

10 голосов
/ 29 июля 2011

Щелкните правой кнопкой мыши свой проект в окне обозревателя решений, Свойства, Компоновщик, Командная строка. Введите / verbose в поле «Дополнительные параметры». Перестрой свой проект. Окно «Вывод» теперь показывает трассировку того, где компоновщик нашел символ. Ищите «winmain», чтобы найти это:

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)

Обратите внимание на имя библиотеки, mfcs90ud.lib - это библиотека статических ссылок. Если вы ищете «mfcs90ud.lib», вы также можете увидеть, как на эту библиотеку ссылались:

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

Если вы будете искать в исходном коде MFC слово "mfcs", вы обнаружите, как этот параметр / defaultlib был введен. От 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

Короче говоря, приложение MFC связывает две библиотеки. Mfc90u.lib - это библиотека импорта для версии DLL MFC. Mfcs90u.lib - это статическая библиотека ссылок, которая содержит биты, которые связаны с вашим исполняемым файлом. Включая WinMain ().

1 голос
/ 30 июля 2011

Волшебство делается конструктором CWinApp:

  1. Вы объявляете глобальную переменную этого типа (в основном производного типа).
  2. CWinApp :: CWinApp вызывается ( до любой основной подпрограммы).
  3. Он устанавливает некоторую структуру данных, которая позже возвращается AfxGetApp() - это довольно сложный материал!
  4. wWinMain получаетВызванный, который использует настройку структуры данных конструктором CWinApp.

Попробуйте отладку из wWinMain или из вашего собственного CWinApp -производного конструктора.

1 голос
/ 29 июля 2011

Линкер делает все это. Он берет все объектные файлы, библиотечные файлы и сопоставляет то, что ему нужно. Наряду с украшениями он может сопоставить правильные объявления с определениями и т. Д.

...