如何从 C 应用程序向 tcl/tk 解释器发送 tcl 命令
How to send a tcl command to a tcl/tk interpreter from a C application
我正在努力解决一个问题,非常感谢您的帮助。
假设我有一个 tcl/tk 应用程序和解释器 'x.y.123.3454',我想从 C 应用程序发送一些在 'x.y.123.3454' 中定义的 tcl 程序。
例如,我想从C应用程序发送puts "Hello World"
到'x.y.123.3454'。怎么做?
如果您想知道为什么我不直接在那个 tcl 解释器中 运行 那些过程和命令,请告诉我。
在 C 级别,Tcl 解释器由 Tcl_Interp *
类型的句柄表示(应将其视为指向不透明结构)。通常使用 Tcl API 的人将其命名为 interp
,但这并不是很重要。一旦你有了这样的句柄,你就可以使用:
int returnCode = Tcl_Eval(interp, "puts \"Hello World\"");
到 运行 一些代码(反斜杠在那里是因为我们将双引号放在 C 字符串常量中)。如果执行成功,return 代码将等于 TCL_OK
,如果出现问题,则将等于 TCL_ERROR
。在 OK 的情况下,您使用 Tcl_GetObjResult(interp)
获得结果值(并且您可以使用 Tcl_GetString
来获取打印结果的字符串版本)。在错误情况下,您使用相同的函数(即 Tcl_GetObjResult
、Tcl_GetString
)来检索错误消息。可能还有其他 return 代码,但您通常不会看到它们。
当然,puts
的结果是成功的空字符串;消息被打印出来,而不是 returned.
你是怎么得到那个解释器句柄的?好吧,这实际上取决于您的代码如何与 Tcl 集成。如果您正在编写 Tcl 将 load
共享的库,它是您的初始化函数的唯一参数。另一方面,如果您要嵌入 Tcl,那么您可能会在某个时候调用 Tcl_CreateInterp()
,return 是 newly-created 解释器的句柄。你在做什么通常很明显。
在这个问题上花了很多时间后,我意识到没有简单的方法可以将 tcl 命令从 C 发送到已经存在的 tcl/tk 应用程序或解释器。
以下 link 同意:
http://cpptk.sourceforge.net/doc.html
我正在努力解决一个问题,非常感谢您的帮助。
假设我有一个 tcl/tk 应用程序和解释器 'x.y.123.3454',我想从 C 应用程序发送一些在 'x.y.123.3454' 中定义的 tcl 程序。
例如,我想从C应用程序发送puts "Hello World"
到'x.y.123.3454'。怎么做?
如果您想知道为什么我不直接在那个 tcl 解释器中 运行 那些过程和命令,请告诉我。
在 C 级别,Tcl 解释器由 Tcl_Interp *
类型的句柄表示(应将其视为指向不透明结构)。通常使用 Tcl API 的人将其命名为 interp
,但这并不是很重要。一旦你有了这样的句柄,你就可以使用:
int returnCode = Tcl_Eval(interp, "puts \"Hello World\"");
到 运行 一些代码(反斜杠在那里是因为我们将双引号放在 C 字符串常量中)。如果执行成功,return 代码将等于 TCL_OK
,如果出现问题,则将等于 TCL_ERROR
。在 OK 的情况下,您使用 Tcl_GetObjResult(interp)
获得结果值(并且您可以使用 Tcl_GetString
来获取打印结果的字符串版本)。在错误情况下,您使用相同的函数(即 Tcl_GetObjResult
、Tcl_GetString
)来检索错误消息。可能还有其他 return 代码,但您通常不会看到它们。
当然,puts
的结果是成功的空字符串;消息被打印出来,而不是 returned.
你是怎么得到那个解释器句柄的?好吧,这实际上取决于您的代码如何与 Tcl 集成。如果您正在编写 Tcl 将 load
共享的库,它是您的初始化函数的唯一参数。另一方面,如果您要嵌入 Tcl,那么您可能会在某个时候调用 Tcl_CreateInterp()
,return 是 newly-created 解释器的句柄。你在做什么通常很明显。
在这个问题上花了很多时间后,我意识到没有简单的方法可以将 tcl 命令从 C 发送到已经存在的 tcl/tk 应用程序或解释器。
以下 link 同意: http://cpptk.sourceforge.net/doc.html