用c++ 给易语言写支持库学习记录
废话我就不对说 直接开始
易语言官方下载的易语言安装路径下 有一个SDK文件夹
我们点进入cpp文件夹里面提供是c++的SDK
elib文件夹里就是sdk 我们新建一个win32项目
这里我用的是VS2015
创建一个空的项目
包含易语言官方的SDK目录即可
需要注意的地方是 预定义处理里面 如果你需要编译成静态库的话 这两个是必不可少的
代码生成选择多线程(MT)
目标平台选择7.0 支持XP系统
如果需要生成fne后缀的(动态链接库)无法静态编译
预处理器需要这样设置 因为dll和lib的宏名不一样如果填写的不对 生成的就不对
主要实现 入口函数dllMain
main.cpp
1 #include <windows.h> 2 BOOL APIENTRY DllMain(HMODULE hModule, 3 DWORD ul_reason_for_call, 4 LPVOID lpReserved 5 ) 6 { 7 switch (ul_reason_for_call) 8 { 9 case DLL_PROCESS_ATTACH: 10 case DLL_THREAD_ATTACH: 11 case DLL_THREAD_DETACH: 12 case DLL_PROCESS_DETACH: 13 break; 14 } 15 return TRUE; 16 }
main.cpp
功能实现 Elibfne.h 头文件
1 #ifndef __ELIBFNE__ 2 #define __ELIBFNE__ 3 #include <windows.h> 4 #include <tchar.h> 5 #include <cassert> 6 #if 1 //易语言SDK 必须带的 7 #include <lib2.h> 8 #include <lang.h> 9 #include <fnshare.h> 10 #include <fnshare.cpp> 11 #endif 12 #define LIBARAYNAME "ELIB_MessageNotify" 13 EXTERN_C void AddFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf); 14 EXTERN_C void SubFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf); 15 EXTERN_C void MulFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf); 16 EXTERN_C void DivFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf); 17 EXTERN_C INT WINAPI ELIB_MessageNotify(INT nMsg, DWORD dwParam1, DWORD dwParam2); 18 #ifndef __E_STATIC_LIB 19 #define LIB_GUID_STR "{1BF8530F-D7F9-4FE2-B94D-1906950FE19F}" /*GUID串: // {E0E54C4E-67DA-47C6-89BE-0DF9E8360AAA}, 必须使用guidgen.exe生成 数字签名*/ 20 #define LIB_MajorVersion 1 /*库主版本号*/ 21 #define LIB_MinorVersion 1 /*库次版本号*/ 22 #define LIB_BuildNumber 20180810 /*构建版本号*/ 23 #define LIB_SysMajorVer 3 /*系统主版本号*/ 24 #define LIB_SysMinorVer 0 /*系统次版本号*/ 25 #define LIB_KrnlLibMajorVer 3 /*核心库主版本号*/ 26 #define LIB_KrnlLibMinorVer 0 /*核心库次版本号*/ 27 #define LIB_NAME_STR "Elib_TEST" /*支持库名*/ 28 #define LIB_DESCRIPTION_STR "\r\n简单的测试下封装支持库\r\n\ 29 吹牛逼专用" /*功能描述*/ 30 #define LIB_Author " ┏━━━━━ Cool ━━━━┓" /*作者名称*/ 31 #define LIB_ZipCode " ┣━━━━━━━━━━━━━━┫" /*邮政编码*/ 32 #define LIB_Address " ┃ QQ:252858527 ┃" /*通信地址*/ 33 #define LIB_Phone " ┣━━━━━━━━━━━━━━┫" /*电话号码*/ 34 #define LIB_Fax " ┃ JBec:http://dwz.cn/jb-ec ┃" /*QQ号码*/ 35 #define LIB_Email " ┣━━━━━━━━━━━━━━┫" /*电子邮箱*/ 36 #define LIB_HomePage " ┃ NULL ┃" /*主页地址*/ 37 #define LIB_Other " ┗━━━━━━━━━━━━━━┛" /*其它信息*/ 38 #define LIB_TYPE_COUNT 1 /*命令分类数量*/ 39 #define LIB_TYPE_STR "0000基本命令\0""\0" /*命令分类*/ 40 #endif 41 42 #endif
ElibFne.h
功能实现 Elibfne.cpp 源文件
1 #include "ElibFne.h" 2 3 /* 4 @ 常量 定义导出 5 */ 6 7 #ifndef __E_STATIC_LIB 8 9 LIB_CONST_INFO constStruct[] = 10 { 11 /* 12 常量参数注释 13 @ 中文名称 14 @ 英文名称 15 @ 常量的介绍 16 @ 命令的学习难度级别 17 @ 常量类型 18 @ 文本类型存放的内容 19 @ 布尔类型 浮点类型存放的内容 20 */ 21 { _WT("ELB_VERSION"), _WT("取ELIB版本"), _WT("获取支持库版本号 返回文本型内容"), LVL_HIGH, CT_TEXT, _WT("1.0"), NULL },//文本常量 22 {_WT("ELB_BOOL"),_WT("ELB布尔类型常量"),_WT("测试ELB布尔类型 常量返回布尔类型内容"),LVL_SIMPLE,CT_BOOL,NULL,1}, 23 { _WT("ELB_DOUBLE"),_WT("ELB小数类型常量"),_WT("测试ELB浮点类型 常量返回浮点类型内容"),LVL_SIMPLE,CT_NUM,NULL,1} 24 25 }; 26 /* 27 @ 导出 结构体类型 28 */ 29 LIB_DATA_TYPE_ELEMENT structIntType[] = 30 { 31 /*{ 成员类型 ,数组成员 , 中文名称 ,英文名称 ,成员解释 ,枚举类型 ,默认值}*/ 32 { SDT_INT, NULL,_T("左边"), _T("left"), _T("left"), NULL, 0}, 33 { SDT_INT, NULL,_T("定边"), _T("top"), _T("top"), NULL, 0 }, 34 { SDT_INT, NULL,_T("右边"), _T("right"), _T("right"), NULL, 0 }, 35 { SDT_INT, NULL,_T("底边"), _T("bottom"), _T("bottom"), NULL, 0 } 36 }; 37 LIB_DATA_TYPE_ELEMENT structTypes[] = 38 { 39 /*{ 成员类型 ,数组成员 , 中文名称 ,英文名称 ,成员解释 ,枚举类型 ,默认值}*/ 40 { SDT_TEXT, NULL,_T("数据内容"), _T("data"), _T("要发送的文本数据"), NULL, 0}, 41 { SDT_SHORT, NULL,_T("短整数类型"), _T("short"), _T("短整数类型测试"), NULL, 0 }, 42 { SDT_FLOAT, NULL,_T("小数类型测试"), _T("float"), _T("小数类型测试"), NULL, 0 }, 43 { SDT_BOOL, NULL,_T("布尔类型"), _T("Boolean"), _T("布尔类型测试"), NULL, 0 }, 44 { SDT_DATE_TIME, NULL,_T("日期时间类型测试"), _T("TimeDate"), _T("日期时间类型测试"), NULL, 0 }, 45 { SDT_SUB_PTR, NULL,_T("子程序指针类型测试"), _T("SUBPTR"), _T("子程序指针类型测试"), NULL, 0 }, 46 { SDT_BIN, NULL,_T("字节集类型测试"), _T("bin"), _T("字节集类型测试"), NULL, 0 } 47 }; 48 49 static LIB_DATA_TYPE_INFO DataTypes[] = 50 { 51 /* { 中文名称, 英文名称, 数据描述, 索引数量, 命令索引, 对象状态, 图标索引, 事件数量, 事件指针, 属性数量, 属性指针, 界面指针, 元素数量, 元素指针 } */ 52 { _WT("矩形"), _WT("RECT"), _WT("窗口矩形数据结构"), 0, NULL, NULL, 0, 0, NULL, 0, NULL, NULL, sizeof(structIntType) / sizeof(structIntType[0]), structIntType }, 53 { _WT("复杂数据结构"), _WT("Struct"), _WT("测试多种数据类型"), 0, NULL, NULL, 0, 0, NULL, 0, NULL, NULL, sizeof(structTypes) / sizeof(structTypes[0]), structTypes } 54 }; 55 #endif // !1 56 57 /* 58 函数的实现都需要定义在宏的外面以便静态和动态库都能使用,但ExecuteCommand,Commands则只需定义在宏的里面供动态库使用。 59 pRetData 输出数据指针。当对应CMD_INFO中m_dtRetType为_SDT_NULL(即定义无返回值)时,pRetData无效; 60 iArgCount 函数参数个数 61 pArgInf 函数参数指针 62 */ 63 EXTERN_C void AddFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf) 64 { 65 if (iArgCount==2) 66 { 67 pRetData->m_int = pArgInf[0].m_int + pArgInf[1].m_int; 68 } 69 return; 70 } 71 72 EXTERN_C void SubFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf) 73 { 74 if (iArgCount == 2) 75 { 76 pRetData->m_int = pArgInf[0].m_int - pArgInf[1].m_int; 77 } 78 return; 79 } 80 81 EXTERN_C void MulFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf) 82 { 83 if (iArgCount == 2) 84 { 85 pRetData->m_int = pArgInf[0].m_int * pArgInf[1].m_int; 86 } 87 return; 88 } 89 90 EXTERN_C void DivFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf) 91 { 92 if (iArgCount == 2 && pArgInf[0].m_int!=0) 93 { 94 pRetData->m_int = pArgInf[0].m_int / pArgInf[1].m_int; 95 } 96 return; 97 } 98 99 100 #ifndef __E_STATIC_LIB 101 PFN_EXECUTE_CMD ExecuteCommand[] = 102 { 103 // 所有需要库中调用的 函数 都列在这里,用逗号隔开 104 AddFunc, 105 SubFunc, 106 MulFunc, 107 DivFunc 108 }; 109 110 static const char* const CommandNames[] = 111 { 112 // 所有需要库中调用的 函数名 都写在这里,用逗号隔开 113 "AddFunc", 114 "SubFunc", 115 "MulFunc", 116 "DivFunc" 117 }; 118 /*----------------定义支持库命令参数表-----------------------*/ 119 ARG_INFO AddFunc_CommandArgs[] = 120 { 121 //函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开 122 /* { 参数名称, 参数描述, 图像索引, 图像数量, 参数类型(参见SDT_), 默认数值, 参数类别(参见AS_) } */ 123 { _WT("arg1"), _WT("arg1"), 0, 0, SDT_INT, NULL, NULL }, 124 { _WT("arg2"), _WT("arg2"), 0, 0, SDT_INT, NULL, NULL } 125 }; 126 ARG_INFO SubFunc_CommandArgs[] = 127 { 128 //函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开 129 /* { 参数名称, 参数描述, 图像索引, 图像数量, 参数类型(参见SDT_), 默认数值, 参数类别(参见AS_) } */ 130 { _WT("arg1"), _WT("arg1"), 0, 0, SDT_INT, NULL, NULL }, 131 { _WT("arg2"), _WT("arg2"), 0, 0, SDT_INT, NULL, NULL } 132 }; 133 ARG_INFO MulFunc_CommandArgs[] = 134 { 135 //函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开 136 /* { 参数名称, 参数描述, 图像索引, 图像数量, 参数类型(参见SDT_), 默认数值, 参数类别(参见AS_) } */ 137 { _WT("arg1"), _WT("arg1"), 0, 0, SDT_INT, NULL, NULL }, 138 { _WT("arg2"), _WT("arg2"), 0, 0, SDT_INT, NULL, NULL } 139 }; 140 ARG_INFO DivFunc_CommandArgs[] = 141 { 142 //函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开 143 /* { 参数名称, 参数描述, 图像索引, 图像数量, 参数类型(参见SDT_), 默认数值, 参数类别(参见AS_) } */ 144 { _WT("arg1"), _WT("arg1"), 0, 0, SDT_INT, NULL, NULL }, 145 { _WT("arg2"), _WT("arg2"), 0, 0, SDT_INT, NULL, NULL } 146 }; 147 148 /*---------------声明要导出的支持库命令----------------------*/ 149 static CMD_INFO Commands[] = 150 { 151 /* { 中文名称, 英文名称, 对象描述, 所属类别(-1是数据类型的方法), 命令状态(CT_), 返回类型(SDT_), 此值保留, 对象等级(LVL_), 图像索引, 图像数量, 参数个数, 参数信息 } */ 152 153 //{ _WT("GetAmongText"), _WT("取关键词间文本"), _WT("截取两个关键词之间的文本"), 1,NULL, SDT_TEXT, 0, LVL_SECONDARY,0,0, 5, fnGetAmongstr_CommandArgs } , 154 155 { _WT("ELIB_加法"), _WT("AddFunc"), _WT("加法运算 返回类型整数型"), 1, NULL, SDT_INT, 0, LVL_SIMPLE, 0, 0, 2, AddFunc_CommandArgs }, 156 { _WT("ELIB_减法"), _WT("SubFunc"), _WT("减法运算 返回类型整数型"), 1, NULL, SDT_INT, 0, LVL_SIMPLE, 0, 0, 2, SubFunc_CommandArgs }, 157 { _WT("ELIB_乘法"), _WT("MulFunc"), _WT("乘法运算 返回类型整数型"), 1, NULL, SDT_INT, 0, LVL_SIMPLE, 0, 0, 2, MulFunc_CommandArgs }, 158 { _WT("ELIB_除法"), _WT("DivFunc"), _WT("除法运算 返回类型整数型"), 1, NULL, SDT_INT, 0, LVL_SIMPLE, 0, 0, 2, DivFunc_CommandArgs }, 159 160 161 }; 162 163 #endif 164 /*-----------------支持库消息处理函数------------------*/ 165 166 EXTERN_C INT WINAPI ELIB_MessageNotify(INT nMsg, DWORD dwParam1, DWORD dwParam2) 167 { 168 #ifndef __E_STATIC_LIB 169 if (nMsg == NL_GET_CMD_FUNC_NAMES) // 返回所有命令实现函数的的函数名称数组(char*[]), 支持静态编译的动态库必须处理 170 return (INT)CommandNames; 171 else if (nMsg == NL_GET_NOTIFY_LIB_FUNC_NAME) // 返回处理系统通知的函数名称(PFN_NOTIFY_LIB函数名称), 支持静态编译的动态库必须处理 172 return (INT)LIBARAYNAME; 173 else if (nMsg == NL_GET_DEPENDENT_LIBS) return (INT)NULL; 174 // 返回静态库所依赖的其它静态库文件名列表(格式为\0分隔的文本,结尾两个\0), 支持静态编译的动态库必须处理 175 // kernel32.lib user32.lib gdi32.lib 等常用的系统库不需要放在此列表中 176 // 返回NULL或NR_ERR表示不指定依赖文件 177 #endif 178 return ProcessNotifyLib(nMsg, dwParam1, dwParam2); 179 } 180 /*定义支持库基本信息*/ 181 #ifndef __E_STATIC_LIB 182 static LIB_INFO LibInfo = 183 { 184 /* { 库格式号, GUID串号, 主版本号, 次版本号, 构建版本号, 系统主版本号, 系统次版本号, 核心库主版本号, 核心库次版本号, 185 支持库名, 支持库语言, 支持库描述, 支持库状态, 186 作者姓名, 邮政编码, 通信地址, 电话号码, 传真号码, 电子邮箱, 主页地址, 其它信息, 187 类型数量, 类型指针, 类别数量, 命令类别, 命令总数, 命令指针, 命令入口, 188 附加功能, 功能描述, 消息指针, 超级模板, 模板描述, 189 常量数量, 常量指针, 外部文件} */ 190 LIB_FORMAT_VER, 191 _T(LIB_GUID_STR), 192 LIB_MajorVersion, 193 LIB_MinorVersion, 194 LIB_BuildNumber, 195 LIB_SysMajorVer, 196 LIB_SysMinorVer, 197 LIB_KrnlLibMajorVer, 198 LIB_KrnlLibMinorVer, 199 _T(LIB_NAME_STR), 200 __GBK_LANG_VER, 201 _WT(LIB_DESCRIPTION_STR), 202 _LIB_OS(__OS_WIN), 203 _WT(LIB_Author), 204 _WT(LIB_ZipCode), 205 _WT(LIB_Address), 206 _WT(LIB_Phone), 207 _WT(LIB_Fax), 208 _WT(LIB_Email), 209 _WT(LIB_HomePage), 210 _WT(LIB_Other), 211 sizeof(DataTypes) / sizeof(DataTypes[0]), 212 DataTypes, 213 LIB_TYPE_COUNT, 214 _WT(LIB_TYPE_STR), 215 sizeof(Commands) / sizeof(Commands[0]), 216 Commands, 217 ExecuteCommand, 218 NULL, 219 NULL, 220 ELIB_MessageNotify, 221 NULL, 222 NULL, 223 sizeof(constStruct) / sizeof(constStruct[0]), 224 constStruct, 225 NULL 226 }; 227 PLIB_INFO WINAPI GetNewInf() 228 { 229 return (&LibInfo); 230 }; 231 #endif
Elibfne.cpp
编译生成完以后分别把.fne和静态库文件复制到易语言lib目录和static_lib目录下即可
复制到易语言安装目录下的lib目前下
复制到易语言安装目录下的static_lib目前下
打开易语言选择你刚添加的支持库测试即可
测试结果可用
也可以下载 当前项目 链接: https://share.weiyun.com/51Z3Bxn (密码:bCDD)
转载于:https://www.cnblogs.com/guolongzheng/p/9449414.html
用c++ 给易语言写支持库学习记录相关推荐
- win10用易语言需要C环境,win10系统易语言打开支持库配置就崩溃的具体教程
有关win10系统易语言打开支持库配置就崩溃的操作方法想必大家有所耳闻.但是能够对win10系统易语言打开支持库配置就崩溃进行实际操作的人却不多.其实解决win10系统易语言打开支持库配置就崩溃的问题 ...
- 易语言传文本到c 崩溃,win7系统易语言打开支持库配置就崩溃的解决方法
今天和大家分享一下win7系统易语言打开支持库配置就崩溃问题的解决方法,在使用win7系统的过程中经常不知道如何去解决win7系统易语言打开支持库配置就崩溃的问题,有什么好的办法去解决win7系统易语 ...
- 易语言python_易语言python支持库
易语言python支持库 支持库名:易语言python支持库 1.0 版 相关文件: C:\Program Files (x86)\e\lib\pythonae.fne 数字签名:{C2547100- ...
- 易语言 服务器 xml,易语言XML支持库入门教程源码
易语言XML支持库入门教程系统结构:易语言XML支持库入门教程源码,XML支持库入门教程 ======窗口程序集1 || ||------_按钮_创建XML_被单击 || ||------_按钮_释放 ...
- 易语言支持库配置闪退丨支持库配置崩溃_易语言打开支持库配置就闪退怎么办?
易语言支持库配置闪退打不开怎么办? 易语言支持库配置闪退解决方法丨支持库配置崩溃_易语言打开支持 易语言支持库配置闪退丨支持库配置崩溃_易语言打开支持库配置就闪退怎么办? 很多人都遇到过 打开易语言支 ...
- 易语言java支持库用法,Java支持库2.0#0版
资源介绍: 易语言Javalib.fne支持库中文名为易语言Java支持库,本易语言支持库使易语言具备了访问Java类库的能力."Java虚拟机"和"Java本地接口&q ...
- c语言写易语言支持库6,易语言编写支持库
========== 1.易支持库机制 ========== !!!易支持库的库信息.命令信息等等均使用某个结构储存 !!!易源码中的自定义数据类型.类模块.组件即为支持库中的库定义数据类型 !!!易 ...
- 易语言 mysql支持库支持多线程_易语言多线程查询数据库 易语言多线程并发
为什么易语言两个线程同时对一个MYSQL数据? 数据库有自己的连接锁机制,如果是针对同一台机器使用同一个接口进行插入的话多线程和单线程是一样的.除非你有好几台数据库服务器,这样再使用多线程来进行上面的 ...
- java支持库 易语言_Java支持库|简易语言源网络|易语言资源网| e5a5x
Java支持库 支持库名称: Java支持库2.0版 相关文件: C: \ ProgramFiles(x86)\ e \ lib \ Javalib.fne 数字签名: F3DA9F65E55F47c ...
最新文章
- Vert.x 发送邮件
- 用泰勒级数来估计函数的近似值
- SVN的搭建及使用(三)用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突,重新设置用户名和密码等...
- vim编辑器全部删除文件内容
- Apache Ignite——集合分布式缓存、计算、存储的分布式框架
- python官方网站地址-index
- 低耗时、高精度,微软提出基于半监督学习的神经网络结构搜索算法 SemiNAS
- java split函数_Java split函数
- Safe handle has been closed异常的原因及解决思路
- 各省简称 拼音 缩写_求全国各城市的拼音和简写拼音。
- 表单复选框按钮全选-取消全选小案例
- python模拟上传图片_用python创建自己的等离子图片模拟
- lofter 爬虫_Python网络爬虫1 - 爬取网易LOFTER图片
- 独家 | 使用Gephi设置动态图形动画——在社会网络图中动画化时间动态行为的数据可视化教程...
- 数据结构之前序遍历,中序遍历,后序遍历
- 深夜里学妹竟然问我会不会C?我直接把这篇文章甩她脸上(C Primer Plus 第六版基础整合)
- hp-gen8安装esxi6.7找不到raid硬盘填坑
- python调用7zip命令密码解压缩
- 技术人员考研英语2001年-2007
- HijackThis日志细解--清净网络(复杂详尽)