martes, junio 12, 2007

Cambiando el compilador de recursos.

El cambio a los 32 bits con interfaces gráficas, llámese como se llamen, nos trajo también un cambio en la manera de programar, básicamente en cuanto a los recursos gráficos se refiere.

Los que venimos de FiveWin, a 16 bits estábamos acostumbrados a utilizar DLLs para almacenar la interfaz gráfica de todos nuestros programas, esto por la facilidad de poder mover la interfaz, sin necesidad de mover la programación, sin embargo, a 32 bits, resulta mas "profesional" incluir los recursos como parte del EXE, como hacen la mayoría de los programas.

Para incluir los recursos en el EXE, es necesario primero tener el "código fuente" de dichos recursos, dicho código fuente se almacena en un archivo con la extensión .RC, y es un archivo de texto puro y duro, el cual contiene la definición de todos nuestros recursos gráficos, como bitmaps, cursores, tablas de strings, diálogos, etc. este archivo es muy fácil de obtener a partir de cualquier editor de recursos visual como el Borland Resource Workshop, el del Pelles C, o el Resource Builder. En todos los casos estos editores de recursos permiten guardar los archivos como .RC

Después de generar el archivo .RC tendremos que integrar ese archivo de recursos dentro de nuestro programa .EXE. Al ser un archivo de texto con código fuente, será necesario "compilarlo", para generar el equivalente de un archivo OBJ como cuanto tratamos con código fuente en cualquier otro lenguaje de programación, el equivalente del archivo OBJ para los archivos de recursos es el archivo .RES, muchos editores de recursos proveen de un compilador de recursos integrado que genera el archivo .RES directamente, una vez generado .RES el enlazador (linker) que estemos utilizando para generar nuestra aplicación se encargará de añadir el archivo .RES como parte del .EXE, como si fuera otro .OBJ.

La mayoría de nosotros utilizamos el compilador gratuito Borland C++ 5.5, que incluye el compilador de recursos BRC32.EXE, si embargo, este compilador de recursos falla cuando el archivo de recursos es demasiado grande, o bien cuando dicho archivo de recursos contiene algún bitmap o imagen de tamaño muy grande o con muchos colores.

¿ Cómo solucionar este problema ?

Muy sencillo, cambiando de compilador de recursos, obvio, pero.....

¿ Qué compilador de recursos usar ?.

En la última operación España 2007, estuve charlando con Bingen al respecto y me sugirió utilizar el compilador de recursos del Pelles C, un compilador de C gratuito, cuyo compilador de recursos funciona estupendamente para compilar recursos muy grandes o bien con mapas de bits complicados, que es lo que se dificulta al Borland C++.

El compilador de recursos del Pelles C se llama PORC.EXE y va a compañado de un PORC.DLL necesario para poder compilar nuestros recursos, su uso es similar al compilador de Borland, por lo que no tienes que cambiar absolutamente nada de tus archivos de compilación de recursos, excepto claro, el nombre del compilador, en vez del BRC32.EXE usarás el PORC.EXE y listo, debido a que utiliza los mismos switches de compilación no tienes que cambiar mas nada.

¿ Donde obtenerlo ?, directamente en la página de descargas del Pelles C, sugiero que descargues el archivo zip, en la segunda sección donde dice Executables and Help. El zip es sugerido porque no necesitamos el producto completo, solo el compilador de recursos que vamos a extraer usando el WinZip, WinRar ó alguna otra herramienta que maneje archivos Zip, deberemos recuperar 2 archivos dentro de este zip: PORC.EXE y PORC.DLL, guárdalos en cualquier directorio dentro de tu disco duro.

Veamos como usarlo con Xailer, que es lo mas rápido y fácil:

1) Copia el PORC.EXE y el PORC.DLL a la carpeta \Xailer\bin
2) Abre el IDE de Xailer selecciona del menú principal Herramientas / Opciones Generales y aparecerá este formulario, selecciona dentro del árbol Comp. de recursos dentro de la sección Directorios:



Selecciona la opcion Usar el siguiente compilador, indica la ruta donde esta el compilador PORC.EXE (en mi caso \Xailer\bin) y ya está no tiene sque tocar las opciones de compilación puesto que son las mismas para el PORC que para el BRC32.

3) Desde el IDE de Xailer, ahora toca RECONSTRUIR (Alt+F9) el proyecto, para volver a compilar el archivo de recursos, y si todo marcha como debe, el programa EXE debe de generarse sin ningún error.

En mis pruebas con Xailer me enfrenté a un pequeño problema, que fue que el PORC no estaba generando el archivo .RES (el error que el IDE te marcará es que no puede abrir "ARCHIVO.RES" pero lo hará hasta el proceso de linkado) y este error se estaba generando debido a mis archivos de recursos son muy viejos, vienen de las primeras versiones de Xailer en donde al crear el archivo de recursos, los comentarios de la cabecera son puestos con ";", pero para el PORC el ";" no es un indicador válido de comentario, y al momento de compilar marca un error de sintaxis, que no es visible dentro de la ventana de mensajes del IDE de Xailer, después de buscar un poco, di con una solución simple: edité el archivo .RC (recuerda que es un archivo de texto común y corriente) cambie los comentarios hechos con ";" por el típico /* ... */, y listo, problema solucionado, mis recursos se compilaron sin ningún problema y el exe corrió perfectamente.

Con FiveWin no es tan sencillo porque depende mucho de la forma en que estés compilando y del editor de recursos que estés usando.

Si compilas con un archivo .BAT, que es lo mas fácil, no tendrás ningún problema, simplemente cambia la referencia a BRC32.EXE por PORC.EXE, asegurandote de añadir la ruta completa a donde está el archivo EXE del PORC y listo.

Si estás utilizando algún gestor de compilación como VerCE, AJMake, xMate o algún otro entonces deberás ver si te permite indicar tu propio compilador de recursos, hasta donde tengo entendido xMate si te lo permite pero no VerCE ni AJMake.

Si tu gestor de compilación no te permite indicar otro compilador de recursos, entonces vamos a engañarlo, ubicate en la carpeta \BIN del Borland C++ y renombra el archivo BRC32.EXE como BRC32.OLD, copia en esta carpeta el PORC.EXE y el PORC.DLL y renombralos como BRC32.EXE y BRC32.DLL respectivamene y listo, si al momento de compilar el programa te marca que no encuenta PORC.DLL renombra nuevamente la BRC32.DLL como PORC.DLL y asunto arreglado.

Bien, otro problema viene dependiendo del editor de recursos que utilices, ya que por ejemplo el Workshop para la definición de los dialogos, hace uso de constantes predefinidas como DS_MODALFRAME, WS_CHILD, SS_LEFT y otras, con el compilador de recursos de Borland no tienes problemas para obtener los valores de estas constantes porque el compilador BRC32.EXE añade automáticamente los archivos de cabecera .H necesarios para compilar el archivo .RC, no así el PORC.

Para que PORC pueda conocer los valores de las constantes predefindas, será necesario agregar un archivo de cabecera al principio del archivo .RC, para nuestro caso, agregando esta línea al principio de tu archivo .RC:

#include "c:\borland\bcc55\include\winuser.h"

Y eso es todo, de esta forma, el compilador de recursos abrirá el archivo del borland C++ en donde están las definiciones de las constantes utilizadas por los recursos. No tendrás ningún problema en abrir nuevamente el RC con el Workshop, puesto que esta línea hace referencia a un archivo que existe en la instalación del Borland C++.

En el caso del Resource Builder, este trae integrado su propio compilador de recursos que te permite incluso agregar los recursos visuales después de que se haya generado el EXE, puede que sea necesario agregar esta linea antes de compilar.

El editor de recursos del Pelles C, incluirá automáticamene en el RC la línea comentada anteriormente, sin embargo lo hará haciendo referencia a los directorios del Pelles C (que no hemos instalado) auqneu el archivo de constantes predefinidas se llama igual: winuser.h; por lo mismo fallará el proceso de compilación, lo que procede aquí es cambiar la ruta para que apunte
al directorio de Borland y listo.

Con esta sencilla técnica tendrás un compilador de recursos poderoso y podrás incluir en tu RC bitmaps de cualquier tamaño y cantidad de colores, para cualquier interfaz gráfica.

No hay comentarios.: