上个月有人问过MFC中一些全局变量的问题,最近工作中也是用到了MFC,所以追踪了下MFC的一些源码,查看了网上一些资料,在此作个小记录。
首先来认识几个类
这个类就重载了operator new和operator delete操作符。
class AFX_MODULE_STATE : public CNoTrackObject
列举下它的几个眼熟的成员变量:
CWinApp* m_pCurrentWinApp;
HINSTANCE m_hCurrentInstanceHandle;
HINSTANCE m_hCurrentResourceHandle;
LPCTSTR m_lpszCurrentAppName;
BYTE m_bDLL; // TRUE if module is a DLL, FALSE if it is an EXE
BYTE m_bSystem; // TRUE if module is a "system" module, FALSE if not
。。。。。。
从这个类的部分注释和成员名称类型可以隐约判断出来实例指针,实例句柄、资源句柄、应用程序名称、是否为DLL模块、是否为系统模块等等。
可以去看一下它的构造函数对各成员变量的初始化。
class _AFX_BASE_MODULE_STATE : public AFX_MODULE_STATE
{
public:
#ifdef _AFXDLL
_AFX_BASE_MODULE_STATE() : AFX_MODULE_STATE(TRUE,
AfxWndProcBase, _MFC_VER)
#else
_AFX_BASE_MODULE_STATE() : AFX_MODULE_STATE(TRUE)
#endif
{ }
};
这个很明了了,进程状态看成是AFX_MODULE_STATE的特例吧。
AfxWndProcBase(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
AFX_MANAGE_STATE(_afxBaseModuleState.GetData());
return AfxWndProc(hWnd, nMsg, wParam, lParam);
}
AfxWndProc是所有MFC窗口的消息起点,然后从它路由出去。
MFC在PreCreateWindow注册窗口类之后,在创建窗口之前,调用了AfxHookWindowCreate函数,这样每次创建窗口的时候,该函数就将窗口函数修改成AfxWndProc。