2010-07-07 5 views
0

Je suis un amateur essayer de bidouiller un petit projet. C'est une simple application de console de stockage et de récupération de note sur Windows Vista (et XP - j'espère pouvoir tout faire fonctionner avec une clé USB).A la volée police de couleur dans Tclsh via C++

J'utilise Sqlite comme magasin et scripts Tcl/SQL pour ajouter des notes (et des balises!) Et aussi les récupérer par balise. 3 tables et un schéma "Toxi". Donc de toute façon ... Je veux l'utiliser soit d'une "invite de DOS" ou plus souvent tclsh (PAS VRAIMENT!) Je ne veux pas du tout de fenêtre ou d'utiliser TK. Mais pour aider à distinguer visuellement certaines choses, stdin de stdout, des notes d'horodatage, etc, je veux changer la couleur de la police à la volée avec une sorte de balisage brut.

J'ai trouvé un projet C++ qui fera exactement cela! Jaded Hobo l'a mis sur: http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=9130. Jaded Hobo dit que le fichier d'en-tête "Console.H" est suffisant pour être inclus dans un projet C++, mais il ne connaît pas TCL.

J'ai trouvé SWIG, le compilateur d'interface, et je vais essayer. Mais je suis clueless sur quelques choses:

  1. Peut juste un fichier d'en-tête être assez? Les exemples SWIG Win32 ne sont pas aussi édifiants que l'exemple 'nix' et ils utilisent MS VC++ (VStudio) - Je veux utiliser Quincy/MinGW.

    (Oh, BTW ceci est ma première tentative d'utiliser C d'aucune sorte. Pouvez-vous montrer comment utiliser SWIG avec Quincy?)

  2. Comment puis-je tirer de la source d'en-tête juste ce que le diable taper mon script Tcl pour l'utiliser?

Merci d'avoir lu ceci, sans parler de répondre. J'ai commencé à le mettre sur comp.lang.tcl mais je n'aime pas ma diffusion addr email comme ça.

Répondre

2

Un en-tête ne suffit pas à lui seul. D'un autre côté, vous n'avez vraiment pas besoin d'aller à tout ce travail puisque this page indique que l'API est réellement très simple. Voici le code C que vous avez besoin:

#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; 
} 

Compile ce en une DLL (il possède pas de dépendances fantaisie du tout, au-delà Tcl lui-même) appelé consolecolor.dll (le nom doit correspondre à la fonction de point d'entrée un peu) et vous « ll être en mesure d'utiliser la commande load pour importer la nouvelle commande consolecolor dans votre code, comme ceci:

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!" 
} 

pour un guide sur la façon de choisir les couleurs, voir this MSDN page.

+0

Merci M. Fellows - Je reconnais votre nom et votre photo - vous devez être très généreux avec votre temps. J'ai essayé rapidement avec Quincy. J'ai vérifié l'option de DLL dans le projet mais il a donné au fichier une extension .o! J'ai donc copié un tcl.h et le consolecolor.c dans MinGW \ bin et essayé une compilation en ligne de commande avec le résultat que vous voyez ci-dessous. Je suis prêt à embaucher quelqu'un pour le faire! C: \ quincy \ MinGW \ bin> gcc -shared consolecolor.c -o consolecolor.dll consolecolor.c: 1: 17: erreur: tcl.h: Aucun fichier ou répertoire consolecolor.c: 5: erreur: attendu ')' avant 'clientData' consolecolor.c: 32: erreur: attendu ')' avant '*' token – klausnrooster

+0

@klaus: Vous devez passer le nom du répertoire contenant tcl.h à GCC en utilisant l'option '-I'. Donc, si c'est le répertoire courant, utilisez '-I.' –

+0

Quelqu'un qui est intéressé, j'ai mis la compilation dll en projet sur www.vworker.com (anciennement rentacoder). Mon manche est TclHobbyist. J'ai essayé et essayé. Soit j'ai eu des messages d'erreur ou un succès qui a abouti à un fichier consolecolor.o quel qu'il soit. [Uuuuughhhhh!] – klausnrooster

Questions connexes