“使用VS2010来进行MFC4.2的开发”之最终解决方案
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了“使用VS2010来进行MFC4.2的开发”之最终解决方案,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2921字,纯文字阅读大概需要5分钟。
内容图文
![“使用VS2010来进行MFC4.2的开发”之最终解决方案](/upload/InfoBanner/zyjiaocheng/1152/31519d29d2dd43d49fbc10c8c60dd38e.jpg)
本人层在2010年就做过这方面的简单研究(http://blog.csdn.net/boweirrking/article/details/5477062),那时候没有深入思考过这其中的原理,最终给出的方法也是未经完全测试的。这几天突发奇想,把这个问题又重新捡起来研究了一番,终于有了一个比较满意的结果。不敢独享,故拿出来与大家分享。
此文尤其推荐那些对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使用的是[b]Windows2003 platform sdk[/b]([url=http://www.microsoft.com/en-us/download/details.aspx?id=15656]官方下载地址[/url]),并且假设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模式编译和构建),如果看到只引用了MFC42u.dll和msvcrt.dll,而没有MFC100u.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现在用起来真的是过于简陋了。用VS2010或VS2013岂不是很爽?
2、MFC4.2生成的程序的依赖库是捆绑在操作系统里面的,这一优势在长期之内还是会继续保持。
3、可以在MFC4.2的基础上,使用新的C++语言特性。告诉你,可以直接使用Lambda表达式,你会心动吗?
4、新奇、好玩。。。。。。
以上所有这些操作或者说研究结果,在VS2013中,同样适用!!
原文:http://blog.csdn.net/boweirrking/article/details/24468825
内容总结
以上是互联网集市为您收集整理的“使用VS2010来进行MFC4.2的开发”之最终解决方案全部内容,希望文章能够帮你解决“使用VS2010来进行MFC4.2的开发”之最终解决方案所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。