Nebula2探秘06-使用Tcl脚本服务I
happykevins文
首先介绍一个宏定义nNebulaUsePackage,他的作用是将一个Nebula功能模块中所有的Nebula类全部注册到kernel server中。由于前面的范例只涉及到nkernel包中的内容,而nkernel包会在创建kernel server时自动载入,所以我们在之前的例子中并没有使用过这个宏(本节也没有使用)。
而本节要创建的TclServer是在nnebula包中,我们可以利用需要nNebulaUsePackage宏将nnebula添加到kernel server中,但是nnebula需要依赖到很多其他的包,我们都需要一一添加才能确保编译通过。所以我们只需要将ntclserver添加到kernel server中即可,另外别忘了添加microtcl的静态库。
下面是我定义的两个宏,用于添加单独的模块到kernel server。
///声明使用指定的Module
#definenNebulaUseModule(MODULE)\
externvoid*n_new_##MODULE(void);\
externbooln_init_##MODULE(nClass*,nKernelServer*);
///将指定Module添加到KernelServer
#definenNebulaAddModule(MODULE)\
nKernelServer::Instance()->AddModule(#MODULE,\
n_init_##MODULE,n_new_##MODULE);
#definenNebulaUseModule(MODULE)\
externvoid*n_new_##MODULE(void);\
externbooln_init_##MODULE(nClass*,nKernelServer*);
///将指定Module添加到KernelServer
#definenNebulaAddModule(MODULE)\
nKernelServer::Instance()->AddModule(#MODULE,\
n_init_##MODULE,n_new_##MODULE);
下面是创建和使用tclserver的代码,很简单:
/****************************************************************************/
/*Nebula2-Tutorial06*/
/*UsingTclServerI-创建TclServer&执行tcl脚本*/
/*author:happykevins*/
/****************************************************************************/
///----------------------------------------------------------------------------
///+必要头文件
//nebula2includes
#include"kernel/nkernelserver.h"
#include"script/ntclserver.h"
//Tutorial工具库:一些通用的宏定义
#include"../NebulaUtils/nutildefs.h"
//Tutorial工具库:Nebula2Kernel信息工具
#include"../NebulaUtils/nkernelinfo.h"
///-必要头文件
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
///+链接库
#pragmacomment(lib,"wsock32.lib")
#pragmacomment(lib,"d_nkernel.lib")
//TclServer被编译在该库中
#pragmacomment(lib,"d_nnebula.lib")
//Tcl的库(TclServer依赖)
#pragmacomment(lib,"d_microtcl.lib")
///-链接库
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
///+声明使用的Nebula2Package&Module
//usingntclservermodule
nNebulaUseModule(ntclserver);
///-声明使用的Nebula2Package&Module
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
///+Application
intmain(intargc,constchar**argv)
{
///创建KernelServer
nKernelServer*ks=n_new(nKernelServer);
///创建Kernel信息工具
nKernelInfoHelperks_info(ks);
///将ntclserver对象加入KernelServer
nNebulaAddModule(ntclserver);
ks_info.LogCLS();
///创建tclserver
nTclServer*tcl=(nTclServer*)ks->New("ntclserver","/sys/servers/script");
ks_info.LogNOH("/");
///执行脚本
nStringret;
ret.Clear();
tcl->Run("puts"UsingTclServerI!"",ret);
ret.Clear();
tcl->RunScript("bin:../../DataFiles/Scripts/T06_UsingTclServerI.tcl",ret);
ret.Clear();
tcl->RunFunction("Hello",ret);
///销毁KernelServer
n_delete(ks);
getchar();
return0;
}
///-Application
///----------------------------------------------------------------------------
/*Nebula2-Tutorial06*/
/*UsingTclServerI-创建TclServer&执行tcl脚本*/
/*author:happykevins*/
/****************************************************************************/
///----------------------------------------------------------------------------
///+必要头文件
//nebula2includes
#include"kernel/nkernelserver.h"
#include"script/ntclserver.h"
//Tutorial工具库:一些通用的宏定义
#include"../NebulaUtils/nutildefs.h"
//Tutorial工具库:Nebula2Kernel信息工具
#include"../NebulaUtils/nkernelinfo.h"
///-必要头文件
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
///+链接库
#pragmacomment(lib,"wsock32.lib")
#pragmacomment(lib,"d_nkernel.lib")
//TclServer被编译在该库中
#pragmacomment(lib,"d_nnebula.lib")
//Tcl的库(TclServer依赖)
#pragmacomment(lib,"d_microtcl.lib")
///-链接库
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
///+声明使用的Nebula2Package&Module
//usingntclservermodule
nNebulaUseModule(ntclserver);
///-声明使用的Nebula2Package&Module
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
///+Application
intmain(intargc,constchar**argv)
{
///创建KernelServer
nKernelServer*ks=n_new(nKernelServer);
///创建Kernel信息工具
nKernelInfoHelperks_info(ks);
///将ntclserver对象加入KernelServer
nNebulaAddModule(ntclserver);
ks_info.LogCLS();
///创建tclserver
nTclServer*tcl=(nTclServer*)ks->New("ntclserver","/sys/servers/script");
ks_info.LogNOH("/");
///执行脚本
nStringret;
ret.Clear();
tcl->Run("puts"UsingTclServerI!"",ret);
ret.Clear();
tcl->RunScript("bin:../../DataFiles/Scripts/T06_UsingTclServerI.tcl",ret);
ret.Clear();
tcl->RunFunction("Hello",ret);
///销毁KernelServer
n_delete(ks);
getchar();
return0;
}
///-Application
///----------------------------------------------------------------------------
Tcl脚本中的代码:
#-------------------------------------------------------------------------------
#T06UsingTclServerI-Create&UsingTclServer
#@byhappykevins
#-------------------------------------------------------------------------------
procHello{}{
puts"HelloNebula2!HelloTclServer!";
}
#T06UsingTclServerI-Create&UsingTclServer
#@byhappykevins
#-------------------------------------------------------------------------------
procHello{}{
puts"HelloNebula2!HelloTclServer!";
}
816

被折叠的 条评论
为什么被折叠?



