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成员函数中。
分享到:
相关推荐
深入剖析MFC的文档/视图模式灵活运用MDI.PDF
简单的MFC程序,完成程序启动时的启动画面效果
MFC开机自启动设置,显示为托盘程序,双击托盘,显示窗口,单击右键,显示子菜单,采用VS2013 VC++编程
深入MFC程序设计PDF深入MFC程序设计PDF
MFC程序执行过程剖析
详细的MFC程序运行机制剖析 MFC程序运行机制剖析
深入追踪MFC程序的执行流程 深入追踪MFC程序的执行流程 深入追踪MFC程序的执行流程
深入剖析MFC中Windows消息处理机制的详细介绍,对理解windows消息处理有很大的帮助哦
深入剖析MFC中的句柄的含义和用法,是每个想学好MFC有志之士必须掌握的精髓
资源名称:剖析MFC六大关键技术视频教程(23集)资源目录:【】剖析MFC六大关键技术1.仿真【】剖析MFC六大关键技术10.序列号【】剖析MFC六大关键技术11.文档视图结构【】剖析MFC六大关键技术12.文档视图结构【】剖析...
一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数。而在...
MFC程序框架剖析.pdf
MFC程序设计详细实例 第05章 MFC程序的生命期MFC程序设计详细实例 第05章 MFC程序的生命期MFC程序设计详细实例 第05章 MFC程序的生命期MFC程序设计详细实例 第05章 MFC程序的生命期MFC程序设计详细实例 第05章 MFC...
剖析MFC多线程程序的同步机制指导书,MFC多线程程序的同步机制
深入浅出MFC(windows编程,MFC程序设计)
深入浅出MFC 程序范例 深入浅出MFC 程序范例 深入浅出MFC 程序范例
而在MFC程序当中我们不再能找到类似WinMain这样的程序入口,取而代之的是一系列派生类的声明和定义及一个CWinApp类派生而来的类的全局对象。CWinApp类被称之为应用程序对象类,在一个MFC程序当中只允许有一个应用...
深入浅出MFC程序设计 深入浅出MFC程序设计
讲述MFC AppWizard的原理与MFC程序框架的剖析。AppWizard是一个源代码生成工具,是计算机辅助程序设计工具,WinMain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与...
VS2010/MFC 启动程序检查自身是否已经在运行。如果已经有一个在运行,则退出当前,并把原来已经运行的程序激活显示在当前窗口中。