Dll扩展
Silk的内置函数数量和功能都有限,不能满足某些需求,我们可以通过调用其它语言(C/C++)开发的Dll无限扩展功能。
Silk通过下列内置函数调用外部Dll:
_loadlib(filename)_loadlib函数用来加载Dll文件到内存,filename为dll文件的名称,可指定文件的全路径,默认为当前目录。
加载成功返回Dll的句柄,加载失败返回0,加载失败的原因一般为文件的路径问题。
//lib=_loadlib("SilkCommonLib64.dll");
lib=_loadlib("D:\\silk_test\\SilkCommonLib64.dll");
if(lib)
print("load dll ok");
_calllib(lib, function, parameters...)_calllib函数用来调用Dll里的具体函数,lib为_loadlib函数加载成功后返回的句柄,function为需要调用的Dll里的函数的名称,parameter为函数的参数列表。
函数调用成功将返回一个包含返回数据的数组,失败返回一个空数组。
func get_curdir()
{
curdir="./";
curfile=_getargv()[0];
slash="\\";
if(_fun("os_platform").find("WIN")<0)
slash="/";
pos=curfile.rfind(slash);
if(pos>=0)
curdir=curfile.substr(0,pos+1);
return curdir;
}
main()
{
filename=get_curdir()+"SilkCommonLib64.dll";//指定dll文件全路径
lib=_loadlib(filename);//加载dll
if(lib)
{
ret=_calllib(lib,"base64_encode","Good morning!");//调用dll里的base64_encode函数
if(ret)
{
base64Str=ret[0];//调用成功返回包含数据的数组,由于只有一个返回值,所以只取第一个元素
print(base64Str);
}
_freelib(lib);//释放dll
}
}
_freelib(lib)_freelib函数用来释放加载的Dll,lib为_loadlib函数加载成功后返回的句柄。
开发Dll开发供Silk调用的Dll需要遵循Silk定义的规范:
C/C++开发的Dll工程里需包含Silk提供的头文件
silklib.h,用以接收从Silk传入的参数,以及将执行结果通过参数返回给Silk。
下面的C++代码演示如何开发符合Silk规范的Dll:
#include "silklib.h"
#define EXPORT __declspec(dllexport)
extern "C" {
EXPORT PARAMS* base64_encode(PARAMS* pParam) { //Silk通过PARAMS将调用参数传入Dll
char *pBuff=NULL;
int nSize = 0;
if (pParam)
{
if (pParam->nCount == 1)//Silk传入了一个参数
{
if (pParam->pParams[0].nType == PARAM_STR)//参数类型为String
{
if (pParam->pParams[0].nSize > 0)
{
nSize = pParam->pParams[0].nSize;
pBuff = new char[nSize+1];
pBuff[nSize] = 0;
sprintf(pBuff, "%s", (char*)(pParam->pParams[0].pValue));//把参数值放入pBuff中
}
}
}
}
if (pBuff)
{
string str = CommonLib::base64_encode(pBuff, nSize);//对传入的字符串进行base64编码
delete pBuff;
PARAMS* pRetParam = create_params(1);//只有一个返回值,所以创建个数为1的PARAMS,如果有n个,创建时个数为n
add_string(pRetParam, str.c_str(), str.size());//把返回结果加入PARAMS中,如果有n个,继续用add_string等加入
return pRetParam;//返回给Silk
}
return NULL;
}
}
具体请参考
例程