MFC的wWinMain如何在可执行文件中结束?

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

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

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