所以我们有这样的代码:
#include "cpptk.h"
#include <stdio.h>
using namespace Tk;
void hello() {
puts("Hello C++/Tk!");
}
int main(int, char *argv[])
{
static char* str = "button .a -text "Say Hello ppure TCL"n"
"pack .an";
init(argv[0]);
button(".b") -text("Say Hello") -command(hello);
pack(".b") -padx(20) -pady(6);
runEventLoop();
}
假设str
是复杂的tcl代码。我们想把它作为一个字符串提供给C++/Tk。此外,我们希望在我们在C++/Tk代码中创建的带有gui的通用C++/Tk程序的同一个TCL vm中执行它。因此,这个代码的结果将是一个窗口中的两个按钮。怎么做这样的事?
怎么做这样的事?
您有权访问C++/Tk内部使用的Tcl_Interp*
句柄吗?如果是这样的话(假设你在一个名为interp
的变量中得到了它(,使用:
int resultCode = Tcl_Eval(interp, str);
接下来,检查resultCode
,看看它是TCL_OK
还是TCL_ERROR
(其他值也是可能的,但在正常脚本中不常见(。这告诉你对"结果"的解释,你得到的是这样的:
const char *result = Tcl_GetString(Tcl_GetObjResult(interp));
如果结果代码说这是一个错误,那么result
现在就是一条错误消息。如果可以的话,result
就是脚本的输出(注意:不是按照标准输出编写的(。这取决于你该怎么办。
[编辑]:我查阅了更多详细信息。它比表面上看起来更糟糕,因为C++/Tk把Tcl隐藏得很深。就我所见,你这样做(未经测试!(:
#include "cpptk.h" // might need "base/cpptkbase.h" instead
#include <string>
// This next part is in a function or method...
std::string script("the script to evaluate goes here");
std::string result = Tk::details::Expr(script,true);