`
ruilin215
  • 浏览: 1148087 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

一:保证原有的易语言源程序(.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),大致大代如下:

修改一个已有命令的参数时,不能随便修改数据类型,否则将违反兼容点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也会调用新支持库中的构造函数和析构函数,所以改变私有成员存储位置不会影响程序的执行。这种方案对代码的影响是非常大的,需要修改很多地方(所有对私有成员的读写),但是为了保证支持库的向下兼容性,这种付出是值得的。

分享到:
评论

相关推荐

    易语言模块保证显示.rar

    在易语言中,保证显示通常涉及到以下几个关键知识点: 1. **窗口管理**:易语言提供了丰富的窗口操作命令,如创建、关闭、移动、调整大小等,用于构建和管理用户界面。保证显示可能涉及到对这些命令的优化和处理,...

    易语言源码(桌面下雨)

    3. **兼容性**:易语言可以调用Windows API和其他动态链接库,能与各种硬件设备和软件系统进行交互。 4. **丰富的库支持**:易语言提供了大量的内置函数和模块,涵盖系统操作、网络通信、数据库访问等多个领域。 ...

    易语言用libusb0和USB设备通讯源码

    在易语言中使用libusb0进行USB通信,主要涉及到以下几个关键知识点: 1. **易语言基础**:首先,你需要熟悉易语言的基本语法和编程概念,如变量、常量、函数、结构等。易语言的命令以中文形式表示,如“创建句柄”...

    易语言 远程控制源码

    9. **兼容性测试**:由于易语言编译出的程序跨平台性相对较弱,因此在开发过程中需要考虑不同操作系统和网络环境下的兼容性问题。 通过深入研究这个远程控制源码,开发者不仅可以掌握易语言的基本语法和特性,还能...

    易语言屏幕差异传输优化

    - **兼容性**:不同操作系统、硬件配置下的表现可能有差异,需要考虑兼容性问题。 - **安全性**:数据传输过程中应考虑加密,防止数据被窃取或篡改。 - **性能优化**:如何在保证效果的同时,降低CPU和内存占用,...

    易语言发送组合按键消息源码

    在实际应用中,开发者需要注意兼容性问题,因为不同的操作系统或应用程序可能会对键盘消息的处理有所不同。此外,频繁或不当的发送组合按键消息可能会被安全软件识别为恶意行为,因此在编写自动化脚本时要谨慎。 ...

    【易语言】气球提示框自动代码生成

    在易语言中,创建气球提示框的代码生成涉及到几个关键知识点: 1. **易语言基础语法**:易语言采用中文词汇作为命令名称,如“创建窗口”、“设置文本”等,使得编程更符合中文阅读习惯。理解这些基本的语法规则是...

    易语言模块汉字处理.rar

    8. **兼容性处理**:由于不同操作系统、软件环境对汉字的支持程度不同,模块可能包含了一些兼容性处理代码,确保在各种环境下都能正确处理汉字。 9. **汉字加密与解密**:在信息安全领域,汉字的加密解密技术也很...

    易语言并行端口ESCPOS打印.zip

    1. 检查打印机的兼容性:并非所有打印机都支持ESC/POS命令,确保你的打印机支持这种协议。 2. 打印速度:不同打印机可能对命令的响应时间不同,适当调整命令发送的频率。 3. 错误处理:编写适当的错误处理代码,以...

    易语言源码易语言拦截文件读写源码.rar

    - **兼容性**:不同操作系统版本的系统调用可能存在差异,需要适配。 - **错误处理**:确保在处理异常情况时,能够正确释放资源,避免程序崩溃。 通过研究和实践这个易语言拦截文件读写源码,你可以提升在易语言...

    易语言源码易语言SC取超级权限源码.rar

    易语言SC取超级权限的源码可能涉及到以下几个关键知识点: 1. **权限检测与请求**:源码首先需要检查当前进程是否具有管理员权限。这可以通过Windows API函数如`IsUserAnAdmin`来实现。如果当前用户没有管理员权限...

    shell库模块

    5. **跨平台支持**:由于Shell命令在不同Unix/Linux系统间可能存在差异,该模块可能做了兼容性处理,使其能在多种环境下运行。 在实际应用中,开发者可以利用这个模块进行文件系统操作,比如自动化备份、文件同步、...

    易语言各种 HOOK源码

    4. **兼容性**:不同的系统版本和硬件环境可能会影响到HOOK的效果。在编写和测试HOOK代码时,应尽量考虑各种可能的运行环境。 通过研究和分析压缩包中的源码,我们可以深入理解易语言如何实现HOOK技术,以及在实际...

    易语言源码易语言屏幕笼罩源码.rar

    4. **坐标系统**:易语言的坐标系统是以左上角为原点,向右向下为正方向。在绘制覆盖层时,需要根据屏幕或窗口的尺寸来计算覆盖范围的坐标。 5. **定时器**:有时为了保持屏幕笼罩的实时性,我们可以使用定时器来...

    易语言超级列表框拖动多选

    7. **兼容性与性能优化**:考虑不同操作系统版本、屏幕分辨率和硬件配置下的兼容性问题,同时要优化代码以提高响应速度,避免在处理大量数据时出现延迟。 综上所述,"易语言超级列表框拖动多选"涉及到对易语言控件...

    易语言-软件自动升级例程

    10. **兼容性测试**:自动升级例程需在不同的操作系统和硬件环境下进行充分的测试,以确保在各种条件下都能正常工作。 以上就是"易语言-软件自动升级例程"涉及的主要知识点,通过学习和实践这个例程,开发者能够...

    易语言模块写屏幕.rar

    1. **屏幕坐标系统**:易语言使用像素坐标系统来定位屏幕上的位置,(0,0)代表屏幕左上角,X轴向右增加,Y轴向下增加。 2. **绘图函数**:如`写文本`用于在指定位置输出文本,`画线`用于绘制直线,`画矩形`用于绘制...

    易语言自动停靠窗口

    - **兼容性**:确保代码能在不同的操作系统和屏幕分辨率下正常工作,可能需要考虑窗口拉伸、多显示器等情况。 - **性能优化**:频繁的边界检测可能会对性能产生影响,可以考虑使用节流或防抖技术减少不必要的计算。 ...

    易语言斑马提示框

    5. **兼容性测试**:由于是自定义组件,需要在不同的操作系统和易语言环境下进行测试,确保其稳定性和兼容性。 6. **优化性能**:如果提示框频繁出现,应考虑优化其显示速度和内存占用,以提升用户体验。 通过深入...

    易语言源码多功能高级模块源码.rar

    - 兼容性:考虑到易语言的版本更新,模块应尽可能保持向后兼容,以免影响旧项目的运行。 总结来说,《易语言源码多功能高级模块源码》为易语言开发者提供了丰富的功能扩展,通过学习和应用这些模块,开发者能够提升...

Global site tag (gtag.js) - Google Analytics