让脚本引擎支持动态链接库。

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

大家是不是总是郁闷,要在脚本中访问数据库,就又要重新编译一次脚本引擎,写一堆的接口来来让脚本可以访问数据库,或者又碰到要在脚本中访问网络,又要重新编译一次脚本引擎,写一堆的接口。每增加一次新东西,都需要重新修改脚本引擎,是不是很麻烦呢?

其实有个简单的方法,直接让你的脚本引擎支持动态链接库即可。

首先,我们知道,访问动态链接库有两种方法,一种是在连接的时候指定,另外一种则是在运行中指定。为了能让脚本引擎直接的访问任何动态链接库,我们可以使用在运行中指定的方法。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里面获取返回值。

有了这个东西,脚本就可以轻松的访问任何动态链接库而不需要对脚本引擎做修改和重新编译了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航