tcl/tk笔记-创建一个Tcl dll的例子

下面是创建一个Tcl dll例子。(using VC++ 6.0)
1 创建一个新的win32 dll project,就叫它random吧。这也是将要创建的package的名字。
2 选择’Empty DLL’。
3 假设你已经在VC中设置好了Tcl headers 和libraries的位置。否则,打开Tools->Options->Directories,分别添加Tcl的include目录和 lib目录到相应box中。
4 Project->settings, 在C++ tab中.添加 USE_TCL_STUBS 到Preprocesor definitions,在Link Tab中Obect/library modules的开头加 tclstub84.lib,注意你的version。
5 在Project中添加一个新的C++ file, random.cpp,代码如下。
6 Build it.不用管warning中的”MSVCRT” conflicts.
7 在tcl的lib目录下新建一个目录random,将刚才编译生成的random.dll和random.lib拷贝到此目录。
8 在tclsh或tkcon中,敲以下命令看一下:
//利用pkg_mkIndex自动生成程序包索引pkgIndex.tcl
(lib) % pkg_mkIndex random random.dll
(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> #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;
}

以上只是实现了了一个简单的Tcl dll库,库里只有一个函数,实际应用时,只需在此基础上添加自己的函数就可以了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值