我层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打开刚才建立的这个project(吧DSW文件拖放进VS2010),将project转换为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里面的。所以仅仅要在当中找到我们所须要的符号,将其分离出来,并链接到我们自己的project中就可以。



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





成果验证:

使用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于。这同样适用!!

版权声明:本文博主原创文章,博客,未经同意不得转载。

“采用VS2010至MFC4.2发育”最后溶液的更多相关文章

  1. Mex文件在VS2010中调试方法

    http://www.cnblogs.com/lukylu/p/4042306.html matlab里面无法单步调试mex函数,故需转到VS上面调试,这里采用VS2010. 参考网上很多人写的方法但 ...

  2. The EF 6.x DbContextGenerator templates are not available for VS2010

    问题描述:采用VS2010.MVC3.EF6.1.1,并使用Model first的方式建立数据模型,创建了edmx文件.在edmx文件设计界面上,通过点选鼠标右键,Generate Database ...

  3. 利用VS2010开发一个跳转页面aspx

    在开发项目的过程中,由于要集成Cognos的报表通过URL,但是Cognos报表的本身URL长度过程,那么此时就需要开发一个跳转的页面,下面我们就采用VS2010开发一个跳转的页面Default.as ...

  4. 摘: VS2010 C++ 调用 DLL (C++编写)

    一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用. 比较常见的例子是各种应用程序框架,如ATL. ...

  5. 微软企业库5.0 学习之路——第二步、使用VS2010+Data Access模块建立多数据库项目

    现在我就开始进入学习之路的第二步——Data Access模块,这个模块是企业库中被使用频率最高的模块,它很好的封装了数据库操作应用,为我们进行多数据库系统开发提供了便利,只需更改配置文件就 可以很快 ...

  6. VS2010制作dll

    一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,如ATL.M ...

  7. 【基于WinForm+Access局域网共享数据库的项目总结】之篇三:Access远程连接数据库和窗体打包部署

    篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库 ...

  8. ADSL自动更换IP地址源代码

    有些网站限制IP地址,什么一个IP地址只能一次之类的.特别是投票网址,为了防止刷票,限制1个IP只允许投票一次! 此程序采用Vs2010+C#开发,提供全部源代码!方便程序猿朋友二次开发! 可以后台运 ...

  9. 使用VC++ ATL实现iStylePDF的COM插件

    本文介绍了一种使用VC++ ATL(Active Template Library),利用ISPExtensibility接口,为 iStylePDF 加入功能简单的COM插件(addin),加入工具 ...

随机推荐

  1. 13-7-5 android Tabhost功能实现

    开始使用了一个Activity做界面切换,采用visible.gone写法,感觉太麻烦了. layoutHousehold.setVisibility(View.GONE); layoutCamera ...

  2. 强联通块tarjan算法

    http://poj.org/problem?id=1236第一问:需要几个学校存在软件,才能通过传递,使得所有的学校都有软件 用tarjan算法求出强联通分量后,将每个联通分量缩成一个点,那么问题1 ...

  3. HTML5 CSS3 诱人的实例 : 网页载入进度条的实现,下载进度条等

    今天给大家带来一个比較炫的进度条,进度条在一耗时操作上给用户一个比較好的体验,不会让用户认为在盲目等待,对于没有进度条的长时间等待,用户会任务死机了,毫不犹豫的关掉应用:一般用于下载任务,删除大量任务 ...

  4. 图像特效——摩尔纹 moir

    %%% Moir %%% 摩尔纹 clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Algo ...

  5. ffplay for mfc 代码备忘录

    在上传一个开源播放器项目ffplay for mfc.它会ffmpeg工程ffplay媒体播放器(ffplay.c)移植到VC环境,而使用MFC做一套接口.它可以完成一个播放器播放的基本流程的视频:解 ...

  6. Ajax的get和post两种请求方式区别

    Ajax的get和post两种请求方式区别 (摘录):http://ip-10000.blog.sohu.com/114437748.html 解get和post的区别. 1. get是把参数数据队列 ...

  7. ROM签名脚本[原创]

    下面的代码是bash脚本来的.需要保存为*.sh后序. # !/bin/bash #usage: signapk.sh [-hs] [zipfile-unsigned | update.zip] #A ...

  8. char *详细指针

    我前段时间写的char*和char[]差额.今char*做一个更深入的了解 1:char像指针和其他指针,也定义一个地址,例如int*它定义了一个堆栈,4字节,char*之,现在写一段代码 #incl ...

  9. 《反project核心原则》说明

      致亲爱的中国读者: 大家好 !我是<逆向project核心原理> 作者 李承远(ReverseCore). (韩文博客地址:www.reversecore.com) 首先.非常高兴我的 ...

  10. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...