C++集成脚本--UCScript

    使用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下载脚本用户手册。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值