大家是不是总是郁闷,要在脚本中访问数据库,就又要重新编译一次脚本引擎,写一堆的接口来来让脚本可以访问数据库,或者又碰到要在脚本中访问网络,又要重新编译一次脚本引擎,写一堆的接口。每增加一次新东西,都需要重新修改脚本引擎,是不是很麻烦呢?
其实有个简单的方法,直接让你的脚本引擎支持动态链接库即可。
首先,我们知道,访问动态链接库有两种方法,一种是在连接的时候指定,另外一种则是在运行中指定。为了能让脚本引擎直接的访问任何动态链接库,我们可以使用在运行中指定的方法。Linux下也好,Windows下也好,最多都只能通过函数名获取到一个函数指针,但是对于脚本来说,却不知道函数的定义,无法对其进行呼叫。
那么我们用下面的方法(以Linux下为例子,Windows平台下类似,仅API不同):
比如说有脚本引擎收到脚本传过来的
动态链接库的名字:xxx.so
要呼叫的函数:test_func
要传进去的参数:var1, var2, var3
void *dl_handle = dlopen("xxx.so", RTLD_LAZY); // Windows下为.dll文件
void *f = dlsym(dl_handle, "test_func");
__asm__("push %0"::"r"(var1));
__asm__("push %0"::"r"(var2));
__asm__("push %0"::"r"(var3));
// Windows下为:
// __asm push var1;
// __asm push var2;
// __asm push var3;
__asm__("call %0"::"r"(f));
__asm__("add %%esp, $0xc");//因为有三个参数,所以是4 * 3 = 12(0xc)
// 然后如果有返回值的话,就从EAX里面获取返回值。
有了这个东西,脚本就可以轻松的访问任何动态链接库而不需要对脚本引擎做修改和重新编译了。