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;
    }
}

具体请参考例程