当前位置: 首页 > news >正文

MFC的使用——在共享DLL中使用MFC、在静态库中使用MFC

前言

我们在使用Microsoft Visual Studio软件(也就是我们常常说的VS)时,其中项目属性中有一项叫做“MFC的使用”,里面包含有不同的设置,会影响我们所编写的程序的使用,今天我就遇到了这个情况,我们一起来总结一下,避免犯下相同的错误。

内容

昨天写了一个小程序,使用的是MFC应用程序的工程,工具的版本为VS2013,工程参数都是默认的,其中有一项设置叫做“MFC的使用”,默认设置是“在共享DLL中使用MFC”,我虽然看到了但是没有放在心上,编码期间解决了一个MFC使用多字节字符集报错的问题,此处不展开,后续再表,就这样程序编写完成,非常完美!交给了一个叫做“小闪电”的用户,然后她怀着万分激动地心情拿到公司电脑一使用,结果报错了!!!

这里写图片描述

“无法启动此程序,因为计算机中丢失mfc120.dll。尝试重新安装改程序以解决此问题。”,看到这个问题我首先想到的就是动态链接库的事情,因为我使用的是VS2013正好使用的是12.0版本的库文件,所以说应该是目标机上没有这个库,当然可以手动下载这个库文件,添加至“C:\Windows\System32”目录,但是在程序开发工程中,你无法要求所有的用户都会这样做,只能从自身找解决方法了。

当然我也仔细查了一下这个叫做“MFC的使用”的参数,它其实包括3个选项,具体如截图:

这里写图片描述

  1. 使用标准Windows库   
  2. 在共享DLL中使用MFC    
  3. 在静态库中使用MFC

这三种当然有着不同的意义:

  • 第一种顾名思义,是使用WINDOWS SDK API库,不使用MFC类。话说一个MFC应用程序不使用MFC类是个什么情况,一开始我也想不通,后来我新建了一个MFC应用程序的工程,然后把这这项参数填成这一种,然后程序编译失败,具体错误如下图,这就说明问题了,如果是MFC工程必须选择第二项或者第三项,而第一项“使用标准Windows库”是为非MFC工程准备的(不知理解是否正确,请大神指教)。

这里写图片描述

  • 第二种指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件。这就是我的程序一开始选择的选项,要求目标计算机中至少要包含“mfc120.dll”库文件,否则无法使用。

  • 第三种是将DLL中的相关代码写进EXE文件中,文件较大,但是可以在没有相关DLL的机器上运行。个人感觉程序测试期间使用这个选项应该比较好,起码可以保证程序的正常运行。

总结

  • MFC应用程序的工程,关于“MFC的使用”属性,应该选择“在共享DLL中使用MFC”或者“在静态库中使用MFC”。
  • “使用标准Windows库” 选项只能用在非MFC工程中,如果用在MFC工程会导致代码编译报错。
  • “在共享DLL中使用MFC” 选项生成的程序可执行文件比较小,但是要求目标机器必须装有必要的库文件。
  • “在静态库中使用MFC” 选项生成的程序可执行文件几乎所有的Windows都可以执行,但是程序较大一些,其中包含必要的库文件,可以基本保证在别的机器上正常运行。

相关文章:

  • 我的KMP实现
  • SVN:Update item to this version和Revert to this version区别
  • CSDN博客:使用Markdown编辑器使图片居中显示
  • UE4项目运行时显示鼠标指针
  • UE4引擎中类的命名规则
  • 排序算法系列之(零)——排序初体验
  • 光棍节程序员闯关秀-解密
  • Mysql批量删除数据库
  • UE4中的反射机制
  • 排序算法系列之(一)——选择排序清新脱俗的一面
  • C++11(一):在类的定义时初始化非静态变量
  • C++11(二):lamda表达式
  • 可能错误使用了‘offsetof’宏
  • 警告:对 NULL 对象非静态数据成员‘XXX::xxx’的访问无效
  • git tag常用操作
  • @angular/forms 源码解析之双向绑定
  • [数据结构]链表的实现在PHP中
  • 2017-09-12 前端日报
  • Apache Zeppelin在Apache Trafodion上的可视化
  • css的样式优先级
  • Git学习与使用心得(1)—— 初始化
  • golang中接口赋值与方法集
  • JavaScript服务器推送技术之 WebSocket
  • js 实现textarea输入字数提示
  • js算法-归并排序(merge_sort)
  • Magento 1.x 中文订单打印乱码
  • Vim 折腾记
  • Vue官网教程学习过程中值得记录的一些事情
  • 电商搜索引擎的架构设计和性能优化
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 讲清楚之javascript作用域
  • 理清楚Vue的结构
  • 前端学习笔记之观察者模式
  • 前嗅ForeSpider采集配置界面介绍
  • 使用common-codec进行md5加密
  • 线上 python http server profile 实践
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ###C语言程序设计-----C语言学习(3)#
  • ###STL(标准模板库)
  • #AngularJS#$sce.trustAsResourceUrl
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (pytorch进阶之路)扩散概率模型
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (区间dp) (经典例题) 石子合并
  • (三分钟)速览传统边缘检测算子
  • (循环依赖问题)学习spring的第九天
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)人的集合论——移山之道
  • (轉)JSON.stringify 语法实例讲解