VS2008迁移MFC项目到VS2015时InitInstance调用UpdateWindow抛出读访问异常
MFC项目迁移异常解决方法
异常发生在MFC工具栏图片平滑缩放逻辑中,可按以下步骤排查修复:
1. 修复工具栏图标资源问题
异常直接触发点是图标缩放时的内存访问越界,大多由旧项目图标资源不兼容导致:
- 检查项目内所有工具栏、菜单使用的图标,确认尺寸统一、色深为32位带透明通道,避免16位/8位旧BMP图标混用
- 临时验证:注释掉CMainFrame类中工具栏加载的相关代码,运行程序如果不再崩溃即可确认是图标资源问题
- 快速规避:在InitInstance函数最开头添加代码固定工具栏尺寸,跳过自动缩放逻辑:
CMFCToolBar::SetMenuSizes(CSize(16, 16), CSize(0, 0)); CMFCToolBar::SetToolBarSizes(CSize(16, 16), CSize(0, 0));
2. 禁用高DPI自动适配
VS2015默认MFC项目开启高DPI感知,旧项目未做适配时会触发UI自动缩放,导致图标缩放异常:
- 项目属性修改:打开【配置属性】→【清单工具】→【输入和输出】,将DPI感知改为“无”
- 代码强制设置:在InitInstance函数最开头添加代码:
SetProcessDPIAware(); // Win10及以上系统可使用更严格的配置:SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE);
3. 清理残留注册表配置
代码中调用的LoadStdProfileSettings会从注册表加载旧版本保存的工具栏布局、尺寸配置,不同电脑上的残留配置差异会导致部分设备崩溃:
- 先注释掉
LoadStdProfileSettings(0)代码测试,如果崩溃消失,删除注册表对应路径下的项目配置:路径为HKEY_CURRENT_USER\Software\Applicazioni locali generate tramite la Creazione guidata applicazioni,删除后重新运行程序会生成默认配置。
4. 规避MFC运行库版本问题
如果是动态链接MFC库受系统运行库版本影响,可改为静态链接完全规避版本差异:
- 打开项目属性→【配置属性】→【常规】,将“MFC的使用”改为“在静态库中使用MFC”,重新全量编译项目即可。
5. 修复VS2015本身的MFC缺陷
VS2015初始版本存在CMFCToolBarImages::SmoothResize的已知bug,安装VS2015 Update3及以上版本的官方补丁即可修复。
内容的提问来源于stack exchange,提问作者GiaMat45
相关产品推荐
相关产品推荐

