dll文件:
#include "C:\Tcl\include\tcl.h"
#pragma comment(lib,"C:\\Tcl\\lib\\tcl84")
//C函数
int MyFunc(int i)
{
return i*10;
}
//在这个函数里调用我们自己的C函数
int TclCmdProc(ClientData clientData, Tcl_Interp *interp, int objc, char * CONST * objv)
{
//获得参数
int iArg = 0;
Tcl_GetInt(interp, objv[1], &iArg);
//将参数传入C函数
int iResult = MyFunc(iArg);
//将C函数的返回结果传回
Tcl_SetObjResult(interp,Tcl_NewIntObj(iResult));
return TCL_OK;
}
//导出该函数,函数名必须是dll名_Init,dll名只能第一个字母大写!
//需要extern "C" 关键字
extern "C" __declspec(dllexport) int Testtcl_Init(Tcl_Interp *interp)
{
//将函数与命令"t10"绑定
Tcl_CreateCommand(interp,"t10",(Tcl_CmdProc*)TclCmdProc,(ClientData)NULL,(Tcl_CmdDeleteProc *) NULL);
return TCL_OK;
}
TCL脚本文件:
#导入dll文件
load ./TestTcl
#主函数,第一个参数是文件名,第二个参数是要处理的值
proc main {logfile num} {
#打开文件
set logfilep [open $logfile a+];
#调用t10命令,将要处理的值作为第一个参数传入
set rtn [t10 $num]
#将返回的结果写入文件
puts $logfilep "$rtn";
#关闭文件
close $logfilep;
}
main [lindex $argv 0] [lindex $argv 1]
执行该脚本时,需要传入两个参数,第一个是保存结果的文件名,第二个是要调用c函数处理的值。
DLL中一定要导出初始化函数,该函数命名规则为"dll名_Init",并且dll名只允许第一个字母大写,导出时需要extern "C"关键字。