|
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。
Word-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
/// 声明使用指定的Module #define nNebulaUseModule(MODULE) \ extern void *n_new_##MODULE (void); \ extern bool n_init_##MODULE (nClass *, nKernelServer *);
/// 将指定Module添加到KernelServer #define nNebulaAddModule(MODULE) \ nKernelServer::Instance()->AddModule( #MODULE, \ n_init_##MODULE, n_new_##MODULE);
下面是创建和使用tclserver的代码,很简单:
/****************************************************************************/ /* Nebula2 - Tutorial 06 */ /* UsingTclServer I - 创建TclServer&执行tcl脚本 */ /* author: happykevins */ /****************************************************************************/
///---------------------------------------------------------------------------- /// +必要头文件
// nebula2 includes #include "kernel/nkernelserver.h" #include "script/ntclserver.h"
// Tutorial工具库:一些通用的宏定义 #include "../NebulaUtils/nutildefs.h" // Tutorial工具库:Nebula2 Kernel信息工具 #include "../NebulaUtils/nkernelinfo.h"
/// -必要头文件 ///----------------------------------------------------------------------------
///---------------------------------------------------------------------------- /// +链接库 #pragma comment(lib, "wsock32.lib") #pragma comment(lib, "d_nkernel.lib") // TclServer被编译在该库中 #pragma comment(lib, "d_nnebula.lib") // Tcl的库(TclServer依赖) #pragma comment(lib, "d_microtcl.lib") /// -链接库 ///----------------------------------------------------------------------------
///---------------------------------------------------------------------------- /// +声明使用的Nebula2 Package&Module // using ntclserver module nNebulaUseModule(ntclserver); /// -声明使用的Nebula2 Package&Module ///----------------------------------------------------------------------------
///---------------------------------------------------------------------------- /// +Application int main(int argc, const char** argv) { /// 创建KernelServer nKernelServer* ks = n_new(nKernelServer);
/// 创建Kernel信息工具 nKernelInfoHelper ks_info(ks);
/// 将ntclserver对象加入KernelServer nNebulaAddModule(ntclserver); ks_info.LogCLS();
/// 创建tclserver nTclServer* tcl = (nTclServer*)ks->New("ntclserver", "/sys/servers/script"); ks_info.LogNOH("/");
/// 执行脚本 nString ret; ret.Clear(); tcl->Run("puts "Using Tcl Server I!"", ret);
ret.Clear(); tcl->RunScript("bin:../../DataFiles/Scripts/T06_UsingTclServerI.tcl", ret);
ret.Clear(); tcl->RunFunction("Hello", ret);
/// 销毁KernelServer n_delete(ks);
getchar(); return 0; } /// -Application ///----------------------------------------------------------------------------
Tcl脚本中的代码:
#------------------------------------------------------------------------------- # T06 UsingTclServer I - Create & Using Tcl Server # @by happykevins #------------------------------------------------------------------------------- proc Hello {} { puts "Hello Nebula2! Hello Tcl Server!"; }
上一篇: Nebula2探秘05-RTTI
下一篇: Nebula2探秘10-Signal System
|