是否可以扩展tcl birary dll以具备期望的能力?
我有一个C程序,它使用tcl库tcl85.dll执行TCL脚本。它完美无缺。
最近我试图执行一些预期的sripts,但它失败了。据我所知,tcl85.dll无法自行理解expect命令,需要进行扩展。 这就是我陷入困境的地步。我有从活动站点下载的期望库expect543.dll,但我无法弄清楚如何使用tcl85.dll扩展它?
非常感谢任何帮助或指导。
由于 苏尼
答案 0 :(得分:2)
你只需要在DLL方面不再考虑Tcl和Expect:Tcl DLL和Expect DLL都实现了各个软件的 core 功能,但并不是完全独立的:< / p>
http
。pkgIndex.tcl
)的存在,它“知道”如何正确加载和初始化包含包的核心的DLL功能,实际上将软件包与Tcl的软件包加载器接口。因此,要完成所有这些工作,您大致必须遵循此核对清单:
确保您嵌入代码is properly initialized中的Tcl解释器,因此可以加载外部包。
将完整的 Expect包放入嵌入式解释器期望找到外部包的其中一个位置。
< / LI>在程序中需要存在Expect包的脚本中调用package require Expect
来加载它。
或者,您可以在嵌入式解释器上对Tcl C API执行正确的调用以直接加载Expect包的DLL,因此它将立即供您稍后执行的脚本使用。
另一个替代方案(对于初学者而言更难以实现)是使用所谓的"basekit"或“tclkit” - 一个Tcl库,其中包含某些包含的Tcl包使用虚拟文件系统,以便可以在运行时从VFS加载这些包。这些*套件很酷,但掌握创建一个合适的套件比仅仅嵌入一个“常规”解释器以及与主程序一起作为一组文件一起分发的常规软件包更难。
一个特别说明:我不确定ActiveTcl™产品的许可证是否允许剥夺其各个部分并在产品中使用它们。 IANAL但我怀疑您可能违反了该许可的条款。为了安全起见,从源头构建Tcl和Expect - 这并不难。
答案 1 :(得分:0)
基本上我们需要初始化期望解释器。完成后,TCL_Eval(。)也会理解期望代码。
Tcl_Interp *interp = Tcl_CreateInterp();
Tcl_FindExecutable(argv[0]);
if (Tcl_Init(interp) == TCL_ERROR) {
fprintf(stderr,"Tcl_Init failed: %s\n",Tcl_GetStringResult (interp));
(void) exit(1);
}
//Initializing the expect interpreter here
if (Expect_Init(interp) == TCL_ERROR) {
fprintf(stderr,"Expect_Init failed: %s\n",Tcl_GetStringResult (interp));
(void) exit(1);
}
//this can now take expect scripts as well in the buffer
Tcl_Eval(interp, buffer);