易语言支持库编写 第2卷

现在我们打开易语言安装目录下,有一个SDK目录,打开它找到子目录 cpp工程

里面有一个htmlview的例子,首先我们用我们第1卷的代码和 工程对比一下,

我们可以发现,vc自己生成的cpp中,我们主要用来写一些支持库的信息,

创建窗口的信息,我们并没有看到,


然后我们继续参考 sdk目录下面的 官方文档,

1、易语言支持库实际上是一个DLL动态连接库,此库中必须输出一个名为 GetNewInf 的函数,原型见下:

    #define FUNCNAME_GET_LIB_INFO   "GetNewInf"         // 取本支持库的PLIB_INFO指针的输出函数名称
    typedef PLIB_INFO (WINAPI *PFN_GET_LIB_INFO) ();    // GetNewInf的函数原型

其实,支持库就是一个dll,这里他主要公开的函数是这个 GetNewInf ;


好了,我们到 htmlview里面看一下涛哥是怎么写的。

PLIB_INFO WINAPI GetNewInf ()
{
	return &s_LibInfo;
}

好了,涛哥是这么写的。

我们加到我们的程序中,然后编译

D:\vc\MyProjects\PropertyGrid\PropertyGrid.cpp(66) : error C2143: syntax error : missing ';' before '__stdcall'
D:\vc\MyProjects\PropertyGrid\PropertyGrid.cpp(66) : error C2501: 'PLIB_INFO' : missing storage-class or type specifiers
D:\vc\MyProjects\PropertyGrid\PropertyGrid.cpp(68) : error C2065: 's_LibInfo' : undeclared identifier

看到这里,我们知道,肯定是缺少啥头文件,我们在原版的函数GetNewInf 转到定义看看是在哪个头文件


然后发现是在 lib2.h 这个头文件,我们把这个文件复制到自己的工程目录,然后在stdafx加上这个头文件

#include "lib2.h"

好了,我们现在编译,还有一个错误

D:\vc\MyProjects\PropertyGrid\PropertyGrid.cpp(68) : error C2065: 's_LibInfo' : undeclared identifier


我们在原版里面,找到他是如何定义的 然后复制到我们的程序中,编译,然后发现 27个错误。哈哈

我们在后面慢慢来解决这个问题!


http://download.csdn.net/detail/u012607841/6830901



本次模版需要使用黑月编译资源 也就是说动态要用黑月编译 不想用黑月的请自行方便 嗯,本人非美化出身,图标丑了谅解下 本模版采用支持第二版 何为第二版?(详细请见 e\sdk\cpp\docs.txt) 易支持有两个版本的开发包:2003.5 和 2008.5 两个版本的支持截然不同 连支持入口函数都不一样(即模版中的 GetNewInf) 模版里我也不打算兼容两种支持版本了 毕竟没多大意义 因为各位易友几乎都用的是 5.x 版本 当然,也可以认为我懒 更新内容只声明与支持相关的更新 当前版本:2014.11.28 更新内容: [+]更新FNE转LIB工具(V1.0) ★主要为本次模版更新而更新 [!]删除对组件英文名称的修改 ★源:如果【静态模式=#静态模式_WonderWall】, 那么英文名会加上 @4 ★现:不对组件英文名做任何修改 ★ *这些星星后的内容可以看看, 也可以跳过, 我只是做了下更新的解释 ★  本来完成这些模版就可以不用更新了的 ★  谁知发现犯了错?一个人敲代码真麻烦 ★  今天刚好周五, 我又翻了翻支持 ★  然后发现无法静态链接, 看了看易语言的调试信息 ★  才知道易语言静态链接时会自动给窗口单元函数加上 @4 ★  现在删掉了那条代码 历史版本:2014.11.22 更新内容: [+]支持编写组件(详细请见本人写的例子) ★其实这次的更新就是为了组件而更新的 [+]增加程序集:集_组件, 主要用于辅Zhu组件的编写 [+]增加 备选文本_生成_备选数值信息() [+]增加 备选文本_生成_备选文本信息() [+]增加 备选文本_生成_文件名() [+]增加 组件_保存_组件基本信息_创建时() [+]增加 组件_保存组件信息() [+]增加 组件_取结构_hUnit() [+]增加 组件_取结构_hWnd() [+]增加 组件_创建_功能组件() [+]增加 组件_创建_容器组件() [+]增加 组件_窗口过程_透明容器() [+]增加 组件_消息欲处理_功能性窗口() [+]增加 组件_消息欲处理_容器性窗口() [+]增加 组件_取单元信息() [+]增加 组件_消息转发_容器窗口() [+]在 类_写易 上做了某些更改 [+]增加 添加组件() 方法 [+]增加 添加组件属性() 方法 [+]增加 添加事件() 方法 [+]增加 添加事件参数() 方法 [!]修改 添加参数() -> 添加命令参数() [+]在 类_易功能 上做了某些更改 [+]增加 创建CWnd指针() 方法 [+]增加 取hUnit() 方法 [+]增加 产生事件() 方法 [+]增加 组件删除() 方法 [+]在 类_信息储存 上做了某些更改 [+]增加 添加属性() 方法 [+]增加 取属性数量() 方法 [+]增加 拷贝属性() 方法 [+]增加 添加事件() 方法 [+]增加 取事件数量() 方法 [+]增加 拷贝事件() 方法 [+]增加 添加事件参数() 方法 [+]增加 取事件参数数量() 方法 [+]增加 拷贝事件参数() 方法 [+]增加 类_属性 共6个方法 [+]在 集_结构创建 上做了某些更改 [+]增加 new组件信息() 方法 [+]增加 new组件属性信息() 方法 [+]增加 new单元信息() 方法 [+]增加 new组件事件信息() 方法 [+]增加 new组件事件参数信息() 方法 [+]在 集_功能 上做了某些更改 [+]增加 计算指针() 方法 [+]增加 IsXXX() 方法 [+]在 集_模版 上做了某些更改 [+]增加 默认处理_窗口单元接口函数() 方法 [+]增加 组件_保存_xxx() 模版函数 [+]增加 组件_释放_xxx() 模版函数 [+]增加 #结构尺寸_xxx 常量 5 个 [+]增加 #组件属性类型_xxx 常量 21 个 [+]增加 #组件属性属性_xxx 常量 5 个 [x]压缩包内不包含静态转换工具 ★因为静态转换工具没做任何更新 ★所以就不一起带着了 ★如果你真的需要 ★请到论坛找我的帖子 历史版本:2014.11.15 更新内容: [+]支持编写静态(至于步骤请往下看) [+]增加静态转换工具, 在随本模版的压缩包内(源码) [+]增加 类_写易.设置_静态模式() 方法, 用于指定静态的导出函数名 [-]对 类_写易.添加命令() 做了改动,主要修改链接名 [-]修复易语言无法读取链接名的BUG ========== 1.易支持机制 ========== 易支持信息、命令信息等等均使用某个结构储存 易源码中的自定义数据类型、类模块、组件即为支持中的定义数据类型 易语言通过 GetNewInf
!!!当前版本:2014.11.15 !!!更新内容: !!! [+]支持编写静态(至于步骤请往下看) !!! [+]增加静态转换工具, 在随本模版的压缩包内(源码) !!! [+]增加 类_写易.设置_静态模式() 方法, 用于指定静态的导出函数名 !!! [-]对 类_写易.添加命令() 做了改动,主要修改链接名 !!! [-]修复 易语言 无法读取链接名的BUG ========== 1.易支持机制 ========== !!!易支持信息、命令信息等等均使用某个结构储存 !!!易源码中的自定义数据类型、类模块、组件即为支持中的定义数据类型 !!!易语言通过 GetNewInf() 获取支持信息 !!!所以支持必须导出这个函数 ========== 2.支持命令调用 ========== !!!支持的命令调用方式也比较特殊 !!!每个命令需要三个参数:返回值指针,参数数目,参数信息指针 !!!做个一个定义数据类型的方法,每个方法的第一个参数为指向该对象的结构指针 ========== 3.简单说下易源码 ========== !!!易保存源码时没有保存各信息名称(比如命令名、数据类型名),而是保存了索引 !!!所以支持内的各信息有必要时可以修改 !!!但不要改动TA们的顺序,这会导致前期版本的源码出现问题 ========== 4.模版说明 ========== !!!本模版整天来说思路清晰,代码连小白都能理解 !!!模版多数的参数使用通用型,使得模版简便 !!!模版内没有多说废话, 直接把关键的过了一遍, 足够写支持了 !!!每条命令都演示了支持的各种操作,能想到的都先写了 !!!暂时没写组件,目前没什么时间了,玩着电脑也冷~ !!!尽量抽时间将组件的开发也模块化 !!!或者各位有心人士可参考 e\sdk\cpp\samples\HtmlView 写一下 ========== 5.关于静态 ========== !!!静态的编译本人提供了两种方式,不过两种方式都必须要符合下面的要求 !!!必须导出(易语言里打上公开属性)信息通知函数, 函数名必须符合 libName_ProcessNotifyLib 的规则 !!!必须导出所有命令实现函数,函数名必须符合 libName_xxx 的规则 !!!必须导出所有窗口单元信息函数,函数名必须符合 libName_GetInterface_控件英文名。2014.11.13这个版本的模版包括前面的暂时木有组件,所以不会有这个函数 !!! !!!第一种方法(#静态模式_SalHe) !!!将支持编译 !!!此时还不能做为静态发布 !!!使用本人写的工具 FNE转LIB 将编译后的支持转换 !!!转换之后的文件即可作为静态发布了 !!!工具的使用方法详见工具的自我介绍 !!! !!!第二种方法(#静态模式_WonderWall) !!!下载一个易语言支持(插件):WonderWall !!!易语言勾上这个支持之后并开启静态编译功能(易语言菜单 -> 工具 -> WonderWall) !!!易语言菜单 -> 编译 -> 静态编译 !!!此时再拖入工具中加工(进行符号重命名) !!! !!!至于我写的那个工具也放得有源码, 所以要知道原理的话可以看看源码 !!! !!!那么WonderWall编译静态为什么要另外弄个模式呢?请转到 类_写易.添加命令() 查看, 看的更清楚 ========== 6.为何选择支持 ========== !!!其实用模块扩展程序也是足够了 !!!选择做支持还是安全的 !!!而且支持有许多模块做不到的功能 ========== 7.关于易功能函数 ========== !!!顾名思义, 就是易内部提供给支持的函数 !!!主要的用法呢还是得参考 lib2.h(位于 e\sdk\cpp\elib\lib.h) !!!虽说是一个C++头文件,但是语文好点、懂易语言就能理解 !!!小学生的语文水平就差不多啦 !!!我还是把一些常用的写到了 类_易功能 这个类里面 !!!各位同学可以看看、、 ========== 【最后】 ========== !!!直说:本人纯属菜鸟一枚, 各路大神勿喷即可 ==========【信息】========== !!!模版:易支持模版 !!!作者:SalHe(Rabbit Group) !!!声明:大鸟勿喷即可 !!!日期:2014年11月15日 !!!论坛: !!! 精易论坛 : http://bbs.125.la/uid-186545 !!! 易语言官方论坛:http://bbs.eyuyan.com/u.php?uid=6
开箱即用篇 工程解压后就只有如图所示这些: .vs  —— 一些配置文件,非常重要; JBzlib —— 工程源码、、头文件等; JBzlib.sln  —— 解决方案,安装好 vs2017 双击运行直接可以编译。 先不急着打开解决方案,先打开 JBzlib 文件夹: elib —— 实际上就是易的安装目录下的 sdk 文件夹中的 elib,也就是官方提供的支持开发 SDK,其实可以直接 include 的,但是为了打包我直接复制到工程里,这个是我自己电脑上的,5.4.1版本的 SDK,新版的貌似增加和改变了一些东西,更换的时候注意; zlib-1.2.8 —— zlib 1.2.8 的头文件(其实包括源文件也打包了),同样正常情况下是直接 include 的,但是为了打包我直接复制到工程里; zlibstat.lib —— zlib 的静态链接; *.h、*.cpp、*.def —— 这些就是支持的源文件和头文件等了; 其它 —— vs 工程的文件; 好了现在打开刚才的 JBzlib.sln,注意在此之前一定要安装 好 vs2017 (安装的时候不要省空间,跟 c/c++ 有关的全打勾,包括单个组件也打勾,硬盘不值钱。): JBzlib.h  里的 guid 一定不要自己随便编,用 guidgen.exe 来生成(只要你安装了 vs2017,电脑上就一定有 guidgen.exe,搜索一下,或者易的安装目录下也有): JBzlib.cpp  中是主要部分,包括支持的常量、数据类型、导出命令以及命令的参数都在这里,注意 __E_STATIC_LIB 这个宏(都有汉字说明,别瞎改一般不会错): JBzlib.def 这个导出文件一定要有,改个名字复制进去啥都不用管: 自带了 6 种配置: fne、fne_bak  —— 后者是前者的备份,用来编译生成 *.fne 动态支持,但是无法静编; static_lib、static_lib_bak  —— 后者是前者的备份,用来编译生成和 *.fne 对应的 *_static.lib 静态,从而可以静编 debug、release  —— 创建项目自带的,不用管; 原理半解读篇 上面的部分顾名思义,给开箱即用的朋友用的,下面是解读原理,为什么说是半解读呢?因为也是个半吊子,很多都是玄学,凑合看下。 (注意:均以 vs2017 为例) 新建一个动态链接项目: 然后按照打包的工程进行一些文件的复制粘贴改名啥的的导入啥的,能看到这里的应该这点不成问题吧? 然后打开项目属性页,右上角配置管理器,新建 fne 和 static_lib 的 win32 平台的空配置: 然后按照打包的工程的 fne 和 static_lib 配置一项一项地对应着修改配置,不要问为什么,老夫也不知道为什么,它就这样就可以编译成功,不要问为什么,不要问。。。 注意 fne 和 static_lib 的有一个地方都要改一下,跟你的项目名对应,其它的不要动。。。不要动。。。 原理很简单,vs 提供了这种平台工具集,相当于一种降级,就可以让 vc98 成功 link 了。 但是 ,不要用你所希望使用的链接器无法链接的数据类型和函数,尽可能简单,当然如果你的易用的是 vs2015 甚至 vs2017 的链接器,就会好很多。 为什么要打这么多字配这么多图来分享,因为我希望抛砖引玉,能吸引到有能力的朋友来制作支持,毕竟" 用 VC6.0 做个支持吧 " 这种"厚颜无耻"的请求我都不好意思说出口,但是用 vs2017 的话就不一样了,至少是个先进的 IDE,对吧?希望大伙一起给易这潭死水增添一点活力,不要整天觉得别的语言鄙视自己,丰富类,真正把快速开发、简单易用这些做到,还是可能有活路的。 (写到这里,想了想干脆建了个群用来交流,547525064,专注交流支持制作,我自己是个 vc 苦手,希望来几个大佬日常指导~ 哦对了对了,忘了说分享的这个支持具体的用处了: 网页_gzip解压(),都用过吧,这个就是那个用处。 很多人可能跟我一样,用易写请求的时候,为了不多带一个.dll,都不进行压缩也不接收压缩。 但是做爬虫或者请求频繁的时候这样效率很低,用了 gzip 就不一样了,毕竟网络传输和本地解压相比,是很费很费很费时间和资源的。 解压速度方面,调试模式支持比调试模式的 zlibwapi.dll 调用慢不少,但是编译后速度还是一致的,很可观。 支持公开的为数不多的命令全是指针操作(没研究怎么让命令可以是自定义数据,而且指针的比较灵活,因为我觉得 gzip 不可预估长度,是更适合流式解压的。 修改了一下 zy 的 zlib 模块的代码,写了个 网页_gzip解压(),测试不多,有 BUG 反馈或者自行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值