在MFC中, wWinMain
是在appmodul.cpp
定义的。 这个文件是从我能看到的内置到mfc90ud.dll中的。 但是,当我运行我的应用程序时,调用堆栈显示MyApplication.exe!wWinMain
。 如何将appmodul.obj
中导出的wWinMain
函数放在我的应用程序中?
在解决方案资源管理器窗口的属性,链接器,命令行中右键单击您的项目 在“其他选项”框中键入/详细信息。 重建你的项目。 “输出”窗口现在显示链接器找到符号的位置。 搜索它的“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..
如果你搜索“mfcs”的MFC源代码,你会发现如何注入这个/ 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是MFC的DLL版本的导入库。 Mfcs90u.lib是一个静态链接库,包含链接到您的可执行文件中的位。 包括WinMain()。
链接器完成了这一切。 它把所有的目标文件,库文件和匹配它所需要的。 随着装饰,它可以匹配正确的声明和定义等
这个魔法是由CWinApp的构造函数完成的:
AfxGetApp()
返回的 – 这是相当复杂的东西! wWinMain
被调用,它使用由CWinApp构造函数设置的数据结构。 尝试从wWinMain
,或从您的自定义CWinApp
派生的构造函数进行调试。