
一、黑月的用途
黑月是类似于斩月,目的是将易语言程序小型化,脱离支持库运行的工具。但实现原理和方法又与斩月不同,不需要类似的斩月壳,而是分析并转化易程序为对象文件obj,再用链接器LINK.EXE重新编译链接。这样生成的黑月程序,具有更规范更优化的PE程序文件结构,并且带来更多的功能扩展(比如使用RC资源脚本生成PE标准资源),以及带来下好处:
1、具有正常的PE可执行文件结构,经过反编译后生成的易程序代码清晰可见,完全呈现。汇编代码可分析可用专用软件跟踪调试,不会再产生误报。
2、在脱离核心支持库的同时,又不废除原有核心库命令,而是转向调用功能类似的黑月核心库。就是说,黑月可以使用大部分的原核心库命令(非窗口操作),并且黑月核心库为本人模仿原核心库功能,再重新编写的静态库。由于黑月先天优势,可以静态库抽取代码片段合成编译,就是用到的命令函数才提取相应部分代码。不用到命令不合成到目标程序。这样的好处是既保持原有功能不变,又不使程序文件大小增加,附带冗余代码。
易友们一直梦想的静态库抽取合成编译,今天在黑月已经实现了!
(黑月支持的核心库命令看随后的附表)
4、黑月可以使用PE标准资源,用RC脚本编译生成。比如使用资源对话框模板创建窗口,并配合可视化的黑月RC脚本编辑器,比斩月又多一种更方便的界面设计功能,而且与汇编和C语言的RC脚本兼容通用,使黑月程序更接近于常规程序。
5、黑月的DLL可以使用类似其它语言DLLMAIN入口函数(黑月为“Dll入口函数”),可以通过DLL的模块句柄访问DLL的PE资源、注入进程、多线程应用等等优点。
6、黑月可以突破易语言自身的限制,实现对__cdecl调用方式函数的支持,并且可以在编译时链接其它由C语言或MASM32汇编语言编写的静态库,这又大大的增强了功能扩展,对众多C语言代码资源的利用,和软件工程的协作开发创造了便利条件。
黑月QQ讨论群(16110995),向作者直接反馈信息,欢迎加入!
二、黑月工具和例程下载:
1.6.0版下载:
[黑月安装程序]
下载例程:
[黑月例程源码]
版本升级历史:
1.6.0版(2010年8月19日)
1、支持常量支持库的编译(比如尘土界面库2.0)。
2、修改“到时间”命令当参数为纯时间数字格式时出错的BUG。
3、修改“标准输出”命令不能重定向到文本文件的BUG。
4、修改“子文本替换”命令当“欲被替换的文本”比“欲被替换的子文本”短时,返回空文本的BUG。
1.5.9版(2010年4月11日)
1、修改变体型为传址型数组不能取出成员的BUG。
2、修改变体型为传址型数组取不出数组成员数的BUG(易核心库的BUG)。
3、在编译DLL时,勾选“允许编译时修改DLL函数在导出静态库中的名称”时,不再删除DEF文件,方便编写LPK之类的DLL,只需要粘贴一次导出函数。
1.5.8版(2010年3月24日)
1、修改“子文本替换”命令不区分大小写替换时漏掉后段的BUG。
2、修改调用对象方法时,参数为类模块私有成员变量调用失败的怪异BUG。
1.5.7版(2010年2月8日)
1、修改“寻找文件”命令特性与易核心库一致,不必再填写准确属性值。
2、修改“删除目录”命令特性与易核心库一致,用递归算法逐层删除包含的下级目录文件。
3、修改“写注册项”命令写入空文本指针时,读取出乱码的BUG。
4、改用Inno Setup制作黑月插件的安装程序。
1.5.6版(2010年2月7日)
1、修改“数值到格式文本”命令有千分位分隔符时的BUG。
2、修改“写注册项”命令写数值型出错的BUG。
3、修改“字符”命令当参数为0时返回空指针,与易核心库一致。
4、修改“读配置项”只能读254个字节项内容的BUG。
5、增加支持对象的“创建字体对象”和“取回字体”方法。
7、增加可以利用易语言5.0版静态库调用其它非窗口功能支持库的功能。
8、增加编译菜单显示黑月是否开示的功能,与易的静态编译或独立编译区分开。
9、自动扫描未使用到的支持库,不添加对应的静态库合成到程序当中,避免文件无端增大。
10、自动删除编译DLL时生成的*.LIB和*.EXP文件。
1.4.3版(2009年12月10日)
1、修改“子字节集替换”命令的BUG。
2、修改“子文本替换”命令的BUG。
3、修改“删除数据”命令不能删除磁盘文件数据的BUG。
4、修改“四舍五入”命令算法错误的BUG。
1.4.2版(2009年11月20日)
1、修改“子字节集替换”命令替换较长数据时内存出错的BUG。
2、增加“指针到字节集”对于指针是否有效的检测,以减少运行因指针地址无效而出错。
3、修改“标准输入”命令与原核心库不相符的问题(带有回车符)。
1.4.1版(2009年11月4日)
1、修改当DLL声明的函数和模块名与代码中文本常量相同时,出现编译的程序无法运行和易语言IDE出错的怪异错误。
2、重写“取随机数”命令算法,使随机数在范围区间内分布更均匀。
注意:“DLL入口函数”的进程载入时,易程序的变量类型未初始化,所以需要实现的工作应在“启动子程序”里进行,因为这时易的变量已经初始化,可以正常工作。而“DLL入口函数”只用来获取DLL的实例句柄,用于访问DLL的资源。
1.3.5版(2009年10月27日)
1、修改“取命令行”命令不支持中文路径名参数的BUG。
2、再次修改“取随机数”命令有数值范围时固定不变的BUG。
1.3.4版(2009年10月24日)
1、修改“子文本替换”命令当欲替换文本在文本首时后尾数据丢失的BUG。
2、修改“子字节集替换”命令当欲替换字节集在字节集首时后尾数据丢失的BUG。
3、修改“读入数据”命令在“打开内存文件”中读取字节集时只能读取四个字节的BUG。
4、修改“到全角”和“到半角”对于字符\/不转换的BUG。
1.3.3版(2009年9月26日)
修改“取随机数”命令有数值范围时固定不变的BUG。
1.3.2版(2009年9月10日)
修改“取随机数”命令有时出现负数的BUG。
1.3.1版(2009年8月23日)
修改“到全角”和“到半角”命令与核心库原命令有差异的BUG。升级“黑月资源编辑器”版本为2.2.0.3b。增加可视化窗体设计时对中文字体的支持,增加“超级链接框”控件(SysLink)。
1.3.0版(2009年8月16日)
修改“清除数组”命令导致程序出错的BUG。
1.2.2版(2009年8月15日)
修改“到文本”和“信息框”命令成转换自定义类型成员为字节型和短整数型时不正确的BUG。修正写磁盘文件命令比易原命令慢的问题。
1.2.1版(2009年8月10日)
修改DLL函数名长度超过50字节和函数名有部分相同时不能编译的BUG。
1.2.0版(2009年8月6日)
支持调试(按黑箭头或F5)有PE资源的黑月程序(比如用资源对话框模板创建的窗口)。注意:调试必须支持自动处理和源码有RC脚本文件
1.1.5版(2009年8月6日)
修改在WIN7系统下使用有返回数组命令(如“分割文本()”)后出错的BUG。
1.1.4版(2009年8月4日)
兼容斩月源码,修改文本常量过多时出错的怪异问题。
1.1.3版(2009年8月4日)
修改“寻找文件”未找到文件时,退出程序时出错的BUG。
1.1.2版(2009年8月1日)
修改“到小数”返回值不正确的BUG。
1.1.1版(2009年8月1日)
修改“信息框”返回值、“文本替换”和“字节集替换”与核心库原命令有差异的BUG。
1.1.0版(2009年7月31日)
1、修改VISTA和WIN7系统,从工具菜单打开资源编辑器时出错的毛病。(感谢番茄提供解决办法)
2、增加媒体播放类命令“播放MID”。(感谢dtcser提供源码)
3、支持__cdecl调用方式的外部函数。
4、支持编译链接由C语言或汇编编写的静态库(LIB),做为黑月功能扩展。
5、开放链接器LINK.EXE的编译参数,可以定义生成特殊功能的程序。
三、黑月工具的安装和使用:
为了方便使用,黑月工具是以易语言编辑器的插件形式使用,出现在易编辑器的工具菜单里,与易IDE融合。在易语言编译生成EXE和DLL文件之后,随即自动加工处理,重新编译转化成黑月程序,不用自己选择程序文件(这个自动处理功能,可以通过黑月设置关闭,变为手动选择处理)。
1、下载黑月安装程序之后,双击运行按提示说明,黑月必须安装在易语言安装目录。比如:C:\Program Files\e (e目录下的BlackMoon为黑月主目录,以及LIB里的BlackMoon.fne为支持库插件)
2、安装黑月工具之后,需要在易编辑器菜单->工具->支持库配置,勾选“黑月编译器插件”支持库,如图:

如果没有什么意外,就会立即启动并运行黑月工具

工具菜单出现“黑月工具”和“黑月资源编辑器”菜单选项。

注意:如果勾选“黑月编译器插件”支持库时,易编辑器出错退出。这说明你的系统不支持黑月自动加工处理功能(部份原因是使用了破解版易语言)。
遇到这种情况请自行编辑配置文件,比如:C:\Program Files\e\BlackMoon\BlackMoon.ini
修改配置内容:
[BlackMoon]
Run=0
将禁止自动处理功能,这时再重新启动易编辑器,再次勾选“黑月编译器插件”支持库。但没有自动处理功能很不方便,而且如果要同时编译资源,RC脚本文件路径和名称也需要相应变化,这以后再详细了解。
3、关闭自动处理功能和手动选择处理。易编辑器菜单->工具->黑月工具,将出现黑月的设置窗口,如图:

“启动黑月编译器”选择框决定是否在易语言生成程序之后,自动处理成黑月程序。如果关闭,将不自动加工处理成黑月程序,恢复易编辑器原来的状态和功能。如果上系统不支持自动处理的,勾选这个功能将导致易编辑器出错。
关闭开启这个功能,在易编辑器的输出窗口都有提示:

4、使用和产生PE资源。易编辑器菜单->工具->黑月资源编辑器,将运行资源脚本编辑工具软件,如果当前源码已经保存到文件路径,并且没有与源码相配套的RC文件,将询问你是否创建同名的RC文件。

如果已经创建有了,就会直接打开与源码相关的RC文件,编译时会自动编译RC脚本为PE资源,源码中使用专用API访问PE标准资源。
黑月资源编辑器主要的功能菜单如图所示:

5、黑月程序编写的注意事项:
(1)黑月兼容大部分的斩月程序,斩月源码若在黑月编译后上无法运行,请仔细排查。
(2)黑月程序若使用链接静态库和使用__cdecl调用方式的DLL函数时,则不能调试运行(按F5),只能编译后才能运行(用信息框插入代替断点)。
(3)请将易编辑器的“花指令插入级别”和“编译结果打乱码”关闭(设置为0),这两个功能影响黑月对易程序的分析。
(4)如果使用4.13版本,请将版本信息功能关闭,菜单->程序->配置->(最底下选项)去掉选勾。使用黑月自己的资源脚本添加版本信息。否则会破坏生成的黑月程序,出现“不是有效的 Win32 应用程序。”的提示框。
(5)黑月程序只能使用支持的核心库命令和API,不能使用易的窗口及组件和其它支持库,窗体界面用代码和资源对话框生成。
(6)编写非控制台的黑月程序,可以在程序新建内先选择控制台程序(用_启动子程序),然后在“菜单->程序->配置”改成“Windows窗口程序”。
四、使用__cdecl调用方式的函数和链接静态库编译
(一)、__cdecl调用方式
常用的调用方式有__stdcall和__cdecl,易语言和大部分的API使用的是__stdcall,C语言默认使用的是__cdecl。所以实现__cdecl调用方式,可以调用更多的外部模块的函数。
比如例程里的,API文本格式化函数wsprintf,微软C语言函数库msvcrt.dll,里面有比如:控制台格式化文本输出函数printf,字符串处理,文件操作,底层I/O操作等等函数,利用这些C语言的函数,可以方便直接的转译C语言的代码。
以及用C语言编写的函数为__cdecl调用方式的DLL,比如著名的轻量级数据库驱动sqlite3.dll。
实现这种调用方式,将大大扩展黑月的功能和应用范围。
1、黑月如何实现__cdecl调用
所谓的调用方式,就是对参数入栈顺序和传递参数用的堆栈内存的平栈处理方式,参数用栈内存的大小就与参数数目和类型有关。我们要实现__cdecl就必须计算出参数栈内存大小值,然后加上平栈代码。本来这是编译器做的事,但易语言的编译器没有提供这个功能,所以我们要手动计算并填值。下面来学习参数栈内存大小的计算:
这是例程里__cdecl方式的DLL子程序声明,DLL库命令名里有“wsprintfA@@12”字样,wsprintfA是函数原名称,两个@是黑月自己的约定,表示这个函数是__cdecl方式,黑月分析程序时就会认别出并做相应处理。@@后面的值就是参数栈内存大小值,与参数数目和类型有关。
计算这个值很简单,首先来了解一下数据类型所占内存的大小。

(1)4字节类型,因为是WIN32系统,大多数都是4字节32位数据的。
字节型(BYTE)、字符型(char)、短整数型(short)、整数型(int)、小数型(float)等等
以及所有的指针型,包括字符串指针(char*)、双精浮点小数型指针(double*)、长整数型指针(INT64*)等等。后面跟有*号的。
(2)8字节类型
双精浮点小数型(double)、长整数型(INT64)以及日期时间型(DATE实际上是double型)。
用这些数据类型大小乘于相应的参数数目,就是参数占用栈内存大小值。
比如图例的,两个文本型(char*)和一个整数型(int)。三个参数都是4字节的,栈大小 = 3 × 4 = 12
图中的@@12就是这么来的。
如果再多出一个双精浮点小数型(double)参数的。计算式就是 3 × 4 + 8 = 20
将这个计算值以“函数名@@栈大小值”格式填写入DLL声明,在黑月处理后,就能实现__cdecl调用方式。
(3)计算该值错误会发生事情?
这个不用担心,只是弹出以下错误提示,这个提示会帮助你直到填写正确的值并学会计算参数所用栈内存大小(注意:不要把易语言系统配置的“调用DLL命令后检查堆栈错误”关闭了)

用错调用方式也是这个提示,比如不是__cdecl的(比如__stdcall),而用__cdecl的,反之亦然。
(二)、使用静态库
如果说上面实现__cdecl可以调用C语言标准函数库msvcrt的函数,这还需要从C语言源码转译到易源码。但实现编译时链接静态库,直接将C语言编译的静态库,拿来黑月所用。那就不用转译C语言的源码了,先把C语言源码在C的IDE里编译成静态库(LIB),黑月编译时再合成静态库功能代码,那就省了很多事情。而且C语言的内联汇编功能比易的置入代码()更专业更方便出错率又低。
使用从网上下载别人编写好的静态库,或用C语言或汇编为黑月编写静态库(相当于易的模块),这又进一步提高了黑月的功能扩展。
注意:静态库必须是标准C语言或MASM32编译的,库文件为COFF格式的(OMF格式的需要转换成COFF),VC++编写的也可以,但不能带有用MFC类,接口函数名要用C语言风格修饰符(加 extern "C")。
1、静态库的__cdecl函数的调用

仍在DLL命令里声明函数,不同的是在DLL库文件名里不要填DLL文件名,全部都写上“静态库”三个字。黑月分析程序遇到时就会将这个函数做为静态库函数来链接编译。
命令名仍用上方面讲到的名称加栈大小的格式。
2、静态库的__stdcall函数的调用
也是在DLL文件名写上“静态库”三个字。不同DLL调用的是,静态库的__stdcall函数也要类似调用__cdecl方法,需要把参数栈大小写上(即使没有参数也要写上“@0”)。不同于__cdecl的是,黑月约定为一个“@”,注意__cdecl是“@@”,__stdcall是“@”,这是有区别的,也是为了区分种两种调用方式。如图:

3、静态库文件名
上面的DLL文件名已经填写“静态库”,那么怎么指示黑月编译器应该调用哪个静态库?
这就需要自己来编写编译参数的配置文件,以“水波特效演示”为例,它的编译配置文件为“水波特效演示.ini”,必须与源码同目录同名的。(如果是手动处理的,就与欲处理的易程序EXE或DLL同名同目录)
打开后可见内容为:
[Link]
Opt = WaveObjectLib.lib gdi32.lib
Opt=后面跟着的就是要加入的编译参数,可以看到静态库名:WaveObjectLib.lib,而gdi32.lib是这个静态库用到的系统API导入库,如果静态库编写得不规范,没有在编写时注明引用到哪些静态库,就需要我们在这里也同时再加上。库名要用空格分隔开。
黑月已经默认加入kernel32.lib、user32.lib和msvcrt.lib。其它的可看情况添加,不然会出现链接时失败提示,是一大串英文,中间提示有找不到库的函数名。
(三)、编译参数
黑月的编译参数是保存与源码文件或目标程序同目录同名的INI文件里的,黑月处理编译时就读取这个文件并添加到链接器的参数里,这些参数可以指示链接器生成特定的程序。
所以这个编译参数的配置文件,不只是用来写静态库名的,还可以写更专业的LINK选项,以“远程注入进程”为例。
它的原理就是将自身克隆到IE浏览器进程的内存里,再用远程线程启动这个打入IE内部的“克隆体”的子程序,但通常EXE可执行文件的基址都是0x400000,如果直接复制过去,地址是一样的、重叠了,肯定会失败。
所以要产生可以嵌入其它进程空间的特别程序,这个程序的基址就不能为0x400000。
通过编译参数,我们就可产生这样的程序。看“下载器.ini”:
[Link]
Opt =/BASE:0x13140000 /INCREMENTAL:NO /OPT:NOWIN98 /SECTION:.text,EWR /IGNORE:4078 /FILEALIGN:0x200 /MERGE:.rdata=.text /MERGE:.data=.text
其中重要的参数(颜色对应):
1、就是将EXE的基址设为0x13140000,错开0x400000
2、节并节到.text段
这样生成的下载器程序就能顺利的植入IE进程空间,并且逃避防火墙的检查,因为所有网络下载或其它操作都是以IE浏览器的名义进行,是合法的。
(四)、黑月处理程序路径
随着黑月程序的各种相关文件增多(资源脚本RC文件、编译参数INI文件和静态库LIB文件等等),有必要规范一下黑月程序的文件分布,最好同一个工程项目放在一个目录里,这样发布源码时连带所有文件一起打包。不能再像易源码那样,一个文件就包括全部,所有源码都放在同一个目录。
并且黑月处理时要寻找相关文件是有特定规则的。与源码文件或目标程序同名同目录。
1、自动处理时(推荐)
是以源码文件所在的目录为工程目录的,所用到的资源脚本RC文件、编译参数INI文件和静态库LIB都是从这个目录读取,并且RC文件和INI文件是必须与源码文件同名的。比如:
源码文件
黑月程序.e
那么相关工程文件就为
黑月程序.rc
黑月程序.ini
特别是INI文件是自己编写和命名,文件名要与源码文件统一。
2、手动处理时(系统不支持自动处理时用到的)
是以欲处理的易程序(EXE和DLL)的目录为工程目录,而不是以源码文件了,这点要注意,其它相关文件也要做相应改变。比如:
源码文件
C:\黑月程序.e
易编译后为
F:\BlackMoon.exe
那么相关工程文件就应变为
F:\BlackMoon.rc
F:\BlackMoon.ini
与源码文件无关了,因为手动选择的程序不一定就是当前编辑器里的源码文件生成的。所以为了工程项目编写方便,你就要把易程序编译到源码同目录,并且与源码同名。像上面的,编译到C:\黑月程序.exe,其它相关文件名就不用改变了,全部名称都统一,这样交流源码就方便了。
这就是手动处理不方便的地方。
五、黑月的支持核心库命令列表
同时支持变体型和对象型。
流程控制
-----------------------
如果
如果真
判断
判断循环首
判断循环尾
循环判断首
循环判断尾
计次循环首
计次循环尾
变量循环首
变量循环尾
到循环尾
跳出循环
返回
结束
算术运算
-----------------------
相乘
相除
整除
求余数
相加
相减
负
取符号
取绝对值
取整
绝对取整
四舍五入
求次方
求平方根
求正弦
求余弦
求正切
求反正切
求自然对数
求反对数
置随机数种子
取随机数
逻辑比较
-----------------------
等于
不等于
小于
大于
小于或等于
大于或等于
近似等于
并且
或者
取反
位运算
-----------------------
位取反
位与
位或
位异或
左移
右移
合并整数
合并短整数
变量操作
-----------------------
赋值
连续赋值
数组操作
-----------------------
重定义数组
取数组成员数
取数组下标
复制数组
加入成员
插入成员
删除成员
清除数组
数组清零
环境存取
-----------------------
取命令行
取运行目录
取执行文件名
读环境变量
写环境变量
文本操作
-----------------------
取文本长度
取文本左边
取文本右边
取文本中间
字符
取代码
寻找文本
倒找文本
到大写
到小写
到全角
到半角
到文本
删首空
删尾空
删首尾空
删全部空
文本替换
子文本替换
取空白文本
取重复文本
文本比较
分割文本
指针到文本
字节集操作
-----------------------
取字节集长度
到字节集
取字节集数据
取字节集左边
取字节集右边
取字节集中间
寻找字节集
倒找字节集
字节集替换
子字节集替换
取空白字节集
取重复字节集
分割字节集
指针到字节集
数值转换
-----------------------
到数值
数值到大写
数值到金额
数值到格式文本
取十六进制文本
取八进制文本
到字节
到短整数
到整数
到长整数
到小数
时间操作
-----------------------
到时间
增减时间
取时间间隔
取某月天数
时间到文本
取时间部分
取年份
取月份
取日
取星期几
取小时
取分钟
取秒
指定时间
取现行时间
置现行时间
取日期
取时间
磁盘操作
-----------------------
取磁盘总空间
取磁盘剩余空间
取磁盘卷标
置磁盘卷标
改变驱动器
改变目录
取当前目录
创建目录
删除目录
复制文件
移动文件
删除文件
文件更名
文件是否存在
寻找文件
取文件时间
取文件尺寸
取文件属性
置文件属性
取临时文件名
读入文件
写到文件
文件读写
-----------------------
打开文件
打开内存文件
关闭文件
关闭所有文件
锁住文件
解锁文件
移动读写位置
移到文件首
移到文件尾
读入字节集
写出字节集
读入文本
写出文本
读入一行
写文本行
读入数据
写出数据
是否在文件尾
取读写位置
取文件长度
插入字节集
插入文本
插入文本行
删除数据
系统处理
-----------------------
运行
取剪辑板文本
置剪辑板文本
剪辑板中可有文本
清除剪辑板
取屏幕宽度
取屏幕高度
取鼠标水平位置
取鼠标垂直位置
取颜色数
信息框
鸣叫
取启动时间
置等待鼠标
恢复鼠标
延时
取文本注册项
取数值注册项
取字节集注册项
写注册项
删除注册项
注册项是否存在
取默认底色
快照
读配置项
写配置项
取配置节名
取操作系统类别
多文件对话框
媒体播放
-----------------------
播放音乐
停止播放
播放MID (1.1版增加支持)
其他
-----------------------
选择
多项选择
是否为空
取数据类型尺寸
取颜色值
处理事件
写到内存
置入代码
网络通信
-----------------------
取主机名
通信测试
转换为主机名
转换为IP地址
控制台操作
-----------------------
标准输出
标准输入
对于易语言5.0版静态库支持情况:
多线程支持库
位图操作支持库
网络通讯支持库
XML解析支持库
图像格式转换支持库
Sqlite3数据库支持库
MySQL支持库
可执行文件转换支持库
数据结构支持库
数值计算支持库
通用对象支持库
文字编码转换支持库
数据操作支持库一
文字编码转换支持库
XP风格支持库
特殊功能支持库
远程服务支持库
控制台操作支持库
端口访问支持库
编码转换支持库
保密通讯支持库
正则表达式支持库
互联网服务支持库
操作系统界面功能支持库
可执行文件数据转换支持库
邮件接收支持库
网络传送支持库
互联网支持库
应用接口支持库
现在暂不支持编译,有待解决的支持库:
BT下载支持库 (使用MFC类库,有符号冲突)
Java支持库 (使用MFC类库,有符号冲突)
进程通讯支持库 (使用MFC类库,有符号冲突)
局域网操作支持库 (使用MFC类库,有符号冲突)
OPenGL支持库 (使用MFC类库,有符号冲突)
DirectX3D支持库 (使用MFC类库,调用nafxcw.lib可以编译)
第三方支持库:
本人编写的支持库,黑月可以使用的:
ADODB数据驱动操作支持库 (伪静态库编译,发布时需要带上独立的支持库)
云外归鸟的线程池支持库 (伪静态库编译,发布时需要带上独立的支持库)
云外归鸟图像处理支持库 (伪静态库编译,发布时需要带上独立的支持库,已经发布,自己下载)
云外归鸟女声朗读支持库 (伪静态库编译,发布时需要带上独立的支持库,已经发布,自己下载)
1.5.9版(2010年4月11日)
1、修改变体型为传址型数组不能取出成员的BUG。
2、修改变体型为传址型数组取不出数组成员数的BUG(易核心库的BUG)。
3、在编译DLL时,勾选“允许编译时修改DLL函数在导出静态库中的名称”时,不再删除DEF文件,方便编写LPK之类的DLL,只需要粘贴一次导出函数。