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