一、将C:\Program Files\GEOVIA\Surpac\72_x64\x64\bin\tcl.dll转换成tcl.lib
1.下载pexports.exe
(连接)https://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/pexports-0.47/
2.将下载的pexports.exe放在surpac安装目录的bin下
例如:C:\Program Files\GEOVIA\Surpac\72_x64\x64\bin
3.打开cmd,进入当前的目录:
cd D:
cd C:\Program Files\GEOVIA\Surpac\72_x64\x64\bin
4.执行命令:
(1)先将dll转成def
pexports.exe tcl.dll > tcl.def
(2)利用def生成lib
lib /machine:x64 /def:tcl.def
在当前文件夹下生成tcl.lib
二、下载tcl85x64并安装(链接)
三、制作dll
Visual Studio 2019新建dll项目
2.引入C:\Program Files\GEOVIA\Surpac\72_x64\x64\bin\tcl.lib
右键项目名称->属性
3.引入tcl includ和lib
4.在源文件中新建cpp文件
// 当使用预编译的头时,需要使用此源文件,编译才能成功。
#include "pch.h"
#include "tcl.h"
#include <fstream>
#include <iostream>
using namespace std;
// numbers sort
int Re(int velocity, int scale, int viscosity)
{
return velocity * scale / viscosity;
}
int Recmdproc(ClientData clientdata, Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[])
{
int num[3], temp;
//检测命令所带参数个数(一个命令,加上三个参数,所以为4).
if (objc != 4)
{
Tcl_WrongNumArgs(interp, 1, objv, "arg1 arg2 arg3!");
return TCL_ERROR;
}
//检测参数是否为数字.
if (objc == 4)
{
for (int varindex = 1;varindex <= 3;varindex++)
{
//若非数字类型, Tcl_GetDouble则不能完成,内部返回0, 否则返回1(TCL_OK)
//顺便取出参数到数组,准备下面的计算
if (Tcl_GetIntFromObj(interp, objv[varindex], &num[varindex - 1]) != TCL_OK)
{
Tcl_WrongNumArgs(interp, 1, objv, "is Int Type!");
return TCL_ERROR;
}
}
}
//调用Re函数计算
temp = Re(num[0], num[1], num[2]);
//将结果返回给解释器
Tcl_SetObjResult(interp, Tcl_NewIntObj(temp));
return TCL_OK;
}
extern "C" __declspec(dllexport) int Etcl_Init(Tcl_Interp * Interp) {
// Interp->freeProcDontUse
//Interp->
//printf("asdfasdf");
try {
ofstream outfile;
outfile.open("d:/testc.txt");
outfile << &Interp << endl;
outfile.close();
Tcl_CreateObjCommand(Interp, "Re", Recmdproc, (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL);
}
catch (...) {
ofstream outfile;
outfile.open("d:/testc.txt");
outfile << "asdfsadf" << endl;
outfile.close();
}
// 删除这个解释器
return TCL_OK;
}
5.右键项目名称生成dll文件
四、将dll文件放入surpac的bin目录下
五、tcl中调用
load etcl.dll
puts [Re 4 4 4]