用c++ 给易语言写支持库学习记录
废话我就不对说 直接开始
易语言官方下载的易语言安装路径下 有一个SDK文件夹
我们点进入cpp文件夹里面提供是c++的SDK
elib文件夹里就是sdk 我们新建一个win32项目
这里我用的是VS2015
创建一个空的项目
包含易语言官方的SDK目录即可
需要注意的地方是 预定义处理里面 如果你需要编译成静态库的话 这两个是必不可少的
代码生成选择多线程(MT)
目标平台选择7.0 支持XP系统
如果需要生成fne后缀的(动态链接库)无法静态编译
预处理器需要这样设置 因为dll和lib的宏名不一样如果填写的不对 生成的就不对
主要实现 入口函数dllMain
main.cpp
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
main.cpp
功能实现 Elibfne.h 头文件
#ifndef __ELIBFNE__
#define __ELIBFNE__
#include <windows.h>
#include <tchar.h>
#include <cassert>
#if 1 //易语言SDK 必须带的
#include <lib2.h>
#include <lang.h>
#include <fnshare.h>
#include <fnshare.cpp>
#endif
#define LIBARAYNAME "ELIB_MessageNotify"
EXTERN_C void AddFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf);
EXTERN_C void SubFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf);
EXTERN_C void MulFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf);
EXTERN_C void DivFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf);
EXTERN_C INT WINAPI ELIB_MessageNotify(INT nMsg, DWORD dwParam1, DWORD dwParam2);
#ifndef __E_STATIC_LIB
#define LIB_GUID_STR "{1BF8530F-D7F9-4FE2-B94D-1906950FE19F}" /*GUID串: // {E0E54C4E-67DA-47C6-89BE-0DF9E8360AAA}, 必须使用guidgen.exe生成 数字签名*/
#define LIB_MajorVersion 1 /*库主版本号*/
#define LIB_MinorVersion 1 /*库次版本号*/
#define LIB_BuildNumber 20180810 /*构建版本号*/
#define LIB_SysMajorVer 3 /*系统主版本号*/
#define LIB_SysMinorVer 0 /*系统次版本号*/
#define LIB_KrnlLibMajorVer 3 /*核心库主版本号*/
#define LIB_KrnlLibMinorVer 0 /*核心库次版本号*/
#define LIB_NAME_STR "Elib_TEST" /*支持库名*/
#define LIB_DESCRIPTION_STR "\r\n简单的测试下封装支持库\r\n\
吹牛逼专用" /*功能描述*/
#define LIB_Author " ┏━━━━━ Cool ━━━━┓" /*作者名称*/
#define LIB_ZipCode " ┣━━━━━━━━━━━━━━┫" /*邮政编码*/
#define LIB_Address " ┃ QQ:252858527 ┃" /*通信地址*/
#define LIB_Phone " ┣━━━━━━━━━━━━━━┫" /*电话号码*/
#define LIB_Fax " ┃ JBec:http://dwz.cn/jb-ec ┃" /*QQ号码*/
#define LIB_Email " ┣━━━━━━━━━━━━━━┫" /*电子邮箱*/
#define LIB_HomePage " ┃ NULL ┃" /*主页地址*/
#define LIB_Other " ┗━━━━━━━━━━━━━━┛" /*其它信息*/
#define LIB_TYPE_COUNT 1 /*命令分类数量*/
#define LIB_TYPE_STR "0000基本命令\0""\0" /*命令分类*/
#endif #endif
ElibFne.h
功能实现 Elibfne.cpp 源文件
#include "ElibFne.h" /*
@ 常量 定义导出
*/ #ifndef __E_STATIC_LIB LIB_CONST_INFO constStruct[] =
{
/*
常量参数注释
@ 中文名称
@ 英文名称
@ 常量的介绍
@ 命令的学习难度级别
@ 常量类型
@ 文本类型存放的内容
@ 布尔类型 浮点类型存放的内容
*/
{ _WT("ELB_VERSION"), _WT("取ELIB版本"), _WT("获取支持库版本号 返回文本型内容"), LVL_HIGH, CT_TEXT, _WT("1.0"), NULL },//文本常量
{_WT("ELB_BOOL"),_WT("ELB布尔类型常量"),_WT("测试ELB布尔类型 常量返回布尔类型内容"),LVL_SIMPLE,CT_BOOL,NULL,},
{ _WT("ELB_DOUBLE"),_WT("ELB小数类型常量"),_WT("测试ELB浮点类型 常量返回浮点类型内容"),LVL_SIMPLE,CT_NUM,NULL,} };
/*
@ 导出 结构体类型
*/
LIB_DATA_TYPE_ELEMENT structIntType[] =
{
/*{ 成员类型 ,数组成员 , 中文名称 ,英文名称 ,成员解释 ,枚举类型 ,默认值}*/
{ SDT_INT, NULL,_T("左边"), _T("left"), _T("left"), NULL, },
{ SDT_INT, NULL,_T("定边"), _T("top"), _T("top"), NULL, },
{ SDT_INT, NULL,_T("右边"), _T("right"), _T("right"), NULL, },
{ SDT_INT, NULL,_T("底边"), _T("bottom"), _T("bottom"), NULL, }
};
LIB_DATA_TYPE_ELEMENT structTypes[] =
{
/*{ 成员类型 ,数组成员 , 中文名称 ,英文名称 ,成员解释 ,枚举类型 ,默认值}*/
{ SDT_TEXT, NULL,_T("数据内容"), _T("data"), _T("要发送的文本数据"), NULL, },
{ SDT_SHORT, NULL,_T("短整数类型"), _T("short"), _T("短整数类型测试"), NULL, },
{ SDT_FLOAT, NULL,_T("小数类型测试"), _T("float"), _T("小数类型测试"), NULL, },
{ SDT_BOOL, NULL,_T("布尔类型"), _T("Boolean"), _T("布尔类型测试"), NULL, },
{ SDT_DATE_TIME, NULL,_T("日期时间类型测试"), _T("TimeDate"), _T("日期时间类型测试"), NULL, },
{ SDT_SUB_PTR, NULL,_T("子程序指针类型测试"), _T("SUBPTR"), _T("子程序指针类型测试"), NULL, },
{ SDT_BIN, NULL,_T("字节集类型测试"), _T("bin"), _T("字节集类型测试"), NULL, }
}; static LIB_DATA_TYPE_INFO DataTypes[] =
{
/* { 中文名称, 英文名称, 数据描述, 索引数量, 命令索引, 对象状态, 图标索引, 事件数量, 事件指针, 属性数量, 属性指针, 界面指针, 元素数量, 元素指针 } */
{ _WT("矩形"), _WT("RECT"), _WT("窗口矩形数据结构"), , NULL, NULL, , , NULL, , NULL, NULL, sizeof(structIntType) / sizeof(structIntType[]), structIntType },
{ _WT("复杂数据结构"), _WT("Struct"), _WT("测试多种数据类型"), , NULL, NULL, , , NULL, , NULL, NULL, sizeof(structTypes) / sizeof(structTypes[]), structTypes }
};
#endif // !1 /*
函数的实现都需要定义在宏的外面以便静态和动态库都能使用,但ExecuteCommand,Commands则只需定义在宏的里面供动态库使用。
pRetData 输出数据指针。当对应CMD_INFO中m_dtRetType为_SDT_NULL(即定义无返回值)时,pRetData无效;
iArgCount 函数参数个数
pArgInf 函数参数指针
*/
EXTERN_C void AddFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf)
{
if (iArgCount==)
{
pRetData->m_int = pArgInf[].m_int + pArgInf[].m_int;
}
return;
} EXTERN_C void SubFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf)
{
if (iArgCount == )
{
pRetData->m_int = pArgInf[].m_int - pArgInf[].m_int;
}
return;
} EXTERN_C void MulFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf)
{
if (iArgCount == )
{
pRetData->m_int = pArgInf[].m_int * pArgInf[].m_int;
}
return;
} EXTERN_C void DivFunc(PMDATA_INF pRetData, INT iArgCount, PMDATA_INF pArgInf)
{
if (iArgCount == && pArgInf[].m_int!=)
{
pRetData->m_int = pArgInf[].m_int / pArgInf[].m_int;
}
return;
} #ifndef __E_STATIC_LIB
PFN_EXECUTE_CMD ExecuteCommand[] =
{
// 所有需要库中调用的 函数 都列在这里,用逗号隔开
AddFunc,
SubFunc,
MulFunc,
DivFunc
}; static const char* const CommandNames[] =
{
// 所有需要库中调用的 函数名 都写在这里,用逗号隔开
"AddFunc",
"SubFunc",
"MulFunc",
"DivFunc"
};
/*----------------定义支持库命令参数表-----------------------*/
ARG_INFO AddFunc_CommandArgs[] =
{
//函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开
/* { 参数名称, 参数描述, 图像索引, 图像数量, 参数类型(参见SDT_), 默认数值, 参数类别(参见AS_) } */
{ _WT("arg1"), _WT("arg1"), , , SDT_INT, NULL, NULL },
{ _WT("arg2"), _WT("arg2"), , , SDT_INT, NULL, NULL }
};
ARG_INFO SubFunc_CommandArgs[] =
{
//函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开
/* { 参数名称, 参数描述, 图像索引, 图像数量, 参数类型(参见SDT_), 默认数值, 参数类别(参见AS_) } */
{ _WT("arg1"), _WT("arg1"), , , SDT_INT, NULL, NULL },
{ _WT("arg2"), _WT("arg2"), , , SDT_INT, NULL, NULL }
};
ARG_INFO MulFunc_CommandArgs[] =
{
//函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开
/* { 参数名称, 参数描述, 图像索引, 图像数量, 参数类型(参见SDT_), 默认数值, 参数类别(参见AS_) } */
{ _WT("arg1"), _WT("arg1"), , , SDT_INT, NULL, NULL },
{ _WT("arg2"), _WT("arg2"), , , SDT_INT, NULL, NULL }
};
ARG_INFO DivFunc_CommandArgs[] =
{
//函数参数数组定义写在这里,每个{}为一个参数的表述,用逗号隔开
/* { 参数名称, 参数描述, 图像索引, 图像数量, 参数类型(参见SDT_), 默认数值, 参数类别(参见AS_) } */
{ _WT("arg1"), _WT("arg1"), , , SDT_INT, NULL, NULL },
{ _WT("arg2"), _WT("arg2"), , , SDT_INT, NULL, NULL }
}; /*---------------声明要导出的支持库命令----------------------*/
static CMD_INFO Commands[] =
{
/* { 中文名称, 英文名称, 对象描述, 所属类别(-1是数据类型的方法), 命令状态(CT_), 返回类型(SDT_), 此值保留, 对象等级(LVL_), 图像索引, 图像数量, 参数个数, 参数信息 } */ //{ _WT("GetAmongText"), _WT("取关键词间文本"), _WT("截取两个关键词之间的文本"), 1,NULL, SDT_TEXT, 0, LVL_SECONDARY,0,0, 5, fnGetAmongstr_CommandArgs } , { _WT("ELIB_加法"), _WT("AddFunc"), _WT("加法运算 返回类型整数型"), , NULL, SDT_INT, , LVL_SIMPLE, , , , AddFunc_CommandArgs },
{ _WT("ELIB_减法"), _WT("SubFunc"), _WT("减法运算 返回类型整数型"), , NULL, SDT_INT, , LVL_SIMPLE, , , , SubFunc_CommandArgs },
{ _WT("ELIB_乘法"), _WT("MulFunc"), _WT("乘法运算 返回类型整数型"), , NULL, SDT_INT, , LVL_SIMPLE, , , , MulFunc_CommandArgs },
{ _WT("ELIB_除法"), _WT("DivFunc"), _WT("除法运算 返回类型整数型"), , NULL, SDT_INT, , LVL_SIMPLE, , , , DivFunc_CommandArgs }, }; #endif
/*-----------------支持库消息处理函数------------------*/ EXTERN_C INT WINAPI ELIB_MessageNotify(INT nMsg, DWORD dwParam1, DWORD dwParam2)
{
#ifndef __E_STATIC_LIB
if (nMsg == NL_GET_CMD_FUNC_NAMES) // 返回所有命令实现函数的的函数名称数组(char*[]), 支持静态编译的动态库必须处理
return (INT)CommandNames;
else if (nMsg == NL_GET_NOTIFY_LIB_FUNC_NAME) // 返回处理系统通知的函数名称(PFN_NOTIFY_LIB函数名称), 支持静态编译的动态库必须处理
return (INT)LIBARAYNAME;
else if (nMsg == NL_GET_DEPENDENT_LIBS) return (INT)NULL;
// 返回静态库所依赖的其它静态库文件名列表(格式为\0分隔的文本,结尾两个\0), 支持静态编译的动态库必须处理
// kernel32.lib user32.lib gdi32.lib 等常用的系统库不需要放在此列表中
// 返回NULL或NR_ERR表示不指定依赖文件
#endif
return ProcessNotifyLib(nMsg, dwParam1, dwParam2);
}
/*定义支持库基本信息*/
#ifndef __E_STATIC_LIB
static LIB_INFO LibInfo =
{
/* { 库格式号, GUID串号, 主版本号, 次版本号, 构建版本号, 系统主版本号, 系统次版本号, 核心库主版本号, 核心库次版本号,
支持库名, 支持库语言, 支持库描述, 支持库状态,
作者姓名, 邮政编码, 通信地址, 电话号码, 传真号码, 电子邮箱, 主页地址, 其它信息,
类型数量, 类型指针, 类别数量, 命令类别, 命令总数, 命令指针, 命令入口,
附加功能, 功能描述, 消息指针, 超级模板, 模板描述,
常量数量, 常量指针, 外部文件} */
LIB_FORMAT_VER,
_T(LIB_GUID_STR),
LIB_MajorVersion,
LIB_MinorVersion,
LIB_BuildNumber,
LIB_SysMajorVer,
LIB_SysMinorVer,
LIB_KrnlLibMajorVer,
LIB_KrnlLibMinorVer,
_T(LIB_NAME_STR),
__GBK_LANG_VER,
_WT(LIB_DESCRIPTION_STR),
_LIB_OS(__OS_WIN),
_WT(LIB_Author),
_WT(LIB_ZipCode),
_WT(LIB_Address),
_WT(LIB_Phone),
_WT(LIB_Fax),
_WT(LIB_Email),
_WT(LIB_HomePage),
_WT(LIB_Other),
sizeof(DataTypes) / sizeof(DataTypes[]),
DataTypes,
LIB_TYPE_COUNT,
_WT(LIB_TYPE_STR),
sizeof(Commands) / sizeof(Commands[]),
Commands,
ExecuteCommand,
NULL,
NULL,
ELIB_MessageNotify,
NULL,
NULL,
sizeof(constStruct) / sizeof(constStruct[]),
constStruct,
NULL
};
PLIB_INFO WINAPI GetNewInf()
{
return (&LibInfo);
};
#endif
Elibfne.cpp
编译生成完以后分别把.fne和静态库文件复制到易语言lib目录和static_lib目录下即可
复制到易语言安装目录下的lib目前下
复制到易语言安装目录下的static_lib目前下
打开易语言选择你刚添加的支持库测试即可
测试结果可用
也可以下载 当前项目 链接: https://share.weiyun.com/51Z3Bxn (密码:bCDD)
用c++ 给易语言写支持库学习记录的更多相关文章
- Windows2003/2008/2008 R2下易语言点支持库配置就退出的问题
问题: 请问一个问题,我的电脑上win2003系统的,安装了易语言后,一点支持库配置就会自动退出.这是为什么啊? 解决方法如下: 删除 lib下的wmp.npk,重新打开易语言就可以了.
- UNIX环境下用C语言写静态库与动态库
静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS ...
- argparse库 学习记录
初始化 始见参数 name or flags action nargs default type choices required help dest metavar 总结 继上次的optparser ...
- JSTL标签库学习记录1-c
JSTL全称为JSP Standard Tag Library,即JSP标准标签库. 导入JSTL相关的JAR包,jstl.jar standard.jar 导入jstl标签库: <%@tagl ...
- JSTL标签库学习记录2-fmt
fmt的标签为辅助性功能标签 设置编码 <fmt:requestEncoding value=""> 国际化相关 <fmt:setLocale value=&qu ...
- 写点C++ 学习记录 充数
#include "stdafx.h" #include <cstdlib> #include <iostream> using namespace std ...
- 易语言调用csharp写的COM组件的程序在Win2008上奔溃的解决办法
易语言调用csharp写的COM组件,除了要注册csharp写的dll之外(由于是.net代码,需要用.net自带的注册工具RegAsm.exe注册,具体注册方法为: C:\WINDOWS\Micro ...
- 易语言效率与C++究竟差多少(质数和计算)
文本首发bIlibili,cnblogs为作者补发,如在其他平台看见本文,均为经允许的盗窃 易语言作为款主打 中文 易用 编程的开发软件.但是很多人都在批评易语言的效率. 我们今天通过 质数和计算 来 ...
- Atitit. 真正的全中国文字attilax易语言的特点以及范例
Atitit. 真正的全中国文字attilax易语言的特点以及范例 1. 前言 attilax易语言是什么??1 2. attilax易语言的特点2 2.1. 支持多语言文字,不只汉字,还有藏文,维文 ...
随机推荐
- SDUT-3335_数据结构实验之栈与队列八:栈的基本操作
数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具 ...
- keep-alive vue组件缓存避免多次加载相应的组件
keep-alive vue组件缓存避免多次加载相应的组件
- C# Find vs FirstOrDefault
本文告诉大家,在获得数组第一个元素时,使用哪个方法性能更高. 需要知道,两个方法都是 Linq 的方法,使用之前需要引用 Linq .对于 List 等都是继承可枚举Enumerable这时获取第一个 ...
- kubernetes API 访问控制在阿里云容器服务(ACK)上的实践
提起K8s API的访问控制,很多同学应该都会想到RBAC,这是K8s用来做权限控制的方法,但是K8s对API的访问控制却不止于此,今天我们就来简单介绍下K8s的访问控制以及ACK如何利用这套方法提供 ...
- Java排序算法总结
1.冒泡排序 冒泡排序是排序算法中最基本的一种排序方法,该方法逐次比较两个相邻数据的大小并交换位置来完成对数据排序,每次比较的结果都找出了这次比较中数据的最大项,因为是逐次比较,所以效率是O(N^2) ...
- 新浪微博API错误代码说明对照表 http://open.weibo.com/wiki/Error_code
http://open.weibo.com/wiki/Error_code 这篇文章资料是从新浪微博开发平台分享过来,一方面是博主自己开发过程遇到问题对错误代码的快捷查询,不用每次都得到官方找:另一方 ...
- phpmyadmin设置自动登录和取消自动登录
1首先在phpmyadmin安装目录下找到config.sample.inc.php复制一份文件名改为config.inc.php 2打开config.inc.php 找到 $cfg['Serve ...
- SuperSocket特点
² 简单易用,只需要几个类就能创建出健壮的Socket服务器端程序 ² 性能优良, 稳定可靠 ² 支持各种协议, 内置的协议解析工具让你把实现通信协议这种复杂的工作变得很简单 ² 自动支持SS ...
- 移动端Chrome Inspect调试 (Android通过Chrome Inspect调试WebView的H5)(ios手机safari,chrome调试 windows)(如果inspect的时候,是空白)
ios +chrome调试 引用https://segmentfault.com/a/1190000015428430 iTunes ios-webkit-debug-proxy-1.8-win64- ...
- [转载] 虚拟机3种网络模式(NAT, Host-only, Bridged)
实例讲解虚拟机3种网络模式(桥接.nat.Host-only) 转载自:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html ...