MFC程序的运行细节剖析
MFC程序也是Windows程序,所以它应该也有一个WinMain,但是在程序中看不到它的踪影。其实在程序进入点之前,还有一个(而且仅有一个)全局对象(theApp),这就是所谓的Application object,当操作系统将程序加载并激活时,这个全局对象获得配置,其构造函数会先执行,比WinMain更早。
一 CWinApp取代WinMain
CWinApp的派生对象被称为application object,可以想见,CWinApp本身就代表一个程序本体。所谓程序本体是与程序本身有关而不与窗口有关的数据或动作。CWinApp类定义如下:
class CWinApp : public CWinThread
{
//startup args
HINSTANCE m_hInstance;
HINSTANCE m_hPrevInstance;
LPTSTR m_lpCmdLine;
int m_nCmdShow;
//Runing args
CWnd* m_pMainWnd;
CWnd* m_pActiveWnd;
LPCTSTR m_pszAppName;
LPCTSTR m_pszRegistryKey;
public:
LPCTSTR m_pszExeName; //executable name
LPCTSTR m_pszHelpFilePath; //default based on module path
LPCTSTR m_pszProfileName; //default based on app name
public:
virtual BOOL InitApplication();
//overrides for implementation
virtual BOOL InitInstance();
virtual int ExitInstance();
virtual int Run();
virtual BOOL OnIdle(LONG lCount);
};
传统意义上SDK程序的WinMain所完成的工作现在由CWinApp的三个函数完成:
virtual BOOL InitApplication();
virtual BOOL InitInstance();
virtual int Run();
那么WndProc函数到哪里去了呢?CFrameWnd主要用来掌握一个窗口,你几乎可以说它是用来取代SDK程序中的窗口函数的地位。MFC通过内建了一个所谓的Message Map机制,会把消息自动送到“与消息对应的特定函数”中去。有关Message Map实现机制请看另外一篇博客。
二 程序运行过程分析
如图