2010-07-07 16 views
0

我是一個業餘嘗試一起攻擊一個小項目。這是一個簡單的筆記存儲和檢索控制檯應用程序在Windows Vista(和XP - 我希望從USB棒上運行整個事情)。在飛行中的字體着色Tclsh通過c + +

我使用Sqlite作爲存儲和Tcl/SQL腳本來添加註釋(和標記!)並通過標記檢索它們。 3個表格和一個「Toxi」模式。

所以無論如何...我想從「dos提示符」或更頻繁的tclsh(不希望!)中使用它我不想要窗口shell或使用TK。但爲了幫助在視覺上區分一些事情,標準輸出從標準輸出,時間戳記等,我想用某種粗略標記即時更改字體顏色。

我發現了一個C++項目,將做到這一點! Jaded Hobo把它放在:http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=9130。 Jaded Hobo說頭文件「Console.H」足以包含在C++項目中,但他不知道TCL。

我發現SWIG,接口編譯器,我打算試一試。但我在幾件事情上毫無頭緒:

  1. 只是一個頭文件就夠了嗎?

  2. SWIG Win32示例不像'nix示例那樣具有啓發性,它們使用MS VC++(VStudio) - 我想使用Quincy/MinGW。

    (哦,順便說一句,這是在使用任何類型的Ç我的第一次嘗試。所以,你可以展示如何使用痛飲昆西?)

  3. 我怎樣才能從頭部源蒐集剛纔究竟發生了什麼輸入我的Tcl腳本來使用它?

感謝您閱讀本文,更不用說回答了。我開始把它放在comp.lang.tcl上,但我不喜歡我的電子郵件地址廣播。

回答

2

標題本身是不夠的。另一方面,由於this page指示API實際上非常簡單,所以您實際上不需要去做那麼多工作。這裏有您需要的C代碼:

#include <tcl.h> 
#include <windows.h> 

static int MySetConsoleColorCmd(
    ClientData clientData, Tcl_Interp *interp, 
    int objc, Tcl_Obj *const objv[]) 
{ 
    HANDLE hConsole; 
    int code; 

    /* Parse arguments, first for argument count, then for number format */ 
    if (objc != 2) { 
     Tcl_WrongNumArgs(interp, 1, objv, "colorCode"); 
     return TCL_ERROR; 
    } else if (Tcl_GetIntFromObj(interp, objv[1], &code) != TCL_OK) { 
     return TCL_ERROR; 
    } 

    /* Get console handle, checking for the error case */ 
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 
    if (hConsole == INVALID_HANDLE_VALUE) { 
     Tcl_SetResult(interp, "not a console application", TCL_STATIC); 
     return TCL_ERROR; 
    } 

    /* Set the color! */ 
    SetConsoleTextAttribute(hConsole, code); 
    return TCL_OK; 
} 

/* Standard entry point for loadable library */ 
int Consolecolor_Init(Tcl_Interp *interp) { 
    Tcl_CreateObjCommand(interp, "consolecolor", MySetConsoleColorCmd, 
      NULL, NULL); 
    return TCL_OK; 
} 

編譯此成一個DLL(它有沒有花哨的依賴關係可言,超越的Tcl本身)稱爲consolecolor.dll(該名稱應與有些入口點函數),然後你馬上就能使用load命令導入新consolecolor命令到你的代碼,就像這樣:

load /path/to/consolecolor.dll 

# Duplicate example from the page mentioned at the top of this answer 
for {set k 1} {$k < 255} {incr k} { 
    consolecolor $k 
    puts "$k => I want to be nice today!" 
} 

的指南,如何挑選顏色,看到this MSDN page

+0

謝謝先生們 - 我認識你們的名字和照片 - 你們一定非常慷慨。我很快與Quincy合作。我檢查了項目中的DLL選項,但它給了文件一個.o擴展名! 所以我複製了一個tcl.h和consolecolor.c到MinGW \ bin並嘗試了一個命令行編譯,結果如下所示。我準備僱人來做這件事! c:\ quincy \ MinGW \ bin> gcc -shared consolecolor.c -o consolecolor.dll consolecolor.c:1:17:error:tcl.h:No such file or directory consolecolor.c:5:error: 'clientData' consolecolor之前預期的')'。'*'標記之前的c:32:error:expected')' – klausnrooster 2010-07-11 03:15:27

+0

@klaus:您需要使用'-I'選項將包含tcl.h的目錄的名稱傳遞給GCC。因此,如果這是當前目錄,請使用'-I.' – 2010-07-11 09:27:23

+0

任何有興趣的人,我把dll編譯成www.vworker.com上的一個項目(以前稱爲rentacoder)。我的手柄有TclHobbyist。我試過並嘗試過。無論是我得到錯誤消息還是成功導致consolecolor.o文件無論如何。 [Uuuuughhhhh!] – klausnrooster 2010-07-11 17:37:00