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