7

在 MFC 中,wWinMain定义在appmodul.cpp. 据我所知,这个文件是内置在 mfc90ud.dll 中的。但是,当我运行我的应用程序时,调用堆栈显示MyApplication.exe!wWinMain. 它是如何获取wWinMain导出的函数appmodul.obj并将其放置在我的应用程序中的?

4

3 回答 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 的构造函数完成的:

  1. 您声明此类型的全局变量(主要是派生类型)。
  2. CWinApp::CWinApp 被调用(任何主程序之前)。
  3. 它设置了一些数据结构,这是后来返回的AfxGetApp()- 这是相当复杂的东西!
  4. wWinMain被调用,它利用 CWinApp 构造函数设置的数据结构。

尝试从wWinMain或从您的自定义CWinApp派生构造函数进行调试。

于 2011-07-30T13:24:19.310 回答