(1)这种DLL的输出函数的第一句语句就应该是AFX_MANAGE_STATE(AfxGetStaticModuleState());
请问这个afxModuleState是怎么初始化的?或者在初始化之前是不是已经先做了和应用程序的模块状态的转换.
(2)还有这种DLL有一个CWinApp派生类的对象,那么当调用它的应用程序加载该DLL的时候不是又会构造一个CWinApp对象吗.这与CWinApp的构造函数中明确指明的only one CWinApp object please是不是有矛盾了?请高手回答,问题搞清楚了加100分

解决方案 »

  1.   

    1、没明白是什么意思。
    2、MSDN中表达的不准确,应该是每个Module只能有一个CWinApp对象。
      

  2.   

    1.要搞清楚问题,就看源码,看看AFX_MANAGE_STATE(AfxGetStaticModuleState());究竟都干了些什么,struct AFX_MAINTAIN_STATE2
    {
    explicit AFX_MAINTAIN_STATE2(AFX_MODULE_STATE* pModuleState) throw();
    ~AFX_MAINTAIN_STATE2();protected:
    #ifdef _AFXDLL
    AFX_MODULE_STATE* m_pPrevModuleState;
    _AFX_THREAD_STATE* m_pThreadState;
    #endif ULONG_PTR m_ulActCtxCookie;
    BOOL m_bValidActCtxCookie;
    };
    #define AFX_MANAGE_STATE_NO_INIT_MANAGED(p) AFX_MAINTAIN_STATE2 _ctlState(p);
    #define AFX_MANAGE_STATE(p) _AfxInitManaged(); AFX_MANAGE_STATE_NO_INIT_MANAGED(p)
    /////////////////
    /////////////////////
    /////////////////下面的构造函数就是AFX_MANAGE_STATE真正实现程序模块切换的地方。
    AFX_MAINTAIN_STATE2::AFX_MAINTAIN_STATE2(AFX_MODULE_STATE* pNewState) throw()
    {
    #ifdef _AFXDLL
    m_pThreadState = _afxThreadState.GetData();
    ASSERT(m_pThreadState);
    if(m_pThreadState)
    {
    m_pPrevModuleState = m_pThreadState->m_pModuleState;
    m_pThreadState->m_pModuleState = pNewState;
    }
    else
    {
    // This is a very bad state; we have no good way to report the error at this moment
    // since exceptions from here are not expected
    m_pPrevModuleState=NULL;
    m_pThreadState=NULL;
    }
    #endif if (AfxGetAmbientActCtx() && 
    pNewState->m_hActCtx != INVALID_HANDLE_VALUE)
    {
    m_bValidActCtxCookie = AfxActivateActCtx(pNewState->m_hActCtx, &m_ulActCtxCookie);
    }
    else
    {
    m_bValidActCtxCookie = FALSE;
    }
    }
      

  3.   

    我知道是切换模块状态,代码上很清楚,但是我搞不清楚afxModuleState是怎么,什么时候被初始化的.
    动态链接到MFC的规则MFC DLL被装载时的初始化过程不清楚