再议模块状态
来源:互联网 发布: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());
}
但是没有成功,后来找到原因是因为局部变量的析构比成员变量的析构要早.所以状态根本没有切换.
- 再议模块状态
- MFC和模块状态
- MFC 的模块状态
- MFC模块状态实现
- 状态加载模块
- 再议Exception
- 再议WS_CLIPSIBLINGS
- 再议Static
- 再议PCA
- 再议Seconds_Behind_Master
- 再议关键字
- android 再议
- 再议raw_input
- 再议封装
- 登录注册模块、状态保持模块
- MFC 模块状态的实现
- DLL资源模块状态切换
- MFC的模块状态概念
- C#
- 网页上显示flv视频的方法
- GCC-3.4.6源代码学习笔记(10)
- 通过C#程序调用 Windows 记事本程序 编辑一个
- “大气球”监控“客流眼”数人
- 再议模块状态
- select sort algorithm
- 将excel文件中的数据导入导出至SQL数据库中
- Studying note of GCC-3.4.6 source (10)
- C#读取Excel数据在CAD上展图
- 页面右下角漂浮层上下或左右移动,广告浮动
- SQL Server里面的U锁
- 该安定下来了
- Web 设计中的 5 个最具争议性的话题