再议模块状态

来源:互联网 发布:win10 iis php 配置 编辑:程序博客网 时间:2024/05/15 08:32

遇到一个ImageList导致Debug下Crash的问题.

查了下原因,最终还是由于模块状态的切换造成了.

 

当在初始化控件的时候

void CXXXBar::InitXXXBar(CWnd * pParent, DWORD dwID,CRect rect){

AFX_MANAGE_STATE(AfxGetStaticModuleState());

..

}

是由做模块状态切换的,也就是说,成员变量CImageList m_ImageList;其中m_ImageList的句柄是保存在对应的模块状态中的全局HIMAGELIST句柄MAP中的.

但是在销毁控件的时候,成员变量m_ImageList会自动销毁,但是模块状态并没有切换,

也就是说,

HIMAGELIST CImageList::Detach()

{

HIMAGELIST hImageList = m_hImageList;

if (hImageList != NULL)

{

CHandleMap* pMap = afxMapHIMAGELIST();

if (pMap != NULL)

pMap->RemoveHandle(m_hImageList);

}

 

m_hImageList = NULL;

return hImageList;

}

afxMapHIMAGELIST()此函数得到的全局HIMAGELIST句柄表,并不是创建时候的句柄表.所以并没有从全局表中Remove掉句柄.

 

解决办法:

在析构之前手动先把m_ImageList调用DestroyImageList.

 

 void CXXXbar::DestroyImageList()

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

m_ImageList.DeleteImageList();

return TRUE;

}

 

并在析构之前调用,我曾试图在析构函数中这样解决

CXXXBar::~CXXXBar()

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

}

但是没有成功,后来找到原因是因为局部变量的析构比成员变量的析构要早.所以状态根本没有切换.

原创粉丝点击