Creación de DLLs con Xailer 2

Estimados usuarios de Xailer,

A partir de Xailer 2 es posible la creación de DLLs, es decir, librerías de enlace dinámico. Como su nombre indica se trata de librerías que se cargan en tiempo de ejecución sobre el propio ejecutable de la aplicación y desde dicho momento, todos las funciones existentes en la librería DLL son accesibles desde la propia aplicación. La ventaja principal del uso de este tipo de librerías es que le permite romper su aplicación en varios módulos, pudiendo de esta forma, entregar sólo los módulos que desee y ante cualquier modificación o mejora del programa sólo tener que entregar los módulos nuevos o aquellos que hayan cambiado.

Las librerías creadas con Xailer son librerías que contienen únicamente código intermedio (pcode) para ser ejecutado por la máquina virtual de xHarbour que reside en la aplicación principal. Por lo tanto, este tipo de librerías sólo pueden ser utilizadas por programas escritos con Xailer.

Las librerías DLL pueden contener recursos al igual que el módulo principal de la aplicación. Por defecto, la aplicación buscará los recursos en su módulo principal, pero sino los encontrase realizaría la búsqueda de los mismos en todas las librerías DLLs que estuviesen cargadas y en el mismo orden en que estas hubiesen sido cargadas.

Para la creación de una librería DLL tan sólo es necesario indicarlo en la opción de menú de propiedades del proyecto:

Propiedades del projecto

Para que la generación de la DLL se realice correctamente es necesario la existencia de la librería XailerDLL.lib en el directorio Lib.

Para poder acceder a la DLL desde cualquier aplicación tan sólo habrá que cargar la DLL con la función de HB_LibLoad( ) que devuelve un ‘handle’ a dicha librería, que será mayor que cero en el caso de que el proceso haya sido realizado con éxito.

Si desea descargar la librería puede utilizar la función HB_LibFree( ) que recibe como único parámetro el ‘handle’ obtenido en la llamada previa de carga de la librería.

Para acceder a cualquier función o clase existente en la librería DLL desde el programa principal es necesario indicarle al compilador que dicha función se cargará de forma dinámica y para ello se utiliza la directiva DYNAMIC de xHarbour, de la misma forma que utiliza, por ejemplo, la directiva REQUEST.

DYNAMIC TFormInDLL

.....
.....

//-----------------------------------------

METHOD Button1Click( oSender ) CLASS TForm1

   LOCAL nHandle

   nHandle := HB_LibLoad( "CodeInDll.dll" )

   TFormInDLL():New(Self):ShowModal()

   HB_LibFree( nHandle )

RETURN Nil

Puede encontrar un ejemplo completo de uso de DLLs en el directorio XailerSamplesDlls

Limitaciones:

No obstante, la utilización de las librerías del tipo DLL tienen algunas limitaciones que ha de tener en cuenta:

  • Es posible que cuando realice la carga de la DLL con la función HB_LibLoad() se le muestre en la ventana de depuración una lista de funciones no encontradas. Obviamente sólo se muestra esta pantalla cuando se ejecuta la aplicación desde el IDE. Esta lista de funciones, se refiere a funciones de bajo nivel (escritas en ‘C’) básicas que presumiblemente intentará utilizar la DLL pero que sin embargo no se encuentran en el ejecutable. En el caso de que dichas funciones sean ejecutadas por algún código dentro de la DLL inexorablemente se producirá un GPF. La única forma de evitarlo es forzar a que dichas funciones se enlacen con el ejecutable y el clásico REQUEST no es válido, ya que dicha directiva sólo es válida con funciones de alto nivel. La forma de hacerlo es creando funciones ‘dummy’ en el ejecutable que fuercen su enlazado. La librería XailerDLL.lib es precisamente la encargada de garantizar la disponibilidad de la mayoría de las funciones del API de xHarbour y el propio Xailer. Esto sólo afecta a rutinas en ‘C’ escritas dentro de la DLL. Si usted no ha creado ninguna función en bajo nivel dentro de la DLL no tendrá ningún problema aunque le aparezca el mensaje con nombres de funciones no existentes.
  • Todas las funciones de alto nivel que utilice en la librería DLL deben estar enlazadas en el ejecutable o desarrolladas en la propia librería, en caso contrario recibirá un error de ejecución recuperable del tipo ‘Función no encontrada’. Para forzar que una determinada función se enlace en el ejecutable final recuerde que puede utilizar la directiva REQUEST de xHarbour.
  • Es posible sobrecargar una función PRG existente en el ejecutable, pero sólo se ejecutará la nueva función cuando se ejecute desde la DLL.
  • Es posible sobrecargar más de una vez la misma función PRG en más de una DLL, pero en dicho caso, desde el ejecutable principal se ejecutará siempre la función de la primera DLL cargada.

Hemos tenido que subir una nueva versión de Xailer 2 para su correcto funcionamiento y de paso hemos corregido todos los pequeños errores que nos habéis encontrado desde la última publicación. Podéis descargar la nueva versión desde el siguiente enlace:

http://www.xailer.com/files/xailer20beta.exe

Requiere la misma versión xHarbour que utilizamos normalmente para Xailer 2 que podéis descargar desde la siguiente dirección:

http://www.xailer.com/files/xharboursetup2.exe

Os recordamos que está versión de Xailer sólo está disponible para usuarios con suscripción activa. Leer el artículo Novedades de Xailer 2.0 para más información.

Un cordial saludo,

[El equipo de Xailer]