下面是建立一個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);
Tcl_PkgProvide(interp, "random", "0.1");
return TCL_OK;
}
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;
}
}
srand( (unsigned)time( NULL ) ); if (limit != 0) {
randnum = rand() % limit;
}
sprintf(interp->result, "%d", randnum);
return TCL_OK;
}
以上隻是實作了了一個簡單的Tcl dll庫,庫裡隻有一個函數,實際應用時,隻需在此基礎上添加自己的函數就可以了。