Es hora de ayudar un poco a la comunidad de Velneo mediante un post dedicadoal desarrollo en C++ para la plataforma Velneo.

Para ello vamos a crear una primera librería que permita la recodificación de ficheros de ANSI a UTF-8 y otros formatos de codificación. Para ello utilizaremos Visual Studio 2008 y su compilador para Win32 así como alguna clase de ejemplos ya existentes (http://www.codeproject.com/file/textfiledocument.asp). Podríamos optar a compilarlo mediante GCC u otro multiplataforma y obtener las librerías para win/linux/mac pero eso lo aparcamos para otro día, hoy nos centramos en C++ para Win32…

No pretenderemos que este ejemplo resuelva la problemática de codificación de ficheros surgida en Velneo, solo queremos que sea un ejemplo valido para iniciaros en la creación de librerías en C++ para Velneo así como un caso de estudio sobre la problemática que esto supone…

Lo primero es crear el Proyecto

image

De tipo DLL (sin ATL ni MFC, puro Win32)

image

Después incluimos los ficheros textfile.cpp y textfile.h en el proyecto. Previamente los hemos descargado y copiado en la carpeta de las fuentes del proyecto

image

Comentamos la línea 127 en el fichero textfile.h  (cosas de MFC y como no queremos usar MFC la comentamos)

//#include <afx.h>

Revisamos el diagrama de clases, para ello creamos un Class Diagram

image

Arrastramos y soltamos todas las clases del proyecto desde el Class View

image

Desplegamos y realizamos un pequeño estudio de sus funciones y métodos image

Está bien, toca implementar la funcionalidad necesaria para tratar las conversiones. Lo que vamos a codificar permitirá exponer una serie de funciones desde la librería a Velneo. El fichero dllmain.cpp es el que contendrá las definiciones y su implementación. Inicialmente solo contiene un include la entrada principal de la librería que se llama en los distintos puntos del ciclo de vida de la ejecución de la misma

image

Vamos a empezar incluyendo la clase recientemente incorporada al proyecto. para ello en la cabecera escribimos:.

#include "textfile.h"

Lo siguiente es definir una macro para no tener que andar escribiendo demasiadas veces lo mismo.

#define EXPORT extern "C" __declspec(dllexport)

Continuemos con la definición de las funciones a implementar:

image

y por último las implementamos:

image

Terminada la cuestión de la librería hay que empezar con el proyecto de Velneo que llamará a las cuatro funciones.

image

Un anexo, una librería externa y cuatro funciones que exponen las de la librería (no son estrictamente necesarias)

image

Por último lo ponemos en practica y a disfrutar…

Respecto al debug tenemos que contar un par de cositas… Si queremos hacer debug de la librería haremos lo siguiente:

Primero compilamos en modo Debug

Luego copiamos los ficheros necesarios a la caja y a la cache de ejecución

image

Por último adjuntaremos el debug al proceso vClient que queremos analizar

image

image

Tener en cuenta marcar los puntos de ruptura adecuados en las llamadas de las funciones a controlar y poco más.

image

Cuando la ejecución del vClient llame a las funciones se producirán los puntos de ruptura y podréis analizar el código en ejecución.

Os dejamos aquí las fuentes y la Dll compilada para que trabajéis sobre ello.

Código fuente de la DLL compilada – zip

Librería DLL compilada – zip

El proyecto de Velneo os la dejamos en vuestras manos… no creo que os resulte demasiado complejo. Esperamos que os ayude en vuestros intereses de igual forma que lo hará sobre los nuestros para PaaSOS.

10 Comments

  1. Os agradezco muchísimo el tiempo y el esfuerzo que habéis dedicado a este tema, puesto que fuí yo quien lo inicié en el foro de Velneo.

    Estoy intentando colocar en mi mapa de Velneo 6 esta .dll, pero me temo que no lo estoy haciendo nada bien.
    La dll la he configurado así: NOMBRE ansi2utf8.dll,  BOOL  _cdecl ChangeEncodeUtf8 ( int codein, int codeout, char* filein, char* fileout ).
    La he colocado en la carpeta SYTEM32, y le envio los nombres de fichero entrada y salida como parámetros finales, pero en los «int» no sé si tengo que enviar la numeración de código de página inicial y final.
    ¿podríais echarme una mano?, os lo agradecería muchísimo.
    Gracias por todo.
    Paco Carbonell.
    carbonell@ecoinformatica.com
     
     
     

  2. No te preocupes por nuestra dedicación, nos vendrá muy bien para PaaSOS y esperamos que también les venga bien a los usuarios de la comunidad Velneo.

    Respecto al uso, creo que los estás haciendo bastante bien, pero has de tener en cuenta algunas cosillas:

    La ruta ha de ir formateada como en c++   «C://Temp//Fichero.txt».
    Como bien apuntas codein y codeout son los códigos de página del fichero. En tu caso creemos que el mismo para ambos… 1252?
    La librería en v6 seguramente en la ruta donde este el mapa, si tienes dudas, copiala a la ruta del ejecutor, mapa y system32.

    Jorge Hontoria.

  3. Siento abusar de tu cordialidad Jorge, pero no consigo ejecutar la DLL…

    Siguiendo tus consejos, la he colocado en la carpeta donde se encuentra el mapa,  he combinado algunos «codepages» de entrada y salida, el de entrada (ansii-latin) debería ser el 1252 (ansi-latin), y el de salida (utf8) 65001.
    He colocado las rutas con «//» entre cada directorio, he colocado las rutas «a pelo» por si no funcionaba con variables,  pero el resultado de la función siempre me ha dado «false».
    ¿se te ocurre alguna  cosa que esté haciendo incorrectamente?
    Te agradezco mucho cualquier aportación.
    Saludos,
    Paco Carbonell.
     
     
     
     

  4. ¿El gazapo?, bien… ejem…, …declaré en el mapa la función con un error ortográfico.

    Repasé las partes difíciles y olvidé mirar lo elemental.

    Te repito mi agradecimiento, pues tengo la solución gracias a tu tiempo y conocimientos.
    Seré un lector de tu blog de ahora en adelante, aunque no me entere demasiado de algunos temas, y es que no puedo abarcar todo el horizonte informático.
     
    Un abrazo,
    Paco Carbonell.
     

  5. Hola Paco
    ahora que tu ya lo has podido implementar en v6, podras hecharme la mano para que lo pueda implementar en una aplicacion que necesito utilizar codificacion UTF-8, podras enviarme un ejemplo sencillo ??
    saludos

Responder a Paco Carbonell Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *