天天看點

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); 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庫,庫裡隻有一個函數,實際應用時,隻需在此基礎上添加自己的函數就可以了。

繼續閱讀