我正在努力解决一个问题,并会感谢您的帮助。如何从C应用程序向tcl/tk解释器发送tcl命令
我们假设我有一个tcl/tk应用程序和解释器'x.y.123.3454',我想从C应用程序发送'x.y.123.3454'中定义的一些tcl过程。
例如,我想从C应用程序发送puts "Hello World"
到'x.y.123.3454'。怎么做?
如果您想知道,为什么我不直接在那个tcl解释器中运行这些程序&命令,请告诉我。
我正在努力解决一个问题,并会感谢您的帮助。如何从C应用程序向tcl/tk解释器发送tcl命令
我们假设我有一个tcl/tk应用程序和解释器'x.y.123.3454',我想从C应用程序发送'x.y.123.3454'中定义的一些tcl过程。
例如,我想从C应用程序发送puts "Hello World"
到'x.y.123.3454'。怎么做?
如果您想知道,为什么我不直接在那个tcl解释器中运行这些程序&命令,请告诉我。
在这个问题上花费了大量的时间后,我意识到从C发送tcl命令到现有的tcl/tk应用程序或解释器没有简单的方法。
在C级别上,Tcl解释器由Tcl_Interp *
类型的句柄表示(应将其视为指向不透明结构)。传统上,使用Tcl API的人使用interp
这个名称,但这并不重要。一旦你有这样一个把手,可以使用:
int returnCode = Tcl_Eval(interp, "puts \"Hello World\"");
运行一些代码(反斜线在那里,因为我们把双引号一个C字符串常量内)。如果执行成功,返回码将等于TCL_OK
,如果出现错误,则等于TCL_ERROR
。在OK的情况下,你得到的结果值为Tcl_GetObjResult(interp)
(你可以使用Tcl_GetString
来获得打印结果的字符串版本)。在错误情况下,您使用相同的功能(即Tcl_GetObjResult
,Tcl_GetString
)来检索错误消息。还有其他可能的返回码,但您通常不会看到它们。
当然,puts
的结果是成功的空串;信息被打印出来,没有被返回。
你是如何得到这个解释器句柄的?那么,这取决于你的代码如何与Tcl集成。如果你正在编写一个Tcl的共享库load
,它是你初始化函数的唯一参数。另一方面,如果你嵌入Tcl,那么你可能在某个时候调用Tcl_CreateInterp()
,这将把句柄返回给一个新创建的解释器。这通常很明显,你在做什么。
我知道这两个选项。在C中,它需要Tcl_CreateInterp()和tcl中的'load'。但是我的问题稍有不同,你已经有了一个具有特定应用程序名称的tcl解释器(在我的例子中,'x.y.123.3454')。现在我该如何调用并向这个特定的解释器发送指令(tcl命令)? –
我很希望你能使它工作。我非常需要你的建议。 –
如果您的TCL和C过程可以考虑和处理作为独立的过程,任何标准IPC机制可以被用来传递两者之间的信息。 'C'过程中的内容是一个文本,可以从TCL过程中'接受评估'以执行tcl命令。 – Sharad
你能否详细说明一下?无论你提到的是什么都是需要的,但是,如何做 - 这是一个问题。 –