我是一个业余尝试破解一个小项目。它是一个简单的笔记存储和检索控制台应用程序在Windows Vista(和XP - 我希望从USB棒上运行整个事情)。
我使用Sqlite作为存储和Tcl / SQL脚本来添加注释(和标记!),并通过标记检索它们。 3个表和一个“Toxi”架构。
所以无论如何......我想从“dos提示”或更频繁的tclsh(不希望!)中使用它。我不想要窗口shell或者根本不使用TK。但是为了帮助在视觉上区分某些东西,标准输出stdout,来自时间戳的笔记等,我想用某种粗略的标记动态地改变字体颜色。
我找到了一个可以做到这一点的c ++项目! Jaded Hobo提出来:http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=9130。 Jaded Hobo说头文件“Console.H”足以包含在c ++项目中,但他不知道TCL。
我找到SWIG,接口编译器,我将尝试一下。但我对一些事情一无所知:
只需一个头文件即可吗?
SWIG Win32示例不像'nix示例那样具有启发性,他们使用MS VC ++(VStudio) - 我想使用Quincy / MinGW。
(哦,顺便说一下,这是我第一次尝试使用任何类型的C语言。那么你能说明如何在昆西使用SWIG吗?)
如何从标题源中收集到我在Tcl脚本中键入的内容以便使用它?
感谢您阅读本文,更不用说回答了。我开始把它放在comp.lang.tcl上,但我不喜欢我的电子邮件地址广播。
答案 0 :(得分: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
(名称应该稍微与入口点函数匹配),然后你就可以使用{ {3}}命令将新的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!"
}
有关如何选择颜色的指南,请参阅load
。