深入剖析 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成员函数中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值