TCL脚本扩展示例

TCl脚本扩展示例,包含两个示例,示例1:未使用到ClientData;示例2使用到了ClientData参数
************************************************示例1,未使用到ClientData参数**********************************************
// TclTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "tcl.h"

int Tcl_AppInit(Tcl_Interp *interp);
int AddCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[]);


int _tmain(int argc, _TCHAR* argv[])
{
    Tcl_Main(argc, argv, Tcl_AppInit);

    return 0;
}

int Tcl_AppInit(Tcl_Interp *interp)
{
    Tcl_Init(interp);
    
    //! 注册命令
    Tcl_CreateCommand (interp, "addcmd", (Tcl_CmdProc*)AddCmd, (ClientData)0, (Tcl_CmdDeleteProc* )0);
    return TCL_OK;
}


int AddCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[])
{
    if(argc!=3)
    {
        interp->result="Useage Error! should be : add int1 int2";
        return TCL_ERROR;
    }

    int i,j;

    if(TCL_OK!=Tcl_GetInt(interp,argv[1],&i))
    {
        sprintf(interp->result,"Expect integer but got %s",argv[1]);
        return TCL_ERROR;
    }

    if(TCL_OK!=Tcl_GetInt(interp,argv[2],&j))
    {
        sprintf(interp->result,"Expect integer but got %s",argv[2]);
        return TCL_ERROR;
    }

    i=i+j;
    sprintf(interp->result,"%d",i);

    return TCL_OK;
}

************************************************示例2,使用到ClientData参数**********************************************
// TclTest2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "TclTest2.h"

int _tmain(int argc, _TCHAR* argv[])
{
    Tcl_Main(argc, argv, Tcl_InitApp);

    return 0;
}

int Tcl_InitApp(Tcl_Interp* interp)
{
    Tcl_Init(interp);
    Sample* pSam=new Sample;
    Tcl_CreateCommand(interp, "myget", (Tcl_CmdProc*)MyGetCmd, (ClientData)pSam,
        (Tcl_CmdDeleteProc*) DeleteProc);
    Tcl_CreateCommand(interp, "myset",(Tcl_CmdProc*)MySetCmd, (ClientData)pSam,
        (Tcl_CmdDeleteProc* )DeleteProc);
    return TCL_OK;
}

int MyGetCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[])
{
    if(argc!=1)
    {
        interp->result="Usage error!";
        return TCL_ERROR;
    }
    Sample* pSam=(Sample* )clientdata;
    if(!pSam)
    {
        return TCL_ERROR;
    }
    sprintf(interp->result,"%d",pSam->Get());
    return TCL_OK;
}

int MySetCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[])
{
    if(argc!=2)
    {
        interp->result="Usage error!";
        return TCL_ERROR;
    }
    Sample* pSam=(Sample* )clientdata;
    if(!pSam)
    {
        return TCL_ERROR;
    }
    int i;
    if(TCL_OK!=Tcl_GetInt(interp,argv[1],&i))
    {
        sprintf(interp->result,"Expect integer but got %s",argv[1]);
        return TCL_ERROR;
    }
    pSam->Set(i);
    sprintf(interp->result,"%d",i);
    return TCL_OK;
}

void DeleteProc(ClientData clientdata)
{
    int static i=0;
    if(i!=0)
        return;
    delete (char*)clientdata;
    i=1;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值