2011-07-29 59 views
5

在MFC中,wWinMain定義在appmodul.cpp中。這個文件是從我所能看到的內置到mfc90ud.dll中的。但是,當我運行我的應用程序時,調用堆棧顯示MyApplication.exe!wWinMainappmodul.obj中導出的wWinMain函數如何處理並將其放入我的應用程序中?MFC的wWinMain如何在可執行文件中結束?

回答

10

右鍵單擊解決方案資源管理器窗口中的項目,屬性,鏈接器,命令行。在「其他選項」框中鍵入/詳細。重建你的項目。 「輸出」窗口現在顯示鏈接器找到符號的位置。搜索它的「winmain」找到這個:

1> Searching c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\lib\mfcs90ud.lib: 
1>  Found [email protected] 
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源代碼「微生物燃料電池」,你會發現這個/ 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()。

+0

非常好,謝謝你的回答:) –

+0

問題的原因是我想覆蓋MFC中的一些初始啓動。我最初的想法是去WinMain,但現在我知道我可以使用AfxWinMain來代替。 –

1

鏈接器完成所有工作。它採用所有的目標文件,庫文件並匹配它所需的內容。與裝飾一起,它可以將正確的聲明與定義等相匹配。

1

神奇的是通過的CWinApp的構造函數中完成:

  1. 您聲明此類型(主要的衍生型)的一個全局變量。
  2. CWinApp :: CWinApp被調用(之前任何主程序)。
  3. 它設置了一些數據結構,這是後來由AfxGetApp()返回的 - 這是相當複雜的東西!
  4. wWinMain被調用,它使用由CWinApp構造函數設置的數據結構。

嘗試從wWinMain或從您的自定義CWinApp派生構造函數進行調試。

+0

嗨,謝謝你的回答,但那並沒有真正回答我的問題。 –

+0

你的意思是包含appmodul.obj? – Ajay

+0

是的,我沒有意識到MFC由靜態庫和動態庫組成。 –

相關問題