精易论坛
标题:
C语言编写易语言支持库系列课程
[打印本页]
作者:
项目部002
时间:
2018-11-16 16:02
标题:
C语言编写易语言支持库系列课程
本帖最后由 项目部002 于 2022-6-16 16:49 编辑
大家好,为大家带来了使用C语言为易语言编写支持库的教程。
本教程中涵盖了编写一般支持中的语法,说明,注意事项。
--
教程以:易语言官方提供的
docs.txt
(支持库开发说明文件)以及易语言官方提供的例程(
HtmlView
)作为参考,为大家来讲解使用C语言来制作易语言支持库。
同时针对一些小的技巧,写法做出了说明,适合想要编写支持库的广大易友。
课程下载链接
:
https://pan.baidu.com/s/1PspVJqZjj5GYMX9-dDt8xA?pwd=8ah3
docs.txt
(143.11 KB, 下载次数: 177)
2018-11-16 16:13 上传
点击文件名下载附件
下载积分: 精币 -2 枚
易语言支持库开发手册2013版.zip
(367.04 KB, 下载次数: 315)
2018-11-16 16:16 上传
点击文件名下载附件
下载积分: 精币 -2 枚
该教程会继续完善,希望大家能够提出宝贵意见及遇到的bug。
[hide=d100]
感谢您的回复,学习时,请多多参考官方例程,也可以在论坛,或通过搜索引擎查找对应的教程、源码等。
计划:今后会以docs.txt作为基本,制作更加具有说明性,例程更加齐全,更加完善和功能强大的支持库开发文档帮助手册,以图+文+例程的方式,详解支持库开发。
[/hide]
课程大纲:
易语言支持库第一课
什么是易语言支持库?
易语言支持库的开发文档。
前期准备工作,环境,路径配置。
lib2.h 必须文件,包含支持库类型、宏定义等
fnshare.h fnshare.cpp 可选文件,提供了一些常用的代码封装。
-----------------------
入口函数:
[line:75]
#define FUNCNAME_GET_LIB_INFO "GetNewInf" // 取本支持库的PLIB_INFO指针的输出函数名称
typedef PLIB_INFO (WINAPI *PFN_GET_LIB_INFO) (); // GetNewInf的函数原型
LIB_INFO结构体定义 [line:85] - [line:280]
需要注意的位置:m_nMajorVersion,m_nMinorVersion,_LIB_OS,m_pfnNotify
-----
需要了解的数据类型定义及长度:
[line:282]-[line:420]
额外阅读: 3、数据存储方式
-----
支持库环境通知方法*[line:422]
**新版VS不支持默认参数。
同时需要定义:NotifySys [line:444]
------
以上为支持库信息定义,定以后便可以编译生成并且在易语言中调用支持库。
复制代码
易语言支持库第二课
向支持库中添加一些“东西”
添加常量。
添加全局命令。
常量的定义:
LIB_CONST_INFO 定义 [line:468]
修改 : LIB_INFO结构体定义
INT m_nLibConstCount; // 常量数目。 [line:277]
PLIB_CONST_INFO m_pLibConst; // 指向常量定义数组。 [line:278]
---------------
实现全局命令
要向编写一个全局的命令,将要分成3个步骤:
1.定义一个:CMD_INFO [line:539]
注意:_CMD_OS
2.如果存在参数,则定义参数。ARG_INFO [line:608]
将参数信息写入CMD_INFO中。
m_nArgCount [line:601]
m_pBeginArgInfo [line:602]
3.定义命令函数体。 [line:665]
typedef void (*PFN_EXECUTE_CMD) (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf);
例子 [line:766]
复制代码
易语言支持库第三课
多实现几个命令
接上一课作业:
将所有参数定义到同一个argInfo中。
实现“文本型”返回值的命令
CloneTextData 命令:[line:769]
注意指针的使用和释放。
实现“数组型”参数的命令:[line:1426]
GetAryElementInf 命令:[line:825]
实现“通用型”参数的命令:[line:1290]
由于所有类型官方都提供了例子,所以课程不逐一介绍,具体请参见:
[line:762] - [line:2023]
复制代码
易语言支持库第四课
再向支持库中添加一些“东西”
添加一个自定义数据类型
数据类型的定义:[line:2025]
窗口部分在后面的课程中进行介绍,本课主要研究普通数据类型。
数据类型中的方法定义:[line:2102]
注意:方法所属分类category必须为-1.
实现代码中,第一个参数始终为指向其所在数据类型的对象指针。
向数据类型中定义一个普通的成员:[line:2133]
参看:LIB_DATA_TYPE_ELEMENT定义。
扩展: 定义枚举变量[line:2060]
复制代码
支持库编写第五课:
窗口组件的定义: [line: 2253]
为了保证能够和官方核心库完整兼容,窗口定义部分使用 VC98 (6.0) 进行编写。
窗口组件也是一种数据类型,只是该数据类型被标记为窗口组件。
标记为窗口组件的组件需要额外实现一些方法、内容,才能确保程序显示正常。
下面来看具体的介绍:
如果为窗口组件,则在定义数据类型时,要特别注意下面这些:
LIB_DATA_TYPE_INFO 中的 m_dwState, m_dwUnitBmpID, m_nEventCount, m_pEventBegin, m_nPropertyCount, m_pPropertyBegin, m_pfnGetInterface
[line: 2025]
介绍unshare.h与unshare.cpp文件:
文件中包含了一些在编程中需要使用到的类,这里官方做了整理。直接调用便可。
额外需要注意的地方 [line:2992]
复制代码
支持库编写第六课:
编写一个“按钮”:
复习上一课:
通过支持库接口创建一个按钮,按钮应该继承自基类: CButton [line:2994]
重要的类:
class CPIButton : public CPropertyInfo
属性类。 用来保存所有的组件相关的属性。 继承自 CPropertyInfo
需要实现: Init 初始化方法
需要实现: Serialize 用于在运行时应用属性
#define ITF_CREATE_UNIT 1 // 创建单元
实现Create创建,用于创建窗口。
-----------------------------------------------------------------------------
分别实现对应的“接口(GetInterface)”方法:[line: 2480]
#define ITF_CREATE_UNIT 1 // 创建单元
// 下面两个接口仅在可视化设计窗口界面时使用。
#define ITF_PROPERTY_UPDATE_UI 2 // 说明属性目前可否被修改
#define ITF_DLG_INIT_CUSTOMIZE_DATA 3 // 使用对话框设置自定义数据
#define ITF_NOTIFY_PROPERTY_CHANGED 4 // 通知某属性数据被修改
#define ITF_GET_ALL_PROPERTY_DATA 5 // 取全部属性数据
#define ITF_GET_PROPERTY_DATA 6 // 取某属性数据
首先实现窗口的一些属性。
窗口属性的定义:
如果需要定义窗口的属性,则需要给m_nPropertyCount,m_pPropertyBegin赋值;
需要注意的地方是:在属性m_pPropertyBegin定义的最前面必须使用:FIXED_WIN_UNIT_PROPERTY([line:3431]),来填充基本的属性(左边,顶边,等)
属性的类型 [line:2287]
属性的修改 [line:2656]
属性的获取 [line:2706] [line:2757]
属性的应用
---
更多信息需要参考官方示例源码: HtmlView
////////////////////////////////////////////////////////////////////////////////////////////////////////
复制代码
持库编写第七课:
窗口组件的方法:
组件方法类似于自定义数据类型的方法,使用默认的定义即可。
编写方法的实现代码时要注意,此时第一个参数始终为指向其所在数据类型的对象指针
在方法中获取窗口类型指针。
{
GetWndPtr (pArgInf);
}
-----------------------
窗口组件的事件:
需要实现窗口组件的事件,首先需要定义事件、事件参数等。
EVENT_INFO : [line:2419]
EVENT_INFO2 : [line:2444]
-
EVENT_ARG_INFO : [line:2397]
EVENT_ARG_INFO2 : [line:2413]
事件定义完毕后,将会在易语言设计界面中看到对应的事件,并且可以看到参数值等。
-
触发窗口事件: [line:2917]
时间的触发,需要使用:EVENT_NOTIFY : [line:2926] 或 EVENT_NOTIFY2:[line:2945],来作为通知(NotifySys-NRS_EVENT_NOTIFY)的参数。
----------------------------------------------------------------------
更多内容请看代码。
复制代码
第八课:
易语言静态支持库改造:
本课重点给大家讲解如何将易语言动态库转换为支持静态编译的易语言静态库。
首先看一下官方文档中对静态库的一些说明:
易语言5.0“基于第三方链接器的”静态编译方案的核心是:把易语言编译器生成的中间数据,编译成COFF格式的obj文件,然后把它交给第三方链接器,与各支持库的静态库(*.lib文件)一起链接生成EXE/DLL。
为了配合静态编译,易语言编译器、核心支持库、集成开发环境(IDE)均已做出重大更新,绝大多数官方支持库已完成自身改造。
第三方支持库需要作者按照本文介绍的方法完成支持库改造,以便支持静态编译。未经静态编译改造的原有支持库,仍可在新版易语言中使用,只是不能支持静态编译。
一、部分函数需要修改函数名称和符号导出方式
所有命令和方法的实现函数(PFN_EXECUTE_CMD)、处理系统通知的函数(PFN_NOTIFY_LIB),均需要修改函数名称,添加“库名称前缀”,并修改为以C符号形式导出(在C++中使用 extern "C");
所有数据类型的接口获取函数(PFN_GET_INTERFACE),需要统一命名为 <库名称前缀>_GetInterface_<数据类型英文名称>,并修改为以C符号形式导出(在C++中使用 extern "C");非窗口组件数据类型不需要接口获取函数。
二、在处理系统通知的函数中返回特定的信息
当通知参数为 NL_GET_CMD_FUNC_NAMES 时,应返回所有命令和方法实现函数的函数名称数组,此数组必须与命令和方法定义数组一一对应,数组各成员均为对应函数的函数名称文本指针(char*);
当通知参数为 NL_GET_NOTIFY_LIB_FUNC_NAME 时,应返回“处理系统通知的函数”(即自身函数)的函数名称(char*);
当通知参数为 NL_GET_DEPENDENT_LIBS 时,应返回“依赖的第三方静态库文件列表”,格式为\0分隔的文本,结尾两个\0。
三、从静态库中去除库定义相关的所有信息
与库定义有关的所有信息,包括命令和方法及其参数的定义信息、命令和方法的实现函数数组(m_pCmdsFunc)、数据类型及其属性事件方法的定义信息、GetNewInf()函数的定义等等,都不应该包含在静态库中。
从静态库中去除这些信息并不是必须的,但如果不去除,往往会造成链接时符号冲突,或导致链接生成的文件过大等一系列问题。
在静态库中,去除全局变量 theApp 的定义,代码中用到它之处,请替换为 AfxGetApp()。如果单纯替换为 AfxGetApp() 不能解决,需自行设法处理。这是必须的。
在静态库中,CWinApp继承类中的初始化和清理代码,可在一个static的全局类变量的构造和析构函数中调用;动态库中在GetNewInf()中的初始化代码,也可用类似方法解决。
在静态库中,应尽量减少导出符号对外部的影响,尽量定义为static符号,或添加自定义前缀。这有助于避免链接时的符号重复定义之类的链接错误。
四、使用符号重命名程序(resym.exe)来处理程序以减少名称冲突。
命令行:"C:\Program Files\e\sdk\tools\resym.exe" all infile="$(TargetPath)" outfile="$(TargetPath)"
VC6.0中的具体操作
在原有支持库VC6工程(.dsw)的基础上,新建一个“Win32 Static Library”项目(.dsp),新项目名称为原项目名称后加"_static"(如 iext3_static)。建议把新项目文件创建在原项目文件旁边(两个项目在同一目录)。
进入创建项目下一步,不选择“Pre-Compiled header”,根据需要确定是否选择“MFC support”(如果暂时不确认,可以先选上,事后再取消)。
为新项目添加预定义宏 __E_STATIC_LIB,并把原项目中的源代码文件都添加进来(VC6文件视图(FileView)中支持 Ctrl+C Ctrl+V)。
复制代码
作者:
DDSGXQ
时间:
2018-11-16 17:01
沙发支持一下,易语言助手该更新了
作者:
易易语
时间:
2018-11-16 17:09
高级编程以后在说吧。。
作者:
祁辛
时间:
2018-11-16 17:43
mark
作者:
rainbar
时间:
2018-11-16 18:54
谢谢分享
作者:
q275212
时间:
2018-11-16 19:19
这个可以
作者:
吾名楠
时间:
2018-11-16 23:16
来学习
来学习
来学习
来学习
来学习
来学习
作者:
geny28
时间:
2018-11-16 23:45
学习
学习
牛牛牛
作者:
cnmice
时间:
2018-11-16 23:52
谢谢分享,向你学习
作者:
饭没了秀
时间:
2018-11-17 08:18
可以呀,看完可以再进一步了。
作者:
李洛语HL
时间:
2018-11-17 09:41
这个可以有
作者:
haoqi2015
时间:
2018-11-17 12:40
学习是进步的阶梯,前人种树,后面人享用,感谢。
作者:
天辰软件
时间:
2018-11-17 13:13
#在这里快速回复#感谢分享~~~~
作者:
划落的天空
时间:
2018-11-17 15:30
还有人用C 哦 看下
作者:
daijinqq
时间:
2018-11-17 15:44
看下课程 还不错
作者:
jhaa888888
时间:
2018-11-17 16:30
下来研究一下,谢谢楼主分享
作者:
午间雪
时间:
2018-11-17 17:51
看一看。看一看。
作者:
yyyph
时间:
2018-11-17 18:07
看看内容,使用c++编译吧。
作者:
yyyph
时间:
2018-11-17 19:17
易语言支持库开发手册2013版.zip ,这个文件下载后解压,提示文件是损坏的,楼主麻烦重上传一下。
作者:
天辰软件
时间:
2018-11-18 00:00
支持开源~!感谢分享
作者:
邪魅天涯
时间:
2018-11-18 00:52
为啥不用VC编写支持库,C太麻烦了
作者:
41774416
时间:
2018-11-18 10:14
支持一下 看看 是啥
作者:
huixin
时间:
2018-11-18 12:02
支持一下 看看
作者:
超级の赛亚人
时间:
2018-11-18 13:08
很不错的教程。。。。
作者:
lee20
时间:
2018-11-18 13:36
{:3_41:}{:3_41:}{:3_41:}{:3_41:}{:3_41:}
作者:
妖孽书生
时间:
2018-11-18 15:08
很不错,正在学写支持库教程!
作者:
就想改个名字
时间:
2018-11-18 15:22
多谢分享!
作者:
来此一游
时间:
2018-11-18 17:53
用c语言写,难道易语言就写不了吗?
作者:
天辰软件
时间:
2018-11-18 21:10
每天都来顶一下!!!
作者:
fq19851220
时间:
2018-11-19 03:59
期待继续更新
作者:
鹏鹏2014
时间:
2018-11-19 12:53
谢谢!学习一下
作者:
wt2014822
时间:
2018-11-19 13:57
感谢分享,楼主厉害
作者:
空丶城
时间:
2018-11-19 17:11
谢谢分享~~~~~~~~
作者:
ZorKing
时间:
2018-11-19 22:32
很给力哦...
作者:
yyqingying
时间:
2018-11-19 23:26
作者:
314550799
时间:
2018-11-20 11:32
大佬膜拜,学习学习
作者:
小波学易
时间:
2018-11-20 13:04
作者:
By:北辰
时间:
2018-11-20 21:03
想请问是什么原因导致没有办法调用到WindowProc的呢?
作者:
城风蔚然
时间:
2018-11-21 09:12
话说学了这个是不是可以用c语言写oracle的支持库吗?
@项目部002
作者:
左寒羽
时间:
2018-11-21 09:29
嘿嘿,不错,鼎力支持!!...
作者:
拿铁777
时间:
2018-11-21 09:45
学习学习一下,希望能用到。
作者:
shenxuexiong
时间:
2018-11-21 10:46
感谢.酷酷...............
作者:
3082
时间:
2018-11-21 14:19
我看看......
作者:
忧郁之子
时间:
2018-11-21 14:27
虽然看不懂C但是还是支持一下
作者:
tiandeng
时间:
2018-11-21 14:44
什么方法啊 楼主 学习一下 谢谢楼主 了
作者:
tiandeng
时间:
2018-11-21 18:05
什么方法啊 楼主 学习一下 谢谢楼主 了
作者:
181286670
时间:
2018-11-22 09:04
下载看看!
作者:
zmoli775
时间:
2018-11-22 15:58
这个也不错·很好很好很漂亮!
作者:
world
时间:
2018-11-23 10:28
学习一下子
作者:
水镜!
时间:
2018-11-26 01:45
感谢分享,很有用,
作者:
mysticz
时间:
2018-12-3 10:45
刚好学的C语言可以派上用场
作者:
Onizuka
时间:
2018-12-5 11:01
易语言简单还是C语音简单?
作者:
冬季恋歌
时间:
2018-12-7 12:39
虽然看不懂但是好像很厉害的样子
作者:
天辰软件
时间:
2018-12-14 20:50
支持开源~!感谢分享
作者:
冷空气
时间:
2018-12-27 13:13
学习一下子
作者:
syx5000
时间:
2019-3-16 13:50
zhge hen di lsdkn
作者:
ws440506
时间:
2019-4-2 07:58
这个东西的确不错,支持了。
作者:
gyteme
时间:
2019-4-4 11:26
支持,不错了!
作者:
ws440506
时间:
2019-4-4 18:41
顶一下,顺便赚点精币
作者:
Solo98k
时间:
2019-5-6 13:52
学习一下,{:3_54:}{:3_54:}{:3_54:}
作者:
903077357
时间:
2019-5-24 19:34
顶一下,顺便赚点精币
作者:
我爱黑暗
时间:
2019-5-25 22:50
C 在哪里下载
作者:
咖啡加安眠药
时间:
2019-6-1 21:42
提示:
作者被禁止或删除 内容自动屏蔽
作者:
精益娃娃
时间:
2019-6-28 00:25
感谢分享!!谢谢
作者:
boxxie
时间:
2019-6-28 09:38
多谢楼主分享哟
作者:
忘记方位
时间:
2019-6-28 12:28
提示:
作者被禁止或删除 内容自动屏蔽
作者:
心智帅哥
时间:
2019-7-9 21:39
谢谢楼主分享
作者:
LSXAN
时间:
2019-7-13 20:09
支持支持,感谢分享~
作者:
江洪滨
时间:
2019-7-31 10:07
支持开源~!感谢分享
作者:
ramoon
时间:
2019-9-3 15:26
什么时候出一个详细点用VS2017以上版本开发C++静态库的教程就号了
作者:
精准定向引流
时间:
2019-9-5 09:46
感谢分享,很给力!~
作者:
精准定向引流
时间:
2019-9-5 09:46
顶一下,顺便赚点精币
作者:
mleaf
时间:
2019-9-27 17:21
支持楼主,本来我打算出个教程的,看来不用费心了。
作者:
zxy2019
时间:
2019-10-30 14:32
作者:
zxy2019
时间:
2019-10-31 10:17
作者:
Yaaaaa
时间:
2019-10-31 16:54
支持开源~!感谢分享
作者:
小鱼京鱼
时间:
2019-11-1 17:50
感谢分享,支持支持
作者:
ruanjiahui
时间:
2019-11-5 21:57
提示:
作者被禁止或删除 内容自动屏蔽
作者:
空空白白白
时间:
2019-11-9 10:25
一起学习加我q1599735587 懂的加
作者:
jiahui
时间:
2019-11-10 16:19
感谢分享 支持开源
作者:
大二鱼
时间:
2019-12-17 15:46
我膨胀了 编写支持库我都敢点进来看了
作者:
289062596
时间:
2020-1-17 20:12
感谢分享 支持开源
作者:
847950462
时间:
2020-2-27 20:45
感谢分享
作者:
北夏
时间:
2020-3-15 18:17
感谢分享
作者:
Txyzqiuyi
时间:
2020-3-24 18:07
感谢分享啊
作者:
MrSean
时间:
2020-5-10 16:16
感谢发布原创作品,一定好好学习,天天向上
作者:
cdx123
时间:
2020-5-29 15:53
路过看看~~
作者:
cdx123
时间:
2020-5-30 23:20
路过看看~~~~~~
作者:
兔兔想吃糖糖
时间:
2020-6-10 12:15
感谢分享,支持~努力学习
作者:
epuuyg
时间:
2020-6-24 14:25
我还以为是视频教程呢
作者:
大头鬼2
时间:
2020-7-9 01:03
支持一下支持一下支持一下支持一下支持一下支持一下
作者:
44944
时间:
2020-7-10 13:00
感谢分享,支持~努力学习
作者:
玄易
时间:
2020-10-17 20:04
学习,学习一下
作者:
哥只是一个传说
时间:
2021-5-25 19:19
文件为什么删除了??晕
作者:
HeAX
时间:
2021-7-27 13:45
感谢分享
作者:
hyq0367
时间:
2021-9-13 08:25
C语言编写易语言支持库系列课程
作者:
bobo5057
时间:
2021-9-29 08:06
学习一下能做出个新东西吗
作者:
风雨彩虹
时间:
2021-10-15 10:39
谢谢分享
作者:
737109078
时间:
2021-10-20 18:56
学习学习.....
作者:
pd8ai4
时间:
2021-12-21 15:17
学习一下。
欢迎光临 精易论坛 (https://125.confly.eu.org/)
Powered by Discuz! X3.4