C++之MFC工程源码移植纪录

因项目需要,要利用老板之前使用VC写的MFC工程的界面、OpenGL显示及一些算法。要把老版本的VC的源码移植到VS2015中,关于移植过程中遇到一些问题及其解决过程的记录。

  • 界面的移植

界面的移植,我使用的方法是,自己新建一个MFC工程,然后修改其.rc和resource.h文件,在MFC中resource.h一般是保存控件ID、系统资源ID等一些宏定义。

  • VC的一些坑

早期的VC版本中的 for(int i = 0; ...; ...){......} 循环中定义的变量 i 在之后的代码中仍然可以使用,其作用等价于 int i; for(i = 0; ...; ...){......} 。因此移植到VS2015过程中,会报错变量未定义。

  • VC7.0的库函数的改变

源码中部分VC7.0框架和MFC库函数的已经改变了,必须找到高版本的替代函数。

  • OpenGL移植

早期的VC框架中自带了OpenGL的相关头文件和dll,VS2015中没有这些。作者另外安装了OpenGL库,环境配置类似于opencv。同样部分函数高版本已做修改,要找到替代函数。

  • 动态库的移植

由于早期代码用到了zlib.lib、libpng.lib等库,拿到VS2015中已经不能用了(静态lib库,只能针对某个vs版本使用),因此需要在网上下载相关源码,使用当前环境重新编译,否则会报一些链接的错误。

  • DoModal()函数调用失败

表现形式:窗口闪退,DoModal()函数没有返回值,进程直接退出

参考博客:https://blog.csdn.net/guandq2106/article/details/7090300

摘录部分:若是第二种表现,即对话框弹不出来,同时伴随内存访问错误的提示框出现,那么问题很可能出现在初始化对话框界面的代码方面,具体是在OnInitDialog函数,即使它是在DLL中弹出对话框。事实上在在DLL中弹出对话框如果不进行资源句柄切换,顶多是弹不出对话框,并不会出现内存访问方面的错误。在解决这方面的错误,一个误区是单步进入DoModal()函数调试,直至定位DoModal函数内部哪一句出错。后来我发现这纯粹是浪费时间,就算定位了在DoModal函数内部哪一句出错,你依然不知道为什么会出错。实际上调用DoModal()函数,激发的却是OnInitDialog函数。因此你只需确定OnInitDialog函数哪一句出错了(这里的OnInitDialog函数是指派生对话框类的OnInitDialog函数)。

 

调试过程:经过单步调试,发现屏蔽OnInitDialog()里部分代码,界面能够正常显示,不会闪退,但是功能要缺失很多。于是把代码添加回去,继续单步调试,发现DoDataExchange()、OnInitDialog()、PreTranslateMessag()、OnPaint()这些函数都能够正常执行,执行完onPaint()后界面显示了,且均未报错。继续执行则闪退。继续查看调试的输出,有一部分是代码运行过程的打印消息,接着是几个线程的退出消息,线程退出的返回值均为-1,然后进程结束。我就在想是不是其他线程的退出,导致主(界面)线程终断退出。于是我在项目中查找所有退出进程的函数exit(-1)、ExitProcess(0)、TerminateProcess(GetCurrentProcess(),0)、PostQuitMessage(0)...等,打断点调试,没有一处程序执行到该位置。调试了2天,弄得我人都快奔溃了。终于在最后想到了,onTimer()函数也会在程序背后执行,抱着试一试的态度,调试程序的ontimer()函数,终于找到了问题所在了。

if (!bDone)
        glutIdleFunc(NULL);

在onTimer()函数中调试,程序执行到 glutIdleFunc(NULL); 这行代码进程就结束了。把改行代码屏蔽掉,界面终于能正常显示了。

  • 总结

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值