2017-01-23 35 views
0

我正在努力解决一个问题,并会感谢您的帮助。如何从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解释器中运行这些程序&命令,请告诉我。

+0

如果您的TCL和C过程可以考虑和处理作为独立的过程,任何标准IPC机制可以被用来传递两者之间的信息。 'C'过程中的内容是一个文本,可以从TCL过程中'接受评估'以执行tcl命令。 – Sharad

+0

你能否详细说明一下?无论你提到的是什么都是需要的,但是,如何做 - 这是一个问题。 –

回答

0

在这个问题上花费了大量的时间后,我意识到从C发送tcl命令到现有的tcl/tk应用程序或解释器没有简单的方法。

以下链接同意: http://cpptk.sourceforge.net/doc.html

1

在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(),这将把句柄返回给一个新创建的解释器。这通常很明显,你在做什么。

+0

我知道这两个选项。在C中,它需要Tcl_CreateInterp()和tcl中的'load'。但是我的问题稍有不同,你已经有了一个具有特定应用程序名称的tcl解释器(在我的例子中,'x.y.123.3454')。现在我该如何调用并向这个特定的解释器发送指令(tcl命令)? –

+0

我很希望你能使它工作。我非常需要你的建议。 –

相关问题