C++集成脚本--UCScript

来源:互联网 发布:手机换彩铃用什么软件 编辑:程序博客网 时间:2024/05/03 03:05

    使用UCScript作脚本,主要是因为它几个特点很适合用于集成(脚本引擎体积小,占用资源少,运行快,跨平台跨语言,与宿主语言交互方便),而且它的语法类C语言,不用去多学一门语言。在C++中集成UCScript脚本是轻而易举的事。我们接下来用实例来说明,如何把UCScript脚本集成到你的程序中去。

1. 创建UCScript引擎

    ucScript ucs; 或者 ucScript* ucs= new ucScript;

创建一个ucScript对象,就是创建一个UCScript脚本引擎。可以创建任意多个脚本引擎,甚至可以分布在不同的线程当中。

注意:指定合适的预定义,Windows用_UC_WIN,Linux用_UC_LINUX(即编译参数-D_UC_LINUX)。如果以动态库的形式使用脚本,还得指定_UC_IMPORT。

2. 执行脚本程序 你可以从缓冲区中装载脚本,也可以直接解析文件:

    const char * szCode="ret 1+2*3;";
    ucScript ucs;
    ucCalcVar vRet= ucs.Parse(szCode);
    assert(vRet.value.iVal == 7);

如果你想对你的源代码进行保护而不是赤裸裸的袒露在大家的眼前,或者提高脚本性能,你可以把脚本编译成二进制中间码。

3. 如何让脚本调用C++的函数。比如让脚本以string: get_peername(int: id)的形式调用我的C++代码,代码可以写成:

UCSFUNC3(get_peername,CVT_STRING, "get peer name by peer id",
        CVT_INTEGER,"puid",
        CVT_STRING,"def=/"unknown/"",
        1)
{
    int puid;
    //  get an integer value from the first parameter
    ucAdaptCVT::cvt2out(params[0], puid);

    CPeer * p=CPeerMgr::Instance().GetPeer(puid);
    if(p) {
        return p->m_PeerInfo.name;  //  return the string of name
    }
    const char * def="unknown";
    if(count>1) {
        ucAdaptCVT::cvt2out(params[1], def);  //  get default name specified by parameter
    }
    return def;
}

上面代码用了UCSFUNC(xxx) 辅助宏,定义在ucScriptFunc.h头文件。其中xxx表示脚本变量类型个数(即返回值和参数的个数)。上例的宏参数分别表示:

get_peername 函数名字 CVT_STRING 函数返回值的类型为string 函数的提示信息 在脚本集成开发环境ucDev可以看到 CVT_INTEGER 第一个参数,类型为integer 参数的提示信息 用在ucDev CVT_STRING 第二个参数,类型string 参数提示信息 用在ucDev 1 有 1 个参数有默认值,即最后一个参数

脚本调用如下:

string: strName;

strName = get_peername(12);  //  Kevin's ID is 12, so strName = "Kevin"
strName = get_peername(-1);  //  none, strName = "unknown"
strName = get_peername(-1, "no user");  //  none, strName = "no user"

最让我激动的是,该脚本把非标准类型的变量全部当作object类型,也就是说任何C++类型都可以接受。下面例子演示如何传递和返回非基本类型的变量。

UCSFUNC2(get_parentwnd, CVT_OBJECT, "get a parent window",
       CVT_OBJECT,"wnd",
        0)
{
    ucCalcVar vRet(CVT_OBJECT);
    CWnd * pWnd=NULL;
    //  get CWnd from parameter
    ucAdaptCVT::cvt2out(params[0], pWnd);

    if(pWnd && ::IsWindow(pWnd->GetSafeHwnd()) )
    {
        ucAdaptCVT::out2cvt(pWnd->GetParent(), vRet);
    }
    return vRet;
}

4. 结束语

UCScript是一种面向集成的脚本语言,上面例子是针对C++语言,还支持的其他语言有C#(.Net),Java,Delphi,Visual Basic等等。脚本开发工具可以从http://www.ucscript.com/view_download.asp?id=3下载。初学者可以从http://www.ucscript.com/download.asp下载脚本用户手册。