我正在努力解决问题,将感谢您的帮助。

假设我有一个tcl / tk应用程序和解释器'x.y.123.3454',并且我想从C应用程序发送一些tcl过程,该过程在'x.y.123.3454'中定义。

例如,我想将puts "Hello World"从C应用程序发送到'x.y.123.3454'。怎么做?

如果您想知道为什么我不直接在该tcl解释器中运行这些过程和命令,请告诉我。

最佳答案

在C级别上,Tcl解释器由Tcl_Interp *类型的句柄表示(应将其视为指向不透明的结构)。通常,使用Tcl API的人员将其命名为interp,但这并不是很重要。一旦有了这样的句柄,就可以使用:

int returnCode = Tcl_Eval(interp, "puts \"Hello World\"");


运行一些代码(这里有反斜杠,因为我们在C字符串常量中加上了双引号)。如果执行成功完成,则返回码将等于TCL_OK;如果出现错误,返回码将等于TCL_ERROR。在确定的情况下,您可以使用Tcl_GetObjResult(interp)获得结果值(并且可以在该值上使用Tcl_GetString以获得要打印的结果的字符串版本)。在错误情况下,您可以使用相同的功能(即Tcl_GetObjResultTcl_GetString)来检索错误消息。还有其他可能的返回码,但是您通常不会看到它们。

当然,puts的结果是成功时为空字符串;消息被打印出来,没有返回。



您如何获得解释器句柄?好吧,这实际上取决于您的代码如何与Tcl集成。如果您正在编写一个Tcl将load的共享库,则它是初始化函数的唯一参数。另一方面,如果要嵌入Tcl,则可能在某个时候调用Tcl_CreateInterp(),这会将句柄返回到新创建的解释器。通常您在做什么很明显。

关于c - 如何从C应用程序向tcl/tk解释器发送tcl命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41801617/

10-13 05:16