问题表现:c++程序在安装到新电脑之后,打开其中某个对话框会闪退。


诡异之处在于,新电脑出现了此错误,而工作电脑无法复现。猜测可能是c++运行时和net环境不同(不全)导致的,在新电脑上进行相关安装,问题解决。但是!过了一天,工作电脑上竟然出现了这个闪退问题。不过这也是个好事,毕竟工作电脑上可以直接调试代码。


直接原因是afxtempl.h(MFC的一个文件)中的一个this指针为空导致报错和闪退。回溯找原因(模拟堆栈):

afxtempl.h的SetSize()中this空指针错误

afxtempl.h的RemoveAll()中this空指针错误

调用RemoveAll()的Dlg指针为空

Create该对话框时失败,未执行OnInitDialog()函数(Dlg指针在其中初始化)

到资源视图中查看该对话框,无法打开,提示:未在此计算机上注册ActiveX控件{6262D3A0-531B-11CF-91F6-C2863C385E30}。问了ai,答复此为Microsoft FlexGrid Control(MSFLXGRD.OCX),是Microsoft提供的一个ActiveX控件,用于在MFC应用程序中显示表格数据。

解决:在电脑上找到MSFLXGRD.OCX,使用管理员运行命令提示符,使用regsvr32指令注册MSFLXGRD.OCX,再次调试,成功执行无报错。

后续:经查询,运行时vcredist_x64.exe的安装并不会自动注册MSFLXGRD.OCX,但是新电脑确实是这样解决了问题。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐