一个控件导致VS工程无法运行的笔记

昨天遇到了奇怪问题: 在Win 7 + VS 2015下编译通过,并且debug和release均可独立运行的工程,在Win 10甚至其他的Win 7上却不停的闪退,连最初的启动画面都看不到。如果使用VS的工程文件进行源码调试,编译正常通过,但在绘制第一个启动画面的时候程序就崩溃,报错:

Debug Assertion Failed!
Program: C:\Windows\system32\mfc140ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\occcont.cpp
Line: 925

在安装各个VS版本的redistributable工具包,在Win 10上设好兼容性和管理员运行依然无果后,发现有过来人提了这样一句

后来问度娘才知道,是控件没有注册的问题。

其实在VS的资源视图中,点击带有该控件的窗口资源时,VS就提示控件丢失,当时没在意。
把控件安装好以后,运行正常了。

这才问GD是不是有用控件,答曰:是的,用了串口通信的插件。
于是进入资源视图,一个个点击窗口,发现的确有控件找不到的情况,而且告诉了控件ID是{BDEB0088-66F9-4A55-ABD2-0BF8DEEC1196}。通过CLSID (CLASS ID)反查到使用的控件叫TEECHART.OCX,版本号8.0.0.6,另外的串口控件叫MSCOMM32.OCX。让GD从开发机上提取这两个控件,复制到/system32/sysWOW64系统文件夹,使用管理员权限在命令行运行regsvr32 xxx.ocx注册控件后,一切恢复正常。
这个坑的原因主要是开发时用了MFC这个万年前的老框架,使得许多功能需要使用OCX控件这种已经淘汰的方式实现。而程序出错并没有给出直接的错误原因,使得花了大量的时间在项目编译和系统兼容的查错上。以后还是应该使用新的框架来开发啊。

Comments
Write a Comment
'