资源预览内容
第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
第9页 / 共11页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
TCL/TK 与 C 程序的集成 一、 简介 比较 TCL/TK 提供的快速而又容易的开发图形拥护界面,X 程序显得很烦琐。Tcl/tk 是一种脚本语言,就象其它的一些脚本语言一样,也有很多事情不能够做或很难做。解决途径是联合 C 与 tcl/tk 一起来开发. tcl/tk 系统提供 C 程序调用 TCL/TK 的解释器来运行TCL/TK 脚本。提供的库包括初始化变量的方法,调用不同的脚本和访问变量。利用这些混合变量对它们访问 X 固有的特性也提供了好处。简单的回调和时间函数允许程序员制定事件,注册一个 C 函数为 TCL/TK 的过程的能力成为一个强大的工具。这篇文档覆盖了TCL/TK 脚本与 C 集成的一些基础知识。编译选项部分描述了变量库并包含了建立程序的必要文件。初始化与注册名令部分解释了怎样开始,怎样从 TCL/TK 脚本中调用 C 函数,最后一部分访问变量阐述了怎样来从 C 函数里来读与写 TCL/TK 变量。二、编译选项为了能访问 TCL/TK 库,必须在你的源代码中要设置一些常规的例程做并编译它。有两个调用库的头文件被声明。i nclude i nclude 编译混合应用程序需要指出正确的编译目录,正确的库,并设置正确的连接标志。在TCL/TK 顶部的设置也是必须要包含的文件。而下面的设置是在使用 g+ 时要设置的。你的系统依赖于编译器和文件的定位可能有不同的变化。-I/software/tcl-7.4/include-I/software/tk-4.0/include-I/software/x11r5_dev/Include-L/software/tcl-7.4/lib-L/software/tk-4.0/lib-L/software/x11r5_dev/lib-ltk-ltcl-lX11三、初始化与注册命令建立混合 tcl/tk & C 应用程序的中心要围绕几条选择命令。首先就是Tk_Main 函数, 它用来控制整个 tcl/tk 解释器程序。这条命令没有返回值,因此,它需在你的main 函数中加下划线 ,你所有程序的一旦初始化, Tk_Main 函数带来三个变量。第二个变量是一个字符串型数组,每个字符串都有一个特殊的含义。第一个变量表示在这个数组的元素个数。第三个变量是指向初始化函数的指针。此初始化函数在许多地方都要被执行。字符串数组通过Tk_Main来通知 tcl/tk 解释器应用程序的名称和tcl/tk 命令在脚本中的位置。这个数组实际上是传给解释器的命令行参数。数组的第一项给出应用程序名称,第二项给出了运行的脚本位置。如果脚本没有在相同的执行目录下,则需要完整路径。由于继承原因,tcl/tk 需要字符串在许多函数里可以修改,它也有函数作用范围的问题,避免这些问题最早的办法是传递时动态分配字符串下面的代码碎片显示了调用利用Hello World 应用程序和脚本hello.tcl来调用 Tk_Main。/ prototype for the initialization functionint InitProc( Tcl_Interp *interp );/ declare an array for two stringschar *ppszArg2;/ allocate strings and set their contentsppszArg0 = (char *)malloc( sizeof( char ) * 12 );ppszArg1 = (char *)malloc( sizeof( char ) * 12 );strcpy( ppszArg0, Hello World );strcpy( ppszArg1, ./hello.tcl );/ the following call does not returnTk_Main( 2, ppszArg, InitProc );初始化函数Tk_Main 的调用控制了你的程序在 tcl/tk 中的整个调用,但是在底部初始化之后和tcl/tk 脚本运行之前,能够执行用户自定义的函数。上面的例子中展示了这个类型的函数: InitProc. 用户定义的初始化函数必须要返回一个整数类型并产生一个指向解释器的参数Tcl_Interp *。在初始化函数里面建立实际解释器调用Tk_Init。Tk_Init函数设置一个指向解释器的参数,这正是传递到初始化函数的指针。下面的代码仅只是初始化函数,更多的则是在后面列出。int InitProc( Tcl_Interp *interp )int iRet;/ Initialize tk firstiRet = Tk_Init( interp );if( iRet != TCL_OK)fprintf( stderr, Unable to Initialize TK!n );return( iRet ); / end ifreturn( TCL_OK ); / end InitProcC 函数作为 tcl/tk 过程现在你要熟悉在 tcl/tk 脚本中的过程调用。当设计混合应用程序中有 tcl/tk 的过程调用C 函数是可能的。完成它需要调用Tcl_CreateCommand 函数。这是在初始化函数里的常用做法。在 tcl/tk 过程中调用函数就象调用其它的过程一样。在 tcl/tk 脚本中存在就不必声明这个过程。函数注册有一个特定原型的过程。它们必须要返回一个整数类型,并设置4 个变量,第一个是 tcl/tk 库文件类型 ClientData。第二个变量是指向解释器的指针。最后的两个变量类似于在 C main函数中的 argc 和 argv 这两个变量被用于传递参数给tcl/tk 过程。参数argc 包含了传递给 tcl/tk 过程的参数个数 argv 是字符串数组,每个字符串包含了一个参数。int Myfunc( ClientData Data, Tcl_Interp *pInterp, int argc, char *argv );当一个函数被注册作为 tcl/tk 过程使用时需一个指针与之联系,指针通过ClientData来传递进来。ClientData的概念允许程序员联系数据结构和对象,调用能引用这个对象的过程。这个结构不经常需要。象早先提到的注册过程需要调用Tcl_CreateCommand 函数。这个函数有 5 个参数。第一个参数是指向解释器的指针,第二个参数是在 tcl/tk 中的过程名,第三个参数是一个指向函数的指针,它在当 tcl/tk 过程被执行时调用。最后两个参数是 ClientData 项, 一个指针删除例程。它允许 C 函数在程序退出为了清空联系对象的结构时被调用。象指向删除函数的指针ClientData 不经常调用。下面是 tcl/tk 过程调用hey_there 来调用上面声明的Myfunc进行注册的例子。Tcl_CreateCommand( interp, hey_there, Myfunc, (ClientData)NULL,(Tcl_CmdDeleteProc *)NULL );变量访问在执行 tcl/tk 过程时能调用 C 函数并允许你从 C 中获得 tcl/tk 的帮助,为了从 tcl/tk 中获得 C 的帮助,这有一系列函数,其中包含了从 tcl/tk 变量中处理获得的信息和设置的信息。Tcl_GetVarTcl_GetVar 函数返回一个指向 tcl/tk 变量的字符串指针。这个函数有三个参数:指向解释器的指针,tcl/tk 变量的名称,一个标志 flag。这个变量在执行脚本联系到解释器的当前范围被访问。如果在当前范没有局部变量则访问全局变量。如没有匹配的全局变量存在则返回一个错误。 Flags 参数允许你指定 TCL_GLOBAL_ONLY, 为了使这个函数仅仅访问此变量名的全局变量,下面是 tcl/tk 脚本中被访问的一部分代码。set say_hello_to World下面的代码是在 C 里访问 tcl/tk 变量say_hello_to.char sHelloTo30;/ after this call sHelloTo should contain Worldstrncpy( sHelloTo, Tcl_GetVar( pInterp, say_hello_to, 0 ), 29 );Tcl_SetVarTcl_SetVar函数允许程序员修改 tcl/tk 变量的值。此函数有四个参数:第一个是解释器指针,第二个是要修改值的 tcl/tk 变量名称,第三个是要修改的新值,最后一个是 tcl/tk标志 flags。Tcl_SetVar 的标志 flags 跟Tcl_GetVar的相同。当设置期间遇到出错时Tcl_SetVar函数返回 NULL 值。如果变量不存在,则此函数将在解释器指针引用的脚本内建立一个新的变量。下面的代码将设置 tcl/tk 变量say_hello_to的值为World。Tcl_SetVar( pInterp, say_hello_to, World, 0 );集成 C & tcl/tk 应用程序的例子这个应用程序展示了集成 C 和 TCL/TK 所需要的基础。此应用程序展示了一系列的登录框和按钮。当信息从登录框输入和按钮被按下时,其他的空域也被相应的更新。这有许多分享内存设备的接口,是调用大型应用程序的方法。这个接口需要头文件在下面没有包含进来,因此不修改而编译此应用程序是不可能的。但就阅读来说这并不是一个坏的示例。The MakefileThe script file: pr1The C file: proof.c#!/.software/local/.admin/bins/bin/wish -f#=# xmail# by Christopher Trudeau, Copyright 1997# This tcl/tk script displays a desktop clock which goes inverse video when# new mail arrives. A pull down menu allows the user to launch remote login# sessions on servers specified in the hosts variable. The sessions have# the appropriate xhost and DISPLAY values.# Comments and criticism on this program are greatly appreciated. Feel free to# send me a note at ctrudeauetude.uwaterloo.ca. This material is copyright# but non-commercial institutes have permission to reproduce the program in# its entirety, all other uses require explicit written permission of the# author.#=#-
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号