通过调用dll来扩展Tcl命令

本文介绍如何使用VC++6.0创建一个名为random的Tcl DLL,包括设置环境、编译链接及加载使用等步骤。通过实例演示了如何在Tcl中调用C函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

下面是创建一个Tcl dll的例子。(using VC++ 6.0

1 创建一个新的win32 dll project,就叫它random吧。这也是将要创建的package的名字。

2 选择’Empty DLL’。

3 假设你已经在VC中设置好了Tcl headers libraries的位置。否则,打开Tools->Options->Directories,分别添加Tclinclude目录和 lib目录到相应box中。

4 Project->settings, C++ tab.添加 USE_TCL_STUBS Preprocesor definitions,Link TabObect/library modules的开头加 tclstub84.lib,注意你的version

5 Project中添加一个新的C++ file, random.cpp,代码如下。

6 Build it.不用管warning中的”MSVCRT conflicts.

7 tcllib目录下新建一个目录random,将刚才编译生成的random.dllrandom.lib拷贝到此目录。

8 tclshtkcon中,敲以下命令看一下:

//利用pkg_mkIndex自动生成程序包索引pkgIndex.tcl

(lib) % pkg_mkIndex random random.dll

Error: couldn’t change working directory to “random”: no such file or directory

random改成

pkg_mkIndex “C:/Tcl/lib/random” random.dll  OK

 

(lib) % set random_version 0.1

//加载(load)程序包

(lib) % package require random

0.1

//调用程序包中的c函数

(lib) % random 10

5

9 如果出错,请检查以上步骤。

 

复制内容到剪贴板

代码:

------------

The random.cpp code:

#include <windows.h>

#include <time.h>

#include <tcl.h>

fatal error C1083: Cannot open include file: 'tcl.h': No such file or directory

将其改成 #include “tcl.h” OK

对于#include <***.h> ,编译器从VC标准库路径开始搜索 ***.h
对于#include “***.h” ,编译器从用户的工作路径开始搜索 ***.h

 

 

#ifndef DECLSPEC_EXPORT

#define DECLSPEC_EXPORT __declspec(dllexport)

#endif // DECLSPEC_EXPORT BOOL APIENTRY

DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)

{

return TRUE;

} int RandomCmd(ClientData clientData,

Tcl_Interp *interp,

int argc, char *argv[]); EXTERN_C int DECLSPEC_EXPORT

Random_Init(Tcl_Interp* interp)

{

#ifdef USE_TCL_STUBS

Tcl_InitStubs(interp, "8.4", 0);

#endif

Tcl_Obj *version = Tcl_SetVar2Ex(interp, "random_version", NULL,

Tcl_NewDoubleObj(0.1), TCL_LEAVE_ERR_MSG);

if (version == NULL)

return TCL_ERROR;

int r = Tcl_PkgProvide(interp, "random", Tcl_GetString(version)); Tcl_CreateCommand(interp, "random", (Tcl_CmdProc *)RandomCmd,

(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);

/*

* Declare that we implement the random package

* so scripts that do "package require random"

* can load the library automatically.

*/

Tcl_PkgProvide(interp, "random", "0.1");

return TCL_OK;

} /*

* RandomCmd --

*/

int

RandomCmd(ClientData clientData, Tcl_Interp *interp,

int argc, char *argv[])

{

int randnum, error;

int limit = 0;

Random_Init(interp);

if (argc > 2) {

interp->result = "Usage: random ?range?";

return TCL_ERROR;

}

if (argc == 2) {

error = Tcl_GetInt(interp, argv[1], &limit);

if (error != TCL_OK) {

return error;

}

}

/*

* Seed the random-number generator with current time so that

* the numbers will be different every time we run.

*/

srand( (unsigned)time( NULL ) ); if (limit != 0) {

randnum = rand() % limit;

}

sprintf(interp->result, "%d", randnum);

return TCL_OK;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值