总结升级易语言支持库保证向下兼容性

易语言支持库升级之后,要保证向下兼容性,主要是做到以下几点:

一:保证原有的易语言源程序(.e)能正常打开(兼容点1)、正常编译(兼容点2)、编译结果正确(兼容点3);

二:保证原有的易语言程序(.exe)能正常运行(兼容点4)、运行结果正确(兼容点5)。

这里说的“原有的易语言源程序”和“原有的易语言程序”是指,替换新版支持库文件之前,使用旧版支持库编写的易语言源程序,和使用该源程序编译生成的可执行程序。

本文主要就此问题结合具体情况进行分析和总结。

一,为支持库增加一条命令

新增加的命令,必须放在所有原有命令的后面,否则将违反兼容点2和4,更无法保证兼容点3和5。这是因为,在源程序和EXE中,记录的都是命令的索引,一旦在中间插入一条命令,将导致后面的命令索引全变了,进而导致非常严重的错位问题。只要记住,总是在所有命令的最后添加新的命令,就不会引入兼容性问题。具体到数据类型的成员方法,与上面的分种一致,因为它也是使用支持库中唯一的全局函数表的,但这里引入了一个新的细节,有一个LIB_DATA_TYPE_INFO.m_pnCmdsIndex 用于指定方法在全局函数表中的命令索引,所以通过它可以调整各成员方法的顺序,这种做法通常不会引入兼容性问题。

二,为命令增加一个参数,或修改命令的参数

新增加的参数,必须放在所有参数的后面,否则将违反兼容点2,3,4,5;必须允许省略该参数(AS_DEFAULT_VALUE_IS_EMPTY)或该参数有默认值(AS_HAS_DEFAULT_VALUE);同时在编写代码读取该参数值时要小心,须判断nArgCount和MDATA_INF.m_dtDataType(否则违反兼容点4,5),大致大代如下:

void fn_Global_SetWindowRgn (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf) { int nArg1 = pArgInf[0].m_int; int nArg2 = pArgInf[1].m_int; //假设第三个参数是新版添加的参数 int nArg3 = 0; if(nArgCount > 2 && pArgInf[2].m_dtDataType != _SDT_NULL) { nArg3 = pArgInf[2].m_int; } //... }

修改一个已有命令的参数时,不能随便修改数据类型,否则将违反兼容点2,3,4,5,要改也只能改成通用型(同时在代码中根据参数传递来的真实类型(MDATA_INF.m_dtDataType)做相应处理)。参数的名称和说明,因为都是文本,可以随便改,有会有兼容性问题,但不要改的意思与原来相反哦(排除原来失误写反了的情况),改变参数语义往往会导致代码改动,进而导致违反兼容点5。

三,为窗口组件增加属性

新增加的属性,必须放在已有属性的后面,否则违反兼容点4,5,因为易语言运行时是通过属性的索引读写属性值的。然后在序列化属性值时,提高一个版本号,读取时先判断版本,旧版序列化出的数据少,就不能多读。在此提示,序列化属性值时,一定要先写出版本号,如果没有版本号,后续的兼容性问题多多。

(TODO:这一段另成一文)但即使有了版本号,使用不当,也会导致升级时的麻烦,我前一段就遇到过,代码有这么一句:if(dwVersion > CURRENT_VER) return FALSE; 版本号比现在能处理的版本号大,出现在什么情况呢,用旧版支持库打开/运行用新版支持库编译的易源程序/程序。返回假是合理的(毕竟不能完全处理这种情况),但是比较粗暴(这意味着无法用旧版支持库打开用新版支持库编写的源程序/程序,这不是向下兼容的问题,是向上兼容的问题),如果能尽量读取,放弃不能识别的数据,温和的处理,效果更好。简单的把这条判断语句删除,有用吗?当然没用,旧版的支持库已经在用户手上了,编译结果是确定的,你的改动只能体现在新版中,而对旧版无能为力。解决这个问题需要技巧,我采取的方案是,版本号不升反降!即,把CURRENT_VER减小,那么我序列化出的数据,版本号比以前还小,旧版支持库里的那条判断(if(dwVersion > CURRENT_VER))就不起作用了,嘿嘿。新的序列化数据版本更低,但写的数据更多,需要担心旧版支持库读出多余的数据来吗?当然不用,旧版支持库的编译结果和运行结果是确定的。只要新版支持库中识别出这种情况,不要因为版本号小就认为是旧版就行了,同时后续升级的方便,再引入一个新的版本号,存到原有序列化数据的最后,这样再次升级时直接判断新版本号就行了,原有的那套版本号停止使用。这一段有点乱,需整理。

四,为数据类型增加私有成员

如果某个数据类型已经有了一个或多个私有成员,升级时需要增加一个私有成员,该怎么办,直接在LIB_DATA_TYPE_ELEMENT 数组中添加一项吗?不行!这样将违反兼容点4,5,因为对象所占用内存是在由EXE分配的,旧的EXE中只为对象分配了N个成员的空间,而新库要去访问第N+1个成员,不就发生内存访问越界的错误了吗?解决方案是,把原来的N个私有成员连用新增加的成员,集中存储到一块新分配的内存中,然后把这个内存地址存储到原有的第一个私有成员位置上(原有的其它成员位置废弃不用)。因为即使是旧EXE也会调用新支持库中的构造函数和析构函数,所以改变私有成员存储位置不会影响程序的执行。这种方案对代码的影响是非常大的,需要修改很多地方(所有对私有成员的读写),但是为了保证支持库的向下兼容性,这种付出是值得的。

(0)

相关推荐

  • 易语言支持库的安装说明

    警告:为避免支持库在使用过程中发生错误及不稳定情况,请不要反编译,修改及破解支持库文件. 易语言及eyuyan是易语言公司在中国的注册商标. 本说明书中提到的公司名和产品名是相应公司的商标或注册商标. 一.系统要求 IBM PC AT或兼容机 Windows95或更高版本 支持库要求的最低易语言版本 注意:某些支持库必须有其他相应版本的软件支持才能达到预期效果. 二.支持库说明: 注意:所有支持库在发布之前已经过详细的测试,在正常环境下可以稳定使用,如果出现运行错误情况,用户可采用以下措施中的一

  • 易语言EXUI支持库制作红色简约网络验证UI界面的代码

    红色简约网络验证UI界面 .版本 2 .支持库 exui .支持库 spec .程序集 窗口程序集_启动窗口 .程序集变量 用户名, 文本型 .程序集变量 状态码, 文本型 .子程序 _头像_框架_鼠标左键按下 .参数 xy坐标, 整数型 .参数 wp, 整数型 _启动窗口.发送信息 (161, 2, 0) .子程序 _选择夹EX1_鼠标左键按下 .参数 xy坐标, 整数型 .参数 wp, 整数型 _启动窗口.发送信息 (161, 2, 0) .子程序 _登录_输入账号_鼠标左键按下 .参数 x

  • 易语言去除多余的支持库方法

    易语言不得不说是一个很方便的编程工具,其强大的支持库.模块能快速的帮助我们编程,不过,一般完整版的易语言都带了很多的支持库,我们其实不需要,反倒让我们找我们需要的支持库的时候感到麻烦,怎么去除多余的支持库呢? 1.方法一: 比较推荐的一种方法,临时性的去除,想用的时候还可以加载出来. 打开易语言. 2.点击上方菜单中的工具,选择弹出菜单里面的支持库配置,如图: 3.会弹出一个窗口,里面会列出你电脑里面保存的各种支持库,可以看到有好多种: 4.把你不想用的支持库前面的对扣去掉,易语言就不会加载这个

  • 易语言使用office工具支持库中的宏命令

    宏 到底什么是宏呢? 我们把那些能自动执行某种操作的命令统称为"宏". 宏也是一种操作命令,它和菜单操作命令都是一样的,只是它们对数据库施加作用的时间有所不同,作用时的条件也有所不同.菜单命令一般用在数据库的设计过程中,而宏命令则用在数据库的执行过程中.菜单命令必须由使用者来施加这个操作,而宏命令则可以在数据库中自动执行. 在OFFICE中,有很多种基本宏操作,这些基本操作还可以组合成很多其他的"宏组"操作.在使用中,我们很少单独使用这个或那个基本宏命令,常常是将这

  • 解决易语言支持库配置出错退出

    Windows2003系统默认启用了"数据执行保护" 所以我们的易语言无法进行支持库配置,常见的表现为:执行支持库配置时候,程序意外退出,检查系统日志,没有任何日志存在. 比较好的解决办法为: 1.右击"我的电脑"-"属性"-"高级"-"性能"下的"设置"-"数据执行保护" 2.点击"添加",选择易语言的主程序位置,例如:C:\Program Fi

  • 易语言支持库简单安装加载添加

    1,首先,准备好欲安装的易语言支持库文件(fne.fnr或lib为后缀名等文件) 2,接下来,有必要对易语言支持库的文件做重要讲解.要安装支持库之前,先要弄明白易语言安装目录下的两个文件夹:lib和static_lib.lib文件夹内存放的以.fne或.fnr等后缀名的支持库文件,这里我们暂且称之为"普通库文件";static_lib文件夹内存放的"静态库文件",支持库文件名中包含"_static"字符且以.lib为后缀名的文件,这种文件可以支持

  • 解决打开易语言配置支持库全选后崩溃问题

    1:首先鼠标右键点击"我的电脑(计算机)",点击属性(win8系统右击左下角的传统图标就能打开控制面板) 左上角有个"高级系统设置"弹出后选择 高级 点击"性能"那个板块的"设置..." 点击上面的"数据执行保护" 选"为除下列选定程序之外的所以程序和服务启用 DEP(U)" 点击"添加" 然后看看你的易语言在哪个目录,添加进去就OK 2:如果还是出现运行停止或崩溃请

  • 总结升级易语言支持库保证向下兼容性

    易语言支持库升级之后,要保证向下兼容性,主要是做到以下几点: 一:保证原有的易语言源程序(.e)能正常打开(兼容点1).正常编译(兼容点2).编译结果正确(兼容点3): 二:保证原有的易语言程序(.exe)能正常运行(兼容点4).运行结果正确(兼容点5). 这里说的"原有的易语言源程序"和"原有的易语言程序"是指,替换新版支持库文件之前,使用旧版支持库编写的易语言源程序,和使用该源程序编译生成的可执行程序. 本文主要就此问题结合具体情况进行分析和总结. 一,为支持库

  • 实现易语言界面库

    易语言IDE自带了界面库,是通过"支持库(DLL)"来提供的.脱离这些库,你想写自己的界面程序? 易毕竟不是C.没有Win32 SDK .从常量到API声明.光这些工作就能把你累个差不多. 以前也写过一个界面库.不过自己不是很满意.易语言写界面库.首要考虑的是效率问题.当然可以用内联汇编.不过易语言的内联汇编只能是置入机器码.因为填入的是机器码,当然不能链接,因此不能访问全局变量.也不能访问外部函数,包括用汇编调用API.巨麻烦!因此,填入的机器码最多也就能访问局部变量和传递进来的参数

  • 易语言编程基础数据类型变量及子程序

    目录 一. 易语言的数据类型 基本数据类型分为: 基本数据类型中的数值类型有包含了: 程序:数据类型转换 特殊数据类型 通用型数据类型: 库定义数据类型: 自定义数据类型: 内部组件数据类型: 二. 易语言中的变量 三. 易语言的资源表 四. 易语言中的运算符 五. 易语言中的子程序 一. 易语言的数据类型 易语言的数据类型可以分为基本数据类型和特殊数据类型 基本数据类型分为: ①   数值型 ②   逻辑型 ③   日期时间型 ④   文本型 ⑤   字节集型 ⑥   子程序指针型 基本数据类

  • 零基础易语言入门教程(五)之逻辑型数据类型

    在上篇文章给大家介绍了零基础易语言入门教程(四)之数据类型,上篇针对数值到文本类型知识,今天给大家介绍下逻辑型数据. 具体方法和步骤如下所示: 1.逻辑型数据非真即假: 首先申请一个局部变量(A)类型为:逻辑型,编写代码为:A=1>2,那么输出的结果应为假,因等于1是赋值与1,然后代码中写道1大于2,所以这是假的,见下图所示: 2.关系运算符: 在上图大家需注意的是,A后面的等于号是赋值符号,而后面的≥,≠,<一些符号则是关系运算符. 关系运算符不是非要设置变量给其赋值才可以使用的,同样他可以

  • 易语言的优势总结

    总结易语言的特点如下: 1.全中文支持,全部自主知识产权 2.拥有自己的编译器 3.跨平台编程 4.拥有自己的数据库系统,且支持访问现有所有数据库. 5.内置专用输入法,支持中文语句快速录入 6.全可视化编程 7.中文本土化特色的支持 8.多种语言支持 9.可以与其它编程语言协作开发 10.支持世界先进编程技术 11.人机界面友好,集成化程序设计界面 12.代码即为文档.源程序格式统一 13.超强的程序编辑器 14.多媒体功能支持强大 15.完善的网络.端口通讯和互联网功能支持 16.支持调用A

  • 易语言发信写法讲解

    众所周知,易语言支持库自带"连接发信服务器()","断开发信服务器()"命令... 但经过实践应用,连接与断开存在不稳定因素,目前暂不得知原由..会导致发信25端口占用卡住,最终切断全部网络连接.. 经过查阅资料,得出另外一种发信方式,其原理是用客户组件,连接smtp服务器,一步一步判断返回值并发送数据..具体参看源码! .版本 2 .支持库 shell .支持库 spec .子程序 发送邮件通知 .参数 主题内容, 文本型 .局部变量 返回数据, 文本型 客户1.

  • 易语言动态链接库制作详解

    一.关于易语言 DLL 从易语言 3.6 版开始,已经能够支持对DLL动态链接库的开发, 编译出的DLL是标准的DLL,和其他编程语言生成的标准 DLL 的调用方法相同.易语言编写出的DLL,在非独立编译exe时只需要DLL文件随应用程序一起发行,而独立编译 exe 时无需将 DLL 文件随应用程序一起发行. 二.新建易语言DLL程序 新建一个易语言程序,然后选择 "windows动态链接库"图标,易语言就会自动创建 出编写态连接库的代码区(程序集) 创建完毕就可以在代码区里编写DLL

随机推荐