`
omygege
  • 浏览: 1345157 次
文章分类
社区版块
存档分类
最新评论

深入剖析 MFC程序的启动过程

 
阅读更多

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成员函数中。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics