(七):处理MFC
(一):简单介绍
为了可以在一个Winelib应用中使用MFC,你须要首先使用Winelib又一次编译MFC。
在理论上,你应该为Windows的MFC编写一个封装(怎样编写在后面介绍)。可是,在实践中,对MFC来说。可能不是一个真正的解决方案:
数量巨大的API使得编写封装的工作量非常大
进一步说。MFC包括大量的API。这些API在制作封装的时候处理起来是非常复杂的。
即使你编写了封装,你也须要去改动MFC的头文件以使编译器不会堵塞他们。
在你应用中的非常大一部分MFC代码是以宏的形式展现的。这就意味着为了可以编译基于你的应用的MFC程序,须要有很多其它的头文件须要去处理。
这就是为什么这里须要专门帮助你来使用Winelib编译MFC程序。
(二):法律问题
这一小节的目的就是讲述一下潜在的法律问题。这个是一定要注意的。
在编译你的程序期间,你会从若干个源代码链接你的代码:你的代码,Winelib代码。微软的MFC代码和可能引入的其它代码。所以,你一定要确定遵守全部源代码的协议。
你被同意的和不被同意的都会影响你怎样编译而且发行你的程序。
举个样例,假设你在GPL或者LGPL协议下发行你的代码,你不能使用MFC。由于这些代码不同意你做开放。
有一个解决的方法-在你的代码的协议中。你可以为MFC库做一个除外说明。
Wine/Winelib发行是依照GNU的LGPL协议发行的。
查看协议来获取一些在源代码改动和发行方面的限制。大体上,他可能会满座不论什么类型程序的限制。
另一方面,MFC是以一个非常严格的协议发行的。当使用MFC的时候,有三个方面你须要知道。
首先,在你的计算机上你必须依法获取MFC源代码。MFC源代码是作为Visual Studio的一部分发行的。
Visual Studio的许可证书表明他是一个单一的项目。不能被分解成一个个的组件。所以最干净的办法就是购买Visual studio,然后通过Wine或者是在一个双启动Linux中安装他。
然后,你须要检查你是否被同意在一个非微软的操作系统上又一次编译!这也是随着MFC的版本号而变化的。以下是在VS6.0中的MFC的部分许可证:
1.1 通用许可证。微软授予你作为个人,非排他性许可证来编译和复制软件产品用于设计,开发和測试你的与微软操作系统产品结合的软件产品的唯一目的。
所以这就意味着你不能使用这个许可证来为Winelib编译MFC。幸运的是,VS6.0服务包3许可证,以下所列部分:
1.1 通用许可证。
微软授予你作为个人,非排他性许可证来编译和复制软件产品用于设计。开发和測试你的软件产品的唯一目的。
所以在这个许可证名下,看上去我们可以编译用于Winelib的MFC。
最后,你必须检查你是否拥有公布MFC库的权利。检查许可证的”公布和你的公布权限”部分。许可证指出,假设没有调试信息。而且假设你公布一个向MFC库中提供重要功能的应用的时候,你唯独权利公布MFC库的二进制版本号。
(三):编译MFC
这里有一些MFC和Winelib编译的建议:
我们推荐在--interactive模式下执行winemaker来为MFC和ALT部分指定正确的选项(获取正确的包括路径。不要考虑以MFC为基础的MFC,将他编译成库而不是可执行文件)。
然后,当编译MFC的时候。你肯定须要一定数量的_AFX_NO_XXX宏。可是这些是不够的,另一些其它的事情你须要去做,包括'#ifdef-out'。举个样例,
Wine的richedit库支持不是非常好。
以下是我使用的一下AFX选项:
#define _AFX_PORTABLE
#define _FORCENAMELESSUNION
#define _AFX_NO_DAO_SUPPORT
#define _AFX_NO_DHTML_SUPPORT
#define _AFX_NO_OLEDB_SUPPORT
#define _AFX_NO_RICHEDIT_SUPPORT
你也须要传统的CMonikerFile,OleDB,HtmlView等。
我们建议使用Wine的msvcrt头(-isystem $(WINE_INCLUDE_ROOT)/msvcrt),尽管这意味着你必须要临时禁止winsock的支持(使用#ifdef,将他排出inwindows.h).
你应该使用版本号不低于2.95的g++编译器.g++ 2.95不支持未命名的结构体,可是最新的版本号是支持的,这有非常大的帮助.以下是值得一下提的一下选项:
- -fms-extensions(帮助获取很多其它代码来编译)
- -fshort-wchar -DWINE_UNICODE_NATIVE(Unicode支持)
- -DICOM_USE_COM_INTERFACE_ATTRIBUTE(使COM代码工作)
当你第一次编译到链接阶段的时候,你将会得到非常多没有定义的符号错误.为了纠正这些错误,你必须要返回源代码,然后使用#ifdef来排除很多其它的代码直到你到达闭包状态 .有非常多文件你不须要去编译.
或许有一天我们将会有一个现成的makefile文
(七):处理MFC的更多相关文章
- MFC编程入门
一. 什么是MFC? 如果你要建立一个Windows应用程序,应该如何下手? 好的开端是从设计用户界面开始. 首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象.Windows用 ...
- MFC深入浅出读书笔记第二部分2
第七章 MFC骨干程序 所谓骨干程序就是指有AppWizard生成的MFC程序.如下图的层次关系是程序中常用的几个类,一定要熟记于心. 1 Document/View应用程序 CDocument存放 ...
- 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9344721 作者:七十一雾央 新浪微博:http:// ...
- MFC控件编程之 按钮编辑框.静态文本的使用,以及访问控件的七种方法.
MFC控件编程之 按钮编辑框.静态文本的使用以及访问控件的七种方法. 一丶按钮.静态文本的通用属性. 他们都有一个属性.就是可以输入标题内容.以及可以自定义控件ID. 创建一个MFC Dlg对话框. ...
- 通过编写串口助手工具学习MFC过程——(七)添加Tab Control控件
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- 深入浅出MFC——MFC多线程程序设计(七)
1. 从操作系统层面看线程——三个观念:模块(MDB).进程(PDB).线程(TDB) 2. “执行事实”发生在线程身上,而不在进程身上.也就是说,CPU调度单位是线程而非进程.调度器据以排序的,是每 ...
- 【转】MFC 迅雷七窗体特效,使用DWM实现Aero Glass效果
从Windows Vista开始,Aero Glass效果被应用在了Home Premium以上的系统中(Home Basic不具有该效果).这种效果是由DWM(Desktop Window Mana ...
- MFC学习(七) 单文档程序
1 MFC单文档程序的主要类 (1)文档类(Document) 即应用程序处理的数据对象,文档一般从 MFC 中 CDocument 中派生.CDocument 类用于相应数据文件的读取以及存储 Cv ...
- [MFC] 高仿Flappy bird 桌面版
这是今年年初做的东西,一直没有时间整理,现在拿出来分享下~ 目录 开发背景 开发语言及运行环境 效果展示 游戏框架说明 游戏状态及逻辑说明 经典算法说明 重量级问题解决 开发感想 一.开发背景: fl ...
随机推荐
- BUG总是存在的
遇到了一个Bug 前段时间,添加功能的时候,在其他页面的Html中(django)的python调用{{}}中不小心按多了一个空格. 这导致这个值在读取的时候,读取多了一个空格:split的时候,多分 ...
- PostgreSQL 在Ubuntu下如何修改postgres默认密码
Step1: 切换用户为postgres sudo su postgres Step2: 用postgres连接postgreSQL psql -U postgres Step3: 修改postgre ...
- Web Component
前言 Web Component不是新东西,几年前的技术,但是受限于浏览器兼容性,一直没有大规模应用在项目里,直到现在(2018年年末),除IE仍不支持之外,其它主流浏览器都支持Web Compone ...
- TensorFlow下利用MNIST训练模型并识别自己手写的数字
最近一直在学习李宏毅老师的机器学习视频教程,学到和神经网络那一块知识的时候,我觉得单纯的学习理论知识过于枯燥,就想着自己动手实现一些简单的Demo,毕竟实践是检验真理的唯一标准!!!但是网上很多的与t ...
- c++容器加迭代器和python装饰器的对比
c++利用对象实现简单数据的测试: class TestDataEmptyArray { public: static vector<int> get_array() { std::vec ...
- vim技巧3
yyp复制当前行到下一行ddp剪切当前行到下一行cw:删除当前单词并进入插入模式xp:交换当前字符和右边字符s:删除光标所在的字符并进入插入模式I:在行首开始输入文字并进入插入模式A:在行尾开始输入文 ...
- Maven实战(八)——常用Maven插件介绍(下)
我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...
- Alpha冲刺——序言篇(任务与计划)
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺--序言篇 团队名称 待就业六人组 一.代码规范 详见项目在线文档:项目代码规范 二.本次冲刺任务与计划 任务 内容 时间 第一天 ...
- python之封装
封装的主要原因是保护隐私,隔离复杂度 封装分为两个层面: 第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称精简,我们只能用类名.或者obj.的方式去访问里面的名字,这本身就是一种分装 ...
- 2018年东北农业大学春季校赛 I-wyh的物品(二分查找)
链接:https://www.nowcoder.com/acm/contest/93/I来源:牛客网 题目描述 wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个, ...