废话我就不对说 直接开始

易语言官方下载的易语言安装路径下 有一个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++ 给易语言写支持库学习记录的更多相关文章

  1. Windows2003/2008/2008 R2下易语言点支持库配置就退出的问题

    问题: 请问一个问题,我的电脑上win2003系统的,安装了易语言后,一点支持库配置就会自动退出.这是为什么啊? 解决方法如下: 删除 lib下的wmp.npk,重新打开易语言就可以了.

  2. UNIX环境下用C语言写静态库与动态库

    静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS ...

  3. argparse库 学习记录

    初始化 始见参数 name or flags action nargs default type choices required help dest metavar 总结 继上次的optparser ...

  4. JSTL标签库学习记录1-c

    JSTL全称为JSP Standard Tag Library,即JSP标准标签库. 导入JSTL相关的JAR包,jstl.jar standard.jar 导入jstl标签库: <%@tagl ...

  5. JSTL标签库学习记录2-fmt

    fmt的标签为辅助性功能标签 设置编码 <fmt:requestEncoding value=""> 国际化相关 <fmt:setLocale value=&qu ...

  6. 写点C++ 学习记录 充数

    #include "stdafx.h" #include <cstdlib> #include <iostream> using namespace std ...

  7. 易语言调用csharp写的COM组件的程序在Win2008上奔溃的解决办法

    易语言调用csharp写的COM组件,除了要注册csharp写的dll之外(由于是.net代码,需要用.net自带的注册工具RegAsm.exe注册,具体注册方法为: C:\WINDOWS\Micro ...

  8. 易语言效率与C++究竟差多少(质数和计算)

    文本首发bIlibili,cnblogs为作者补发,如在其他平台看见本文,均为经允许的盗窃 易语言作为款主打 中文 易用 编程的开发软件.但是很多人都在批评易语言的效率. 我们今天通过 质数和计算 来 ...

  9. Atitit. 真正的全中国文字attilax易语言的特点以及范例

    Atitit. 真正的全中国文字attilax易语言的特点以及范例 1. 前言 attilax易语言是什么??1 2. attilax易语言的特点2 2.1. 支持多语言文字,不只汉字,还有藏文,维文 ...

随机推荐

  1. Java练习 SDUT-1211_英文金曲大赛

    英文金曲大赛 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 我们在"渊子数"的题目中已经了解了渊子 ...

  2. vue element 中自定义传值

    一直以来都不知道如何传自定义的值,一直只会默认的,今天终于找到方法了. 比如这个上传图片的控件,想带当前的index过去,就这样写.其它的类似 :http-request="(file,fi ...

  3. iptables 过滤条件(Matches)

    iptables可让你设置多种过滤条件,但是某些条件需要核心有提供相关功能才行.Iptables本身內建一般性的Internet Protocol (IP) 过滤条件,也就是說,即时沒载入任何扩充模组 ...

  4. CSDN-Java培训 - 看看这次会有多少人跟风...

    2019年5月8日,闲来无事(最近答辩还没事......),存个档. 看看这一波风口,记录互联网+教育.

  5. input标签前台实现文件上传

    值得注意的是:当一个表单里面包含这个上传元素的时候,表单的enctype必须指定为multipart/form-data,method必须指定为post,浏览器才会认识并正确执行.但是还有一点,浏览器 ...

  6. W3C vs IE盒模型

    今年4月份的一次面试,问到盒模型,是我第一次接触到盒模型,但当时不太明白,没有说清楚,后来查了下,但一知半解. 下面分享下,我对盒模型的理解: 盒模型,也就是box-sizing,分为content- ...

  7. Laravel 5.5 将会要求 PHP 7.0+

    Laravel 5.5 都要用 PHP7 了呢!你还在用 PHP 5 吗? Laravel 一直是一个精 (sheng) 进 (ji) 不 (hen) 休 (kuai) 的框架.就在前几天,下图这位 ...

  8. 2001年NOIP普及组复赛题解

    题目涉及算法: 数的计算:动态规划: 最大公约数和最小公倍数问题:质因数分解: 求先序排列:递归: 装箱问题:动态规划(纯0-1背包问题) 数的计算 题目链接:https://www.luogu.or ...

  9. 用diiv实现多个方块居中嵌套--padding

    文章地址 https://www.cnblogs.com/sandraryan/ 案例:用diiv嵌套多个正方形,配合盒模型相关知识,使每个div在他的父元素上居中.(每个div中心点对齐) 涉及到m ...

  10. Python--day63--添加书籍和修改表结构的注意事项