(1)这种DLL的输出函数的第一句语句就应该是AFX_MANAGE_STATE(AfxGetStaticModuleState());
请问这个afxModuleState是怎么初始化的?或者在初始化之前是不是已经先做了和应用程序的模块状态的转换.
(2)还有这种DLL有一个CWinApp派生类的对象,那么当调用它的应用程序加载该DLL的时候不是又会构造一个CWinApp对象吗.这与CWinApp的构造函数中明确指明的only one CWinApp object please是不是有矛盾了?请高手回答,问题搞清楚了加100分
请问这个afxModuleState是怎么初始化的?或者在初始化之前是不是已经先做了和应用程序的模块状态的转换.
(2)还有这种DLL有一个CWinApp派生类的对象,那么当调用它的应用程序加载该DLL的时候不是又会构造一个CWinApp对象吗.这与CWinApp的构造函数中明确指明的only one CWinApp object please是不是有矛盾了?请高手回答,问题搞清楚了加100分
2、MSDN中表达的不准确,应该是每个Module只能有一个CWinApp对象。
{
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;
}
}
动态链接到MFC的规则MFC DLL被装载时的初始化过程不清楚