在 MFC 中,wWinMain
定义在appmodul.cpp
. 据我所知,这个文件是内置在 mfc90ud.dll 中的。但是,当我运行我的应用程序时,调用堆栈显示MyApplication.exe!wWinMain
. 它是如何获取wWinMain
导出的函数appmodul.obj
并将其放置在我的应用程序中的?
问问题
1616 次
3 回答
10
在解决方案资源管理器窗口、属性、链接器、命令行中右键单击您的项目。在“其他选项”框中键入 /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 是 MFC DLL 版本的导入库。Mfcs90u.lib 是一个静态链接库,其中包含链接到可执行文件的位。包括 WinMain()。
于 2011-07-29T11:30:32.133 回答
1
链接器完成所有这些。它获取所有目标文件、库文件并匹配它需要的内容。除了装饰之外,它还可以将正确的声明与定义等相匹配。
于 2011-07-29T11:24:03.833 回答
0
魔术是由 CWinApp 的构造函数完成的:
- 您声明此类型的全局变量(主要是派生类型)。
- CWinApp::CWinApp 被调用(在任何主程序之前)。
- 它设置了一些数据结构,这是后来返回的
AfxGetApp()
- 这是相当复杂的东西! wWinMain
被调用,它利用 CWinApp 构造函数设置的数据结构。
尝试从wWinMain
或从您的自定义CWinApp
派生构造函数进行调试。
于 2011-07-30T13:24:19.310 回答