MFC构造一个CWinApp子类的全局对象。
在c++中全局对象首先获得配置,他的构造函数先被执行,就是说他比WinMain更早执行。比如如下我是以GoodsSell程序为例。(可以忽略这个名字来看)
class CGoodsSellApp : public CWinApp {
public: CGoodsSellApp();
public: virtual BOOL InitInstance();
DECLARE_MESSAGE_MAP()
};
在其cpp源文件中,CGoodsSellApp的构造函数并没有做任何的事情,所有的事情都是调用它的父类,CWinApp来完成的。 CWinApp的构造函数的定义:
CWinApp::CWinApp(LPCTSTR lpszAppName) {
if (lpszAppName != NULL)
m_pszAppName = _tcsdup(lpszAppName);
else
m_pszAppName = NULL;
// initialize CWinThread state
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
//看,声明了一个指针
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
ASSERT(AfxGetThread() == this);
m_hThread = ::GetCurrentThread();
m_nThreadID = ::GetCurrentThreadId();
// initialize CWinApp state
ASSERT(afxCurrentWinApp == NULL);
// only one CWinApp object please
//又将this指针传给了m_pCurrentWinApp,哦呵呵……
//意思即保存当前对象的指针。
pModuleState->m_pCurrentWinApp = this;
ASSERT(AfxGetApp() == this);
// in non-running state until WinMain
m_hInstance = NULL;
m_pszHelpFilePath = NULL;
m_pszProfileName = NULL;
m_pszRegistryKey = NULL;
m_pszExeName = NULL;
m_pRecentFileList = NULL;
m_pDocManager = NULL;
m_atomApp = m_atomSystemTopic = NULL;
m_lpCmdLine = NULL; m_pCmdInfo = NULL;
// initialize wait cursor state
m_nWaitCursorCount = 0;
m_hcurWaitCursorRestore = NULL;
// initialize current printer state
m_hDevMode = NULL;
m_hDevNames = NULL;
m_nNumPreviewPages = 0;
// not specified (defaults to 1)
// initialize DAO state
m_lpfnDaoTerm = NULL;
// will be set if AfxDaoInit called
// other initialization
m_bHelpMode = FALSE;
m_nSafetyPoolSize = 512;
// default size
}
此构造函数主要用来对线程和全局变量的初始化,同时保存theApp对象的指针,这样WinMain可以通过该指针调用它的成员函数,用来初始化和执行该应用。 Win32的程序的开始仍不例外,仍是C运行时动态链接库(CRT DLL)对WinMain函数的调用,这些工作由系统自动完成。 WinMain函数的定义如下:
extern "C"
int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
主函数的唯一作用是调用AfxWinMain,调用完毕之后返回其返回值。然后再AfxWinMain中有调用App对象的InitInstance成员函数来开始运行程序。所以一般MFC开始的运行的东西都要写入CWinApp的InitInstance成员函数中。