diff --git a/sharedlib/Windows/makefile b/sharedlib/Windows/makefile new file mode 100644 index 0000000000000000000000000000000000000000..670eb294cf6d2682df6095cc63a63b10d3eba651 --- /dev/null +++ b/sharedlib/Windows/makefile @@ -0,0 +1,11 @@ +T = ElsLib_sharedlib.lsd +CFLAGS = -O2 -std=c99 -DELS_CONF_OS_WINDOWS -I ../buildenv -L ../buildenv -fPIC -s -l:libeasylosu.dll -lws2_32 -I ./include +CPPFLAGS = -O3 -std=c++11 -DELS_CONF_OS_WINDOWS -I ./include -I ../buildenv + +all: $T + +$T: + gcc sharedlib.c -o $(T) -shared $(CFLAGS) + +clean: + rm *.o diff --git a/sharedlib/info b/sharedlib/info new file mode 100644 index 0000000000000000000000000000000000000000..8403d622eebd04b2a1d20c84779007732178e600 --- /dev/null +++ b/sharedlib/info @@ -0,0 +1,21 @@ +{ + type = "normal", + info = { + name = "sharedlib", + text = "动态库操作模块", + version = "24.3.24" + }, + source = { + all = { + "info", + "sharedlib.c", + "sharedlib.h", + "sharedlib.els", + "readme.md", + }, + Windows ={"makefile"}, + }, + target={ + Windows = "make ; cp ElsLib_sharedlib.lsd target/ElsLib_sharedlib.lsd_Windows ; make clean", + } +} diff --git a/sharedlib/readme.md b/sharedlib/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..35827225d5f54fb3b296e10992b23831260397e8 --- /dev/null +++ b/sharedlib/readme.md @@ -0,0 +1,27 @@ +# sharedlib文档 + +## 概述 + +sharedlib是一个动态库操作模块,提供了动态库的加载、卸载和指针地址获取功能。 + +## 函数列表 + +### sharedlib.load + +sharedlib.load(...:str) -> ptr / unit + +接受str类型的参数作为动态库路径。当参数个数为1时,返回加载的动态库的指针。当参数个数大于1时,将指针装在unit中返回。 + +单个参数,当加载失败时,返回null。多个参数,当加载失败时,对应的索引,其值为null。 + +### sharedlib.unload + +sharedlib.unload(...:ptr) + +卸载对应的指针的动态库。该函数始终返回null。 + +### sharedlib.sys + +sharedlib.sys(libp:ptr, sys:str) + +在libp中查找sys标准,当查找到时,返回对应的指针,否则返回null。 diff --git a/sharedlib/sharedlib.c b/sharedlib/sharedlib.c new file mode 100644 index 0000000000000000000000000000000000000000..0159c602c95eb9be45202bca6171fda446650374 --- /dev/null +++ b/sharedlib/sharedlib.c @@ -0,0 +1,176 @@ +#include "els.h" +#include "sharedlib.h" + +/* + xkit的动态库操作接口 +*/ + +#include +#include +#include +#include +#include + +#ifdef __linux__ + +#include +#include + +#endif + +#ifdef _WIN32 + +#include + +#endif + +#define unit_arg(x) x+1 +#define unit_arg_gettype(vm, x) arg_gettype(vm, x+1) + +int ELSAPI_sharedlib_sharedlib_load(els_VmObj *vm) +{ + int argnum = arg_num(vm); + + if (argnum == unit_arg(0)) //当参数个数(除this指针外) == 0 + { + arg_returnnull(vm); + return 1; + } + else if (argnum == unit_arg(1)) //当参数个数(除this指针外) == 1 + { + const char *name = arg_getstr(vm, unit_arg(1)); + if (name[0] == '\0') + { + arg_returnnull(vm); + return 1; + } + #ifdef __linux__ + void *p = dlopen(name, RTLD_LAZY); + #endif + + #ifdef _WIN32 + void *p = LoadLibrary(name); + #endif + + if (p == NULL) + { + arg_returnnull(vm); + return 1; + } + + arg_returnptr(vm, p); + return 1; + } + + //当参数个数(除this指针外)>=2时会运行到这里 + LosuObj unit = obj_newunit(vm); + for (int i = 1; i <= argnum - 1; i++) + { + const char *s = arg_getstr(vm, unit_arg(i)); + + #ifdef __linux__ + void *p = dlopen(s, RTLD_LAZY); //Linux下的动态库打开方式 + #endif + + #ifdef _WIN32 + void *p = LoadLibrary(s); + #endif + + if (p != NULL) + obj_setunitbynum(vm, unit, i, obj_newptr(vm, p)); + else + obj_setunitbynum(vm, unit, i, obj_newnull(vm)); + } + arg_return(vm, unit); + + return 1; +} + +int ELSAPI_sharedlib_sharedlib_unload(els_VmObj *vm) +{ + int argnum = arg_num(vm); + + if (argnum == unit_arg(0)) //当参数个数(除this指针外) == 0 + { + arg_returnnull(vm); + return 1; + } + else if (argnum == unit_arg(1)) //当参数个数(除this指针外) == 1 + { + void *p = arg_getptr(vm, unit_arg(1)); + + if (p == NULL) + { + arg_returnnull(vm); + return 1; + } + + #ifdef __linux__ + dlclose(p); + #endif + + #ifdef _WIN32 + FreeLibrary(p); + #endif + + arg_returnnull(vm); + return 1; + } + + //当参数个数(除this指针外)>=2时会运行到这里 + for (int i = 1; i <= argnum - 1; i++) + { + void *p = arg_getptr(vm, unit_arg(i)); + + if (p == NULL) + { + continue; + } + + #ifdef __linux__ + dlclose(p); + #endif + + #ifdef _WIN32 + FreeLibrary(p); + #endif + } + + return 1; +} + +int ELSAPI_sharedlib_sharedlib_sys(els_VmObj *vm) +{ + if (unit_arg_gettype(vm, 1) == ELS_API_TYPE_PTR && unit_arg_gettype(vm, 2) == ELS_API_TYPE_STRING) + { + void *p = arg_getptr(vm, unit_arg(1)); + const char *s = arg_getstr(vm, unit_arg(2)); + + if (p == NULL || s[0] == '\0') + { + arg_returnnull(vm); + return 1; + } + + #ifdef __linux__ + void *proc = dlsym(p, s); + #endif + + #ifdef _WIN32 + void *proc = GetProcAddress(p, s); + #endif + + if (proc == NULL) + arg_returnnull(vm); + else + arg_returnptr(vm, proc); + + return 1; + } + else + { + arg_returnnull(vm); + } + + return 1; +} diff --git a/sharedlib/sharedlib.els b/sharedlib/sharedlib.els new file mode 100644 index 0000000000000000000000000000000000000000..3fe2e168883ddc88e166c35839f56c8dd02e92ea --- /dev/null +++ b/sharedlib/sharedlib.els @@ -0,0 +1,19 @@ +#!declare + +sharedlib_load() +sharedlib_unload() +sharedlib_sys() + +#!end + + +#!script + +var sharedlib = { + load = sharedlib_load, + unload = sharedlib_unload, + sys = sharedlib_sys +} + +#!end + diff --git a/sharedlib/sharedlib.h b/sharedlib/sharedlib.h new file mode 100644 index 0000000000000000000000000000000000000000..620a9a6f2e9517e8c4d4459cb859a92f84cb7633 --- /dev/null +++ b/sharedlib/sharedlib.h @@ -0,0 +1,23 @@ +#include "els.h" +int ELSAPI_sharedlib_sharedlib_load(els_VmObj* vm); // sharedlib_load() +int ELSAPI_sharedlib_sharedlib_unload(els_VmObj* vm); // sharedlib_unload() +int ELSAPI_sharedlib_sharedlib_sys(els_VmObj* vm); // sharedlib_sys() +#ifdef ELS_CONF_TOKEN_EN +static const char LibScript[]={ +10, +118,97,114,32,115,104,97,114,101,100,108,105,98,32,61,32,123,10, +32,32,32,32,108,111,97,100,32,61,32,115,104,97,114,101,100,108,105,98,95,108,111,97,100,44,10, +32,32,32,32,117,110,108,111,97,100,32,61,32,115,104,97,114,101,100,108,105,98,95,117,110,108,111,97,100,44,10, +32,32,32,32,115,121,115,32,61,32,115,104,97,114,101,100,108,105,98,95,115,121,115,10, +125,10, +10, +0}; +#endif +void ElsLib_sharedlib_libinit(els_VmObj *vm){ + vm_register(vm,"sharedlib_unload",ELSAPI_sharedlib_sharedlib_unload); + vm_register(vm,"sharedlib_load",ELSAPI_sharedlib_sharedlib_load); + vm_register(vm,"sharedlib_sys",ELSAPI_sharedlib_sharedlib_sys); + #ifdef ELS_CONF_TOKEN_EN + vm_dostring(vm,LibScript); + #endif +};