最好谁能贴个演示代码,谢谢。

解决方案 »

  1.   

    用什么编译器都可以。TCL的例子里就提供了现成的代码。
    以下是我自己用VC写个TCL代码执行器所用到的代码:#include "tcl.h"
    Tcl_Interp *m_interp;
        //初始化TCL对象指针
    m_interp=Tcl_CreateInterp();
    WriteLog("TCL解释器加载完成");
        //注册自己的函数
        Tcl_CreateCommand(m_interp, "puts",Myputs,(ClientData)NULL,(Tcl_CmdDeleteProc *)NULL);
        Tcl_CreateCommand(m_interp, "setpos",MySetUpdatePos,(ClientData)NULL,(Tcl_CmdDeleteProc *)NULL);
        Tcl_CreateCommand(m_interp, "SetTftpPath",MySetTftpPath,(ClientData)NULL,(Tcl_CmdDeleteProc *)NULL);
    WriteLog("注册扩展函数完成");
    //加载初始化程序
    CString temp="Init.tcl";
    if(TCL_OK!=Tcl_EvalFile(m_interp,(char*)(const char*)temp)) {
    CString m_strerr;
    m_strerr.Format("执行TCL出错:%s",m_interp->result);
    AfxMessageBox(m_strerr);
    }
    WriteLog("初始化环境完成......");
      

  2.   

    请问楼上的 可以在内存中解释tcl么,我看到的例子都是用Tcl_EvalFile
    它必须以一个外部文件的方式执行tcl,虽然有个cpptcl,但是它用到了boost
    而我又不太想用boost你们通常怎么把tcl执行的结果返回给c++的,用全局的变量么??
      

  3.   

    当然可以在内存中解释tcl,执行时使用Tcl_Eval就可以。//注册自己的函数
    Tcl_CreateCommand(m_interp, "puts",Myputs,(ClientData)NULL,(Tcl_CmdDeleteProc *)NULL);
    至于返回值你可以看我上面不是自己写了个puts函数来替代TCL原有的puts函数。也就是说你在TCL中使用puts命令就会进入Myputs函数,怎么处理就看自己了。
      

  4.   

    再问一下下面这个程序为什么用VC6编译链接出错。
    #include <tcl.h>
    #include <string.h>
    #include <stdlib.h>
    #include <assert.h>
    int main()
    {
      Tcl_Interp* interp;
      char    *p;
      int tclres;
      //create interpreter
      interp = Tcl_CreateInterp();
      /*
       * Test Tcl_SetVar
       */
      char *varname = "SERVICE_NAME";
      char *varval = "MyServer";
      p = (char *)Tcl_SetVar(interp, varname, varval, TCL_GLOBAL_ONLY);
      assert ( p!=NULL && !strncmp(p, "MyServer", 8) );
      /*
       * Test Tcl_GetVar
       */
      p = (char *)Tcl_GetVar(interp, "SERVICE_NAME", TCL_GLOBAL_ONLY);
      assert ( p!=NULL && !strncmp(p, "MyServer", 8) );
      /*
       * Test Tcl_Eval
       */
      tclres = Tcl_Eval(interp, "set CFG_val world");
      assert ( tclres == TCL_OK) ;
      p = (char *)Tcl_GetVar(interp, "CFG_val", TCL_GLOBAL_ONLY);
      assert ( p!=NULL && !strncmp(p, "world", 5) );
      /*
       * Test Tcl_VarEval
       */
      char *home = "./";
      tclres = Tcl_VarEval(interp, "source ", home, "test.cfg", NULL) ;
      assert ( tclres == TCL_OK) ;
      p = (char *)Tcl_GetVar(interp, "CFG_val", TCL_GLOBAL_ONLY);
      assert ( p!=NULL && !strncmp(p, "hello", 5) );
      /*
       * Test Tcl_EvalFile
       */
      char *path = "./test.cfg";
      tclres = Tcl_EvalFile(interp, path);
      assert ( tclres == TCL_OK) ;
      p = (char *)Tcl_GetVar(interp, "CFG_val", TCL_GLOBAL_ONLY);
      assert ( p!=NULL && !strncmp(p, "hello", 5) );
      //END
      printf("OK\n");
      }
    --------------------Configuration: test12 - Win32 Debug--------------------
    Linking...
    test12.obj : error LNK2001: unresolved external symbol __imp__Tcl_EvalFile
    test12.obj : error LNK2001: unresolved external symbol __imp__Tcl_VarEval
    test12.obj : error LNK2001: unresolved external symbol __imp__Tcl_Eval
    test12.obj : error LNK2001: unresolved external symbol __imp__Tcl_GetVar
    test12.obj : error LNK2001: unresolved external symbol __imp__Tcl_SetVar
    test12.obj : error LNK2001: unresolved external symbol __imp__Tcl_CreateInterp
    Debug/test12.exe : fatal error LNK1120: 6 unresolved externals
    Error executing link.exe.test12.exe - 7 error(s), 0 warning(s)
      

  5.   

    你应该在setting中的LINK选项中添加tcl83.lib