vs2010 mfc C++

此文尤其推荐那些对VC6.0有着无比怀旧情节的人来看:)

首先来简单对比一下两套系统:
VS2010,自带10.0版本的MFC、CRT等DLL库,新的编译器(部分支持C++ 11标准、包括LAMBDA表达式),功能强大而完善的IDE环境。新的安全特性与SHE处理函数。
VC6.0,自带4.2版本的MFC、CRT等DLL库,很老的编译器(并且很不标准),功能勉强够用的IDE环境。

VS2010生成的东西体积小、效率高,但是需要使用的基础支持库众多。为了发布一个几十k的小程序,还要一并发布msvcr100.dll msvcp100.dll MFC100.dll等等支持库。到目前为止这些库并不是随着操作系统一起发布的。

VC6.0生成的东西优化与安全性有限。但是一大优势是,它生成的程序,所需的基础支持库,如MFC42.dll ,msvcrt.dll,msvcp60.dll,从Windows XP时代就已经是随着操作系统捆绑发布的。这对于一个中小型程序的发布来说,无异是非常便利的。

那么,有没有一种办法可以将两者的优势结合起来呢?

答案是肯定的!下面且听我慢慢道来。(以下步骤和过程都是本人亲自试验成功的)

有了以上这个想法之后,基于“VS2010是向前兼容的”这样一个大前提,我做了大胆的设想与尝试。

首先用VC6.0建立了一个标准的MFC对话框程序。
然后用VS2010打开刚才建立的这个工程(吧DSW文件拖放进VS2010),将工程转换为VS2010格式的vcxproj
接下来,打开“项目”菜单->“xxx项目属性”->“配置属性”->“VC++目录”,进行如下设置:
可执行文件目录:$(ExecutablePath)
包含目录:e:\PlatformSDK\Include;
       e:\PlatformSDK\Include\mfc;
        e:\PlatformSDK\Include\atl;
        e:\PlatformSDK\Include\crt
引用目录:留空
库目录:e:\PlatformSDK\Lib;e:\PlatformSDK\Lib\MfcLib_x86
源目录:留空
排除目录:留空
请重点注意,以上用的PlatformSDK使用的是 Windows2003 platform sdk(官方下载地址),并且假设Platform SDK安装在e:\PlatformSDK
库目录Lib\MfcLib_x86的内容是从VC6.0的目录“VC98\MFC\Lib”复制出来的MFC4.2的所有lib文件,以及从 “VC98\MFC\Lib”复制出来的MSVCRTD.lib MSVCRT.lib MSVCPRT.lib MSVCPRTD.lib

这样设置完之后,就可以编译了。通常编译都不会有问题。链接是一定会失败的。基本上类似以下一些符号链接错误:
error LNK2001:无法解析的外部符号 ___security_cookie
error LNK2001: 无法解析的外部符号 ___report_gsfailure
error LNK2001: 无法解析的外部符号 __except_handler4
error LNK2001: 无法解析的外部符号 __NLG_Notify
error LNK2001: 无法解析的外部符号 __NLG_Destination
error LNK2019: 无法解析的外部符号 @__security_check_cookie@4

难道到这里就放弃了??

那一定是不会的了。

仔细分析一下,就可以知道,完全相同的代码,完全相同的MFC和CRT的lib库,无法通过编译,就是因为:编译器在编译过程中,自动的为你的代码添加了一些具有不同功能的语句。在这些新添加的语句中,引用到了上述这些外部变量或者函数。

这是新的编译器的特性,这是我们无法去改变的。所以只能从另外一个方向来解决此问题:从VS2010自带的MFC库里面,找到并分离出来以上这些符号和内容。因为VS2010自己是能够完全正常编译、并链接成功的。

经过粗略定位,以上缺少的符号,全部是位于msvcr100.lib里面的。所以只要在其中找到我们所需要的符号,将其分离出来,并链接到我们自己的工程中即可。

具体繁琐的分析和尝试过程暂且不表,用排除法剪除不必要的模块间的各种依赖之后,将需要的模块文件(OBJ文件)添加到工程中,再次编译、链接,大功告成!

成果验证:
使用VS2010或VS2013,配合Windows2003 Platform SDK + 上述之VC6的各种MFC库文件,再加上附件中提供的crtnew.lib,进行编译连接。
用Depends实用程序,查看VS2010编译出来的EXE(用MFC共享DLL模式编译和构建),如果看到只引用了MFC42.dll和msvcrt.dll,而没有MFC100.dll和msvcr100.dll,则说明成功。如下图:

在这个过程中,用到的工具就是VS2010自带的Lib工具。基本操作步骤就是用Lib工具导出所有的msvcr100.lib里面的obj文件,一个一个的试。

我已经把所有需要的obj文件,打包整合为一个lib文件了。大家可以直接下载并使用。
使用时,仅添加以下两行代码即可:

#include "crtnew.h"#pragma comment(lib,"crtnew.lib") 

附带我最终的成果:  把上面的图片保存到本地。重命名为.zip文件,用Winrar即可打开并解压。

也许看到最后,各位在想,这样折腾有什么实际意义?
我只能说:
1、我喜欢VC6.0+MFC4.2这样的开发组合,但是VC6.0的IDE现在用起来真的是过于简陋了。用2013岂不是很爽?
2、MFC4.2生成的程序的依赖库是捆绑在操作系统里面的,这一优势在长期之内还是会继续保持。
3、可以在MFC4.2的基础上,使用新的C++语言特性。告诉你,可以直接使用Lambda表达式,你会心动吗?
4、新奇、好玩。。。。。。

更多
NB 对我这样的小白来说 08以后提供的漂亮的界面还是很需要的
对了,VC6的工程,转换为VS2010或VS2013工程之后,需要进行一些设置:
1、工程属性 -》C/C++ -》语言-》将wchar_t视为内置类型:设置为否
2、工程属性 -》链接器 -》高级-》映像具有安全异常处理程序:设置为否 (/SAFESEH:NO)
3、如果需要在C++异常里面,即try...catch...里面,捕获SEH异常(如非法地址访问、除零等),则需要在
    工程属性 -》C/C++ -》代码生成-》启用C++异常:设置为“是,但有 SEH 异常 (/EHa)”
4、添加对库文件crtnew.lib的引用

最后,如果在构建Release模式的程序的时候,出现了_CrtDbgReport相关的链接错误,则在你的代码中的任意地方,调用一次声明在crtnew.h中的CRTNEW_RESOLVE_CRTDBGREPORT_LINK_ERROR() 宏,即可解决此链接错误。

Nice!

其实SDK的推进, 比IDE和语法的落后, 更能逼迫程序员升级IDE.

VS2010生成的东西体积小、效率高,但是需要使用的基础支持库众多。为了发布一个几十k的小程序,还要一并发布msvcr100.dll msvcp100.dll MFC100.dll等等支持库。到目前为止这些库并不是随着操作系统一起发布的。

另外一种方法:使用MT、MTD编译完全不需要依赖这些库

感谢分享~~~

使用VS2010来进行MFC4.2的开发相关推荐

  1. VS2010 + QT5.2+ QT-VS-Addin1.2.2开发环境下载

    通过迅雷下载Visual Studio2010(大小2.5G) thunder://QUFodHRwOi8vZG93bmxvYWQubWljcm9zb2Z0LmNvbS9kb3dubG9hZC9FLz ...

  2. VS2010与.NET4系列 5.代码优化的Web开发轮廓

    今天讨论VS2010带来的"代码优化的Web开发"轮廓(Web Development (Code Optimized) profile)特性,就可以对VS进行配置,隐藏所见即所得 ...

  3. Win7环境下VS2010配置Cocos2d-x-2.1.4最新版本的开发环境(亲测)

    转至 http://blog.csdn.net/ccf19881030/article/details/9204801   写这篇博客时2D游戏引擎Cocos2d-x的最新版本为2.1.4,记得很久以 ...

  4. 在VS2010下利用vue开发团队项目

    开发一个项目,采用什么语言都可以,主要能熟练高效的开发都是合理的,这次我们采用vue来开发一个团队项目.在开始之前掌握vue的基本用法,如双向数据绑定.组件和路由等,建议先去看之前的文档(webpac ...

  5. 传智播客C/C++各种开发环境搭建视频工具文档免费教程

    传智播客作为中国IT培训的领军品牌,一直把握技术趋势,给大家带来最新的技术分享!传智播客C/C++主流开发环境免费分享视频文档中,就有写一个helloworld程序的示范.火速前来下载吧 所谓&quo ...

  6. SharePoint 常用开发工具

    SharePoint 2010 Platform 开发工具 1. Visual Studio 2010 VS2010 中集成了很多SharePoint 开发相关的工具和模板, 比如你可以直接在VS20 ...

  7. OpenNI的安装与开发环境配置

    OpenNI的安装与开发环境配置 博客分类: Kinect开发 Kinect OpenNI NITE SensorKinect Kinect作为新一代的体感设备,小斤就不多介绍咯,微软日前也发布了相应 ...

  8. win7 上配置openGL开发环境(配套openGL 超级宝典Super Bible 6th)

    此教程配套openGL 超级宝典super Bible圣经 第六版基于最新openGL4.3,但只有英语版 第六版比第五版(第五版目前有中文版基于openGL3.2)跨了一个时代,改变非常巨大,所以笔 ...

  9. UG二次开发加载dll,ufusr出错,Failed to load image

    使用VC6.0和VS2010做UG的二次开发,生成的dll在本地电脑上运行没有任何问题,复制到另外一台电脑上运行出现了错误,无法加载图像,ufusr报错.排除UG版本问题,排除32位/64位操作系统问 ...

最新文章

  1. c语言日期星期程序,C语言程序设计: 输入年月日 然后输出是星期几
  2. I/O多路复用——select
  3. 快速定位Product assignment block里对应的修改逻辑使用的function module
  4. caffe调用的一个例子
  5. mysql kingshard 扩容_如何用Go打造一个高性能mysql proxy
  6. 向量数量积公式_多法 | 向量数量积相关最值问题的常见处理方法
  7. 如何安装python3_linux如何安装python3
  8. figure字体 latex_Latex字体大小和样式
  9. 『码上行动-编程擂台』学员作品展(附源码)
  10. Android中使用Toast弹出信息提示时的用户体验优化
  11. Tesseract-OCR识别中文与训练字库
  12. react 实现图片的滚动缩放和按住鼠标左键移动图片效果
  13. SSL协议与数字证书原理
  14. java将多个文件转成压缩包下载
  15. 超漂亮的网页图文排版
  16. 稀里糊涂的解决了 cuda 和cudnn的安装以及conda安装pytorch出现的torch.cuda.is_available()为false的问题
  17. vue.js 回显textarea入的空格和换行
  18. 图像的表示方法和种类
  19. 小友VUI SDK 初探
  20. mysql函数中打印信息_mysql信息函数

热门文章

  1. 看板工具及协作脑图软件
  2. 解锁屏幕密码破解软件
  3. CMMI3级认证和CMMI5认证有什么区别?
  4. 好用的个人电子邮箱有哪些,电子邮箱怎么注册申请?
  5. 【金字塔Python量化学习笔记】01课:利用Python导出价格数据
  6. 2022北航敏捷软件工程 第一次博客作业
  7. Cadence设置——约束实现差分线动态等长
  8. python基础之python的历史(二)
  9. 【应用分享】实用工具箱v5.9
  10. ImageIO写图片输出到硬盘