如何用期望扩展tcl二进制dll?

时间:2013-07-29 18:27:27

标签: tcl expect

是否可以扩展tcl birary dll以具备期望的能力?

我有一个C程序,它使用tcl库tcl85.dll执行TCL脚本。它完美无缺。

最近我试图执行一些预期的sripts,但它失败了。据我所知,tcl85.dll无法自行理解expect命令,需要进行扩展。 这就是我陷入困境的地步。我有从活动站点下载的期望库expect543.dll,但我无法弄清楚如何使用tcl85.dll扩展它?

非常感谢任何帮助或指导。

由于 苏尼

2 个答案:

答案 0 :(得分:2)

你只需要在DLL方面不再考虑Tcl和Expect:Tcl DLL和Expect DLL都实现了各个软件的 core 功能,但并不是完全独立的:< / p>

  • Tcl解释器依赖于一组库文件,它们(动态地)从文件系统加载。这些文件包括(但不限于)编码文件,时区信息文件和所谓的“核心包”,其中一个例子是http
  • 作为regular Tcl package,的Expect包依赖于至少一个特殊的“索引文件”(pkgIndex.tcl)的存在,它“知道”如何正确加载和初始化包含包的核心的DLL功能,实际上将软件包与Tcl的软件包加载器接口。

因此,要完成所有这些工作,您大致必须遵循此核对清单:

  1. 确保您嵌入代码is properly initialized中的Tcl解释器,因此可以加载外部包。

  2. 完整的 Expect包放入嵌入式解释器期望找到外部包的其中一个位置。

    请务必阅读thisthisthis,了解包装机制的工作原理以及特殊全局变量auto_path的初始化方式。

    < / LI>
  3. 在程序中需要存在Expect包的脚本中调用package require Expect来加载它。

  4. 或者,您可以在嵌入式解释器上对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);