前言
刚看到论坛一位小伙伴问了一下“易包是什么”,于是我也去搜集资料了解了一下。据我了解到的,大家对易包的解释为:易语言的dll;同时大家认为易包不好用或者不用易包的原因都是说:易包不支持静态编译。这两点就是我从搜索到的资料所了解的两点。
在我亲自操作时,确实发现易包不支持静态编译,但是易包的一些特性确实是挺有意思的。那么如果真的想要使用怎么办?
经过我的探索,易包虽然不可以静态编译,但是可以独立编译,静态编译和独立编译是不一样的,但是最后运行的效果实际上是差不多的,并不影响使用。因此我打算将易语言易包更加深入了解一些,还有一些网上资料有些未能强调到的地方写写,旨在提高对易包的理解,相信大家了解到这些内容后定能设计出出色的程序。
易包的使用
首先谈谈易包的使用。我最先了解到易包的是一个易语言贴吧的一个讨论帖子,楼主给出了一些简单是使用用例,我在这里重新总结一下,如果哪位大佬感兴趣,可以去原帖看看。原帖地址
这个帖子做了两件事,一是介绍什么是易包,用一句话来说就是:易语言的DLL。一是易包的使用。此外,易包的使用还分为了易包的基本命令,易包的调用和几个小例子。
1. 易包的5条基本命令
以下内容在“系统核心支持库-》易包”下面,更加详细的请自行打开易语言查看。
(1)载入易包文件
如图所示,要传入易包的文件名和易包名称,尤其是易包名称在以后的使用会更加的方便。官方是这么写这条命令的
预先载入所指定的易包文件(如果文件名未提供后缀则默认为".epk"),防止系统以后在程序中调用到该易包内公开子程序时采用默认方法自动载入.成功返回真,失败返回假.所载入易包不需要刻意去释放,在程序退出时会自动被释放.本命令不支持在多线程环境和静态编译模式下使用,注意本命令不会对所提交易包数据进行过多校验,用户必须执行保证该数据的正确性.本命令为高级命令。
(2)载入易包数据
如图所示,要传入易包名称和字节集的易包数据,官方是这么写这条命令的
预先载入所指定易包的数据,防止系统以后在程序中调用到该易包内公开子程序时采用默认方法自动载入.成功返回真,失败返回假.所载入易包不需要刻意去释放,在程序退出时会自动被释放.本命令不支持在多线程环境和静态编译模式下使用,注意本命令不会对所提交易包数据进行过多校验,用户必须执行保证该数据的正确性.本命令为高级命令。
(3)卸载易包
这条命令只需传入易包名称即可实现卸载易包操作。返回逻辑型。
卸载已被载入的指定名称的易包,成功返回真,失败返回假.本命令不支持在多线程环境和静态编译模式下使用.执行本命令前,必须确保以下几点,否则后果无法预测:
1.在当前子程序执行堆栈中不存在所指定易包内的任何子程序;
2.所指定易包符合可卸载规范:任何使用文本/字节集/数组直接常量数据对易包公开子程序以显式或隐式参考方式传递进来的参数进行赋值时,都必须使用"复制常量"方法将该数据脱离常量状态,避免本易包被动态卸载后,外部调用程序引用该常量数据出错.
另外,最好所指定易包内加载的所有窗口均已经被关闭.本命令为高级命令。
(4)易包是否被载入
这条命令只需传入易包名称即可检测易包是否被载入。返回逻辑型。
返回所指定名称的易包是否已经被载入.本命令不支持在静态编译模式下使用。本命令为高级命令。
(5)复制易包常量
本命令的主要作用是将易包内的常量转为变量
本命令仅在编译易包时有效,用作根据所提供的常量数据建立返回对应的非常量数据.在对易包公开子程序以参考方式传递进来的参数变量使用文本/字节集/数组三类常量进行赋值时,都必须先使用本命令进行转换,以避免所处易包被使用卸载命令释放后导致外部程序引用到非法的常量地址。本命令为高级命令。
2. 易包的调用方式
首先,大佬是这么写的
在我运行时就不行了。首先我先贴出我的程序
- 易包内容
- 易包测试的内容
在我运行的时候则直接报错了
看到错误提示为:无法找到“易包.子程序1”,于是我将子程序名那里改成了易包内的子程序名称,程序就可以正常运行了。
可以看到,在这么一个子程序里面
子程序名 |
返回值类型 |
公开 |
易包 |
备注 |
子程序1 |
- |
- |
易包名 |
- |
易语言是通过“易包名.子程序1”来调用的,且子程序1要与易包中的公开函数定义一致。
看完这段内容,你应该了解到的是
- 易包不支持多线程
- 易包不支持静态编译
- 易包调用严格遵守要求
3. 易包使用的例程
关于例程,这里就不打算多费口舌了,因为论坛有大佬写的很好,但是也要提一下,方便大家学习。
首先推荐贴吧大佬的教程帖子地址,大佬的易包调用例程写的很明白,坛友们直接看着学习就好。
然后推荐学习论坛大佬的帖子用易包来写易程序的小程序,插件,甚至可以写补丁
即使你非要用静态编译,也有大佬整出来了【分享源码】易语言 易包 静态编译方法
独立编译和静态编译
到此为止,关于易包就是多线程和不允许静态编译的问题了。
关于多线程,易包写明了不支持多线程,我劝有心之人还是放弃这个想法吧,如果你是牛逼大佬,当我没说。
关于静态编译,已经有大佬有了对应的解决方案,在【分享源码】易语言 易包 静态编译方法 中可以学习如何来静态编译。
在我测试后,我认为使用独立编译将是一个更好的选择,独立编译不知道为什么大家都不喜欢用,但是在这个场景下是非常好用的。
从效果上看,静态编译是将核心库文件打包进exe文件内,独立编译是运行时将核心库解压到系统临时目录,二者在运行效果上几乎是一样的,目前还有什么其他不同或者有什么大的影响我尚未考虑到,如果有大佬看到,求指点。
关于易包和模块
大家在讨论到易包的时候,总会拿模块来进行对比,实际上,我认为这是不严谨的。
因此单纯的说谁更好是不对的,你要了解什么场景下该用什么方式来实现,这才是使用这个技术核心。