Velneo y un largo día con C++
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
De tipo DLL (sin ATL ni MFC, puro Win32)
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
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
Arrastramos y soltamos todas las clases del proyecto desde el Class View
Desplegamos y realizamos un pequeño estudio de sus funciones y métodos
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
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:
y por último las implementamos:
Terminada la cuestión de la librería hay que empezar con el proyecto de Velneo que llamará a las cuatro funciones.
Un anexo, una librería externa y cuatro funciones que exponen las de la librería (no son estrictamente necesarias)
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
Por último adjuntaremos el debug al proceso vClient que queremos analizar
Tener en cuenta marcar los puntos de ruptura adecuados en las llamadas de las funciones a controlar y poco más.
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.
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
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.
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.
Ólvida el comentario anterior Jorge, ya he encontrado el gazapo y funciona perfectamente.
Un millón de gracias!
Saludos,
Paco Carbonell.
Me alegro mucho ;-). ¿Cuál era el gazapo?
Esperamos verte a menudo por aquí…
Atentamente,
Jorge Hontoria
¿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.
Muy buen aporte, si señor …
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
Perdon por mi ignorancia. Yo acabo de comenzar con velneo y mi duda es a que le llaman el mapa?
Hola Harnoldo:
Mapa era lo que teníamos que ejecutar en la antigua versión de Velneo 6x. Se llamaba así porque tenía extensión .map
Un saludo