看《深入浅出MFC》,讲到AfxGetApp获取的是全局对象theApp,具体代码在://AfxWin1.inl
_AFXWIN_INLINE CWinApp* AFXAPI AfxGetApp()
{ return afxCurrentWinApp; }//Afxwin.h
#define afxCurrentWinApp    AfxGetModuleState()->m_pCurrentWinApp
...
也就是说AfxGetApp()相当于:AfxGetModuleState()->m_pCurrentWinApp
而theApp的构造函数里只有这样一个保存自己指针的地方:CWinApp::CWinApp(LPCTSTR lpszAppName)
{
...
pModuleState->m_pCurrentWinApp = this;
...
}不知道AfxGetModuleState()->m_pCurrentWinApp到底是如何得到这个theApp的this指针的?

解决方案 »

  1.   

    AfxGetModuleState()就是得到pModuleState的啦,不是在构造函数里把this保存在了m_pCurrentWinApp里吗,然后从这里取出来的啊
      

  2.   

    pModuleState到底是全局变量还是CWinApp的成员?我怎么找不到它的定义?
      

  3.   

    pModuleState的声明找到了,原来是CWinApp::CWinApp构造函数的局部变量:AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();这就更奇怪了。
      

  4.   

    你去看看AfxGetModuleState和_AFX_CMDTARGET_GETSTATE();代码吧
      

  5.   

    pModuleState从变量名就知一二。
      

  6.   

    同意楼上~~~
    对了,你右键变量pModuleState不就可以找到它的定义说明了吗~~~
      

  7.   

    原来_AFX_CMDTARGET_GETSTATE()是个宏,相当于AfxGetModuleState(),但是无法找到AfxGetModuleState的对应代码……
      

  8.   

    我自己来总结一下,CWinApp的构造函数中有: AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
    pModuleState->m_pCurrentWinApp = this;
    可以简化为:
    AfxGetModuleState()->m_pCurrentWinApp = this;而AfxGetApp()的返回值为AfxGetModuleState()->m_pCurrentWinApp,这样就得到了theApp的this指针。现在唯一不明白的就是AfxGetModuleState到底做了什么?因为没有找到它的源代码
      

  9.   

    AfxGetModuleState获取当前模块的状态
      

  10.   

    楼上的,这招我试过了,跟不进去啊。而且MSDN中也没有这个函数的说明
      

  11.   

    MFC也不会把所有的代码都放出来吧