Ejecutando una Aplicación dBL
desde un CD-ROM
por Robert Bravery
Traducción : Juan Manuel Espinosa G., Desarrollador de Software


Introducción

Desde hace algún tiempo, he leído u oído hablar de personas que quieren saber como ejecutar sus aplicaciones desde un CD,  ya sea para distribuir un demostración, o para mantener sus datos residentes en el CD,  de tal modo que los datos no puedan ser modificados.  Afortunadamente, tuve la oportunidad de poner algunas de mis ideas en práctica para saber si podrían funcionar.  unas cuantas de esas ideas fueron completamente o en parte inspiradas por los grandes aportaciones de los grupos de noticias de Visual dBASE.  Reflexionando sobre ellas, puede afrontar muchos problemas y encontrar muchas soluciones.

Algunos Problemas

Ejecutar sus aplicaciones desde un CD no es posible sin sus problemas.  Cuando decida continuar, necesita ser consciente de algunos de estos problemas.  Algunos pueden ser superados usando atajos o rodeos usuales, mientras otros deben aceptarse debido a su naturaleza.

Tenga presente que al ejecutar una aplicación desde un CD, la velocidad de carga como acceso a datos será substancialmente más lenta que al ejecutar la aplicación desde su unidad de disco duro o incluso de una conexión de red LAN.  De modo que, al diseñar su aplicación, tenga presente la falta de velocidad y diseñe con sensatez.

Para que su aplicación funcione, necesitará instalar los archivos runtime de dBASE, y si usted quiere acceder a cualquier tabla de datos, el Motor de Datos de Borland (BDE por sus siglas en inglés) . Aquí necesita decidir si ejecutar los archivos runtime y el BDE desde el CD o instalarlos “formalmente” en la unidad de disco duro con entradas apropiadas de registro, o en su lugar, copiar tanto la aplicación como los archivos runtime y el BDE a una nueva carpeta en la unidad de disco duro y ejecutar todo desde allí.  Cada una de estas alternativas tiene algún efecto sobre la velocidad o bien problemas de compatibilidad.

Si está usando imágenes, también pueden acceder a ellas desde el CD.  Pero minimice el tamaño de los archivos porque he encontrado que los archivos grandes de imágenes provocan el fallo de dBASE cuando se ejecutan desde el CD.  Intente usar archivos JPEG puesto que son mucho más pequeños.  También, intente mantener el tamaño de los archivos por debajo de los 50 Kb.  La razón es que cargar las imágenes desde el CD toma demasiado tiempo, y parece haber algún tipo de suspensión (timeout) asociado cuando se ejecutan aplicaciones desde el CD.

Addendum (por Juan Manuel Espinosa Gómez - Junio/2002)

Redireccionando la creación de archivos de Salida

Recientemente un miembro de la Comunidad de dBASE en Español inició una discusión para solucionar un problema que se presentaba al intentar escribir archivos temporales a una unidad de solo lectura. Cuando el dBL ejecuta un enunciado SQL que contiene la sentencia ORDER BY el BDE genera un archivo temporal _qsqlnnnn.dbf al directorio de trabajo predeterminado por lo que debemos encontrar una solución a este problema

Veamos el ejemplo siguiente.

En un archivo .rep (reporte) existe la declaración del siguiente objeto query:
 
 
this.QINSPECCIONES1 = new QUERY()
this.QINSPECCIONES1.parent = this
   with (this.QINSPECCIONES1)
      left = -15
      top = -15
      database = form.database1
      sql = 'select * from inspecciones ORDER BY FechaRep'
      active = true
   endwith
   

La linea sql = 'select * from inspecciones ORDER BY FechaRep' al ser ejecutada (active :=true) genera el archivo temporal al directorio de trabajo predeterminado, cuando la unidad es de solo lectura no permite hacer la escritura del archivo temporal originando un intento fallido por ejecutar la sentencia SQL y por consiguiente su demo no funcionaría. Para resolver esto necesitamos redirigir el directorio de trabajo y ejecutar nuestra sentencia antes de que entre en ejecución el reporte o informe, esto lo haremos ejecutando el siguiente código en la cabecera del archivo .rep, como se ilustra en el siguiente código:
 
 
LOCAL wdTemp, wdActual, cSQL

wdTemp = space(50)
cSQL   = ''

// Declara la funcion para extraer el directorio de Windows
if type("GetWindowsDirectoryA") #"FP"
    EXTERN CINT GetWindowsDirectoryA(CSTRING, CINT)  KERNEL32
endif

// Extrae el directorio de Windows
GetWindowsDirectoryA(wdTemp, 50)
wdTemp = LTRIM(RTRIM(wdTemp))

// Indicamos el directorio temporal
wdTemp= SUBSTR(wdTemp, 1, Len(wdTemp)-1) + '\Temp\'
// Guardamos en una variable la ruta actual predeterminada de acceso a datos de la aplicación-demo
wdActual= SET('DIRECTORY')

// Ejecutamos la sentencia SQL con salida a nuestro directorio
If FILE(wdTemp+"miResultado.dbf")
    DELETE FILE  wdTemp+"miResultado.dbf"
EndIf

// Declaramos la cadena que contiene la sentencia ORDER BY
cSQL = [SELECT * FROM "]+wdActual +[\Inspecciones.dbf" ORDER BY Fechaq]

// Posiciona la salida de archivos a la ruta temporal
SET DIRECTORY TO (wdTemp)

// Ejecuta la sentencia SQL
nResult = SQLEXEC( cSQL, wdTemp+"miResultado.dbf")
// Recupera la ruta predeterminada de acceso a datos de su aplicación-demo
SET DIRECTORY TO (wdActual)

If nResult # 0
    msgbox('Error Generando Reporte','Informe a Sistemas')
    return
EndIf

*** END HEADER -- no elimine esta línea
//
// Generado en 06/06/2002
//
local r
r = new ListInspeccionesClienteReport()
r.render()

class ListInspeccionesClienteReport of REPORT
   with (this)
      title = "Inspecciones"
      scaleFontBold = false
   endwith

   this.QISPECCIONES1 = new QUERY()
   this.QINSPECCIONES1.parent = this
   with (this.QINSPECCIONES1)
      left = -15
      top = -15
      sql = 'select * from "c:\windows\Temp\miResultado.dbf"'
      requestLive = false
      active = true
   endwith
   .
   .
   etc...

endclass

   

Observe que la línea sql queda como Código Duro o Hardcode (cuando algo es programado de modo que no se puede alterar sin tocar el código fuente, en este caso la ruta del archivo .dbf),  a menos que usted quiera asignar las propiedades .datalink también en el encabezado del archivo .rep .

Sin duda que debe haber más formas de lograr el rodeo o atajo para evitar estos problemas y cualquier ejemplo o mejora que tengan será bienvenido para ofrecer mayores alternativas a la comunidad de programadores de dBL

Reuniendo los Archivos

Cree y compile su aplicación.  A menos que sea inevitable, no vincule sus imágenes a su programa ejecutable.  Cree una carpeta (directorio) de CD. Si es posible, cree carpetas separadas para los datos e imágenes.  Asegúrese de que sus rutas a estas carpetas sean correctas para que sus aplicaciones puedan encontrar los datos e imágenes en el CD.  Después reúna los archivos del runtime de dBASE.  Estos archivos necesitan ser puestos en el directorio de la raíz del CD junto con la aplicación y el BDE.  Si sólo los archivos de los datos permanecerán en el CD, entonces necesitará crear un programa de instalación para los archivos del runtime y BDE (como se comentó antes).  La lista de archivos del runtime puede obtenerse en su directorio /Bin de dBASE.

Tabla de archivos Runtime para el Visual dBASE 7.x
 
  Nombre de Archivo para VdB 7.5 Explicación
  VDB7RUN.EXE Archivo núcleo del Runtime de dBASE
  VDB70009.DLL Biblioteca predeterminada del Idioma Inglés
  VDB70007.DLL Biblioteca predeterminada del Idioma Alemán
  VDB70010LL Biblioteca predeterminada del Idioma Italiano
  VDB7000a.DLL Biblioteca predeterminada del Idioma Español
  VDB7000c.DLL Biblioteca predeterminada del Idioma Frances
  RESOURCE.DLL Biblioteca de recursos para iconos, bitmaps, etc
     

Tabla de archivos Runtime para dB2K
 
  Nombre de Archivo para dB2K  Explicación
  DB2KRUN.EXE Archivo núcleo del Runtime de dB2K runtime
  DB2Kr_en.DLL Biblioteca predeterminada del Idioma Inglés
  DB2Kr_xx.DLL Libreria del Runtime
  RESOURCE.DLL Biblioteca de recursos para iconos, bitmaps, etc
     

Estos archivos necesitarán ser puestos en el directorio raíz del CD si es donde se halla el archivo exe de la aplicación o en cualquier carpeta del CD que lo contenga.  Si va a ejecutar su aplicación desde otra unidad que no sea el CD, pero quiere acceder los datos de ese CD, puede copiar los archivos runtime (y tambien los archivos del BDE) a la carpeta donde se encuentra su aplicación.  teniendo todos estos archivos en la misma carpeta, usted no tiene que modificar el registro o cualquier archivo ini, o tener conflictos mezclando archivos de configuración del BDE, o preocuparse por otros programas instalados que también usan el BDE, como Delphi o Corel Suite.

Notas acerca de la ejecución de una copia de los archivos runtime de db2K y el BDE: Cuando es cargado un archivo exe de dBASE, necesita encontrar los archivos del runtime de dBASE y del BDE para funcionar. En primer lugar busca estos archivos en la misma carpeta que residen los archivos exe, y para hacer esto no necesita información del registro. De modo que, aunque esto necesite más espacio extra de la unidad de disco duro por cada aplicación de dB2K que tenga en el disco duro de su computadora de desarrollo, podría tener una copia de los archivos runtime/BDE en la carpeta de cada aplicación y no necesita entradas de registro para estos archivos. Puede aprovechar esta ventaja al distribuir una demostración u otra aplicación en un CD—sólo incluya los archivos del runtime y el BDE en la misma carpeta como el archivo SuAplicacion.exe en el CD, y no habrá necesidad de lidiar en configuraciones de registro. Por otra parte, si usted prefiriera ejecutar el runtime y BDE de la unidad de disco duro, puede usar un programa de instalación como el Inno Setup para instalar “formalmente” los archivos del BDE y el runtime en la unidad de disco duro con sus entradas apropiadas de registro.  Lea otro artículo en el dBulletin y el documento HowTo sobre Inno Setup de Ken Mayer.

El BDE es necesario para acceder a cualquier tabla relacionada con datos.
Tabla de archivos requerida para el BDE.  Estos archivos pueden encontrarse en la carpeta de BDE.
 
  Archivos núcleo del BDE Comentarios
  IDASCI32.DLL Para acceso de archivos ASCII
  IDBAT32.DLL Para movimientos de archivos por lotes
  IDDA3532.DLL Para acceso a base de datos Microsoft Access
  IDDAO32.DLL Para acceso a base de datos Microsoft Access
  IDDBAS32.DLL Para acceso a base de datos dBASE
  IDDR32.DLL Para Repositorio de Datos (solo Paradox)
  IDODBC32.DLL Para acceso de BDE a drivers ODBC
  IDPDX32.DLL Para acceso a bases de datos Paradox
  IDQBE32.DLL motor de consultas de QBE
  IDR20009.DLL recuros de BDE
  IDAPI32.DLL DLL Principal del Sistema Main BDE
  IDSQL32.DLL motor de consultas SQL (incluyendo SQL Local) 
  IDPROV32.DLL Para provedores de MIDAS
  Archivos Driver de Lenguaje  
  BANTAM.DLL Imotor de Internacionalización
  *.CVB Archivos de configuración de Caracter
  *.BTL Locales
  BLW32.DLL motor de Expresión
     

Otros archivos que también son necesarios

Otros archivos que se necesitan absolutamente son su SuAplicacion.exe y todos sus archivos de imágenes que necesite.  Los archivos de imágen pueden residir en su propio directorio de imágen; sólo tenga cuidado sobre la ruta de VdB7.5 que apunte a la carpeta correcta para acceder esas imágenes.  En dB2K, el DEO se encarga de esto.

También necesitará crear un archivo de SuAplicacion.ini que pondría en el mismo directorio como SuAplicacion.exe en el CD.  Como con cualquiera aplicación compilada de dBASE, el archivo ini debe tener el mismo nombre de archivo que el archivo exe. Si está instalando su aplicación en la unidad de disco duro, asegurese que su archivo ini sea marcado como “sólo lectura” y que no haya ninguna sección [Directory] dentro del archivo ini. Parece que a dBASE le gusta escribir el último directorio al que accedió en el archivo ini.  La próxima vez que usted intente ejecutar la aplicación, fallará porque no hay ninguna entrada del registro para el runtime y los archivos del BDE.  Ésta es una cosa muy importante para recordar.  También antes de que marque sus archivos ini como “sólo lectura”, necesita agregar una sección a su archivo ini.  Abra su archivo ini en un editor del texto y agregue una seccion BDE [IDAPI] que presente su archivo de configuración BDE. Algo así:
 
 
[IDAPI]
ConfigFile01=IDAPI32.cfg
   

Después de hacer esto, cree un nuevo archivo idapi32.cfg o uno que ya haya usado antes.  Puede usar la herramienta de configuración BDE (bdecfg32.exe) que se encuentra en su directorio del BDE, agregando o eliminamos drivers o alias innecesarios.  Ambos tipos de archivo (.ini y .cfg) necesitan ser puestos en el directorio de la raíz del CD o en el mismo directorio como su aplicación, si está instalando a la unidad de disco duro.
Despues, si usted quiere que su aplicación se ejecute automáticamente cuando el CD es colocado en el drive de CD-ROM, también necesitará crear un archivo de autorun.inf y ponerlo en la raíz del CD.  El autorun.inf necesita tener el comando de ejecución (open) en él con el nombre del archivo necesita ser ejecutado. Algo así:
 
 
[autorun]
open=SuAplicacion.exe
   

Precaucion:  no he probado ningún control ActiveX (ocx) que se ejecute desde el CD.  Normalmente, los archivos ocx necesitan ser registrados.  Si usted va a usar un ocx, necesita tener un procedimiento de la instalación o encontrar alguna otra manera de registrar el ocx (esto puede hacerse de dentro del dBASE copiando el ocx a una carpeta en la unidad de disco duro y entonces usar el comando de ejecución para registrar el ocx).

Grabando el CD

Todos lo que queda ahora es crear una imágen del CD y grabarlos.  yo cerraría el CD después, esto detendría a cualquiera de intentar borrar o cambiar archivos en el CD con su propio escritor de CD.

Conclusión

Ésta puede no ser la única y mejor manera de correr un demo u otra aplicación desde un CD, pero espero que este artículo le proporcionará un útil punto de partida.  Si cualquiera tiene un mejor método o una mejora del tema descrito arriba será bienvenido.

Usando las técnicas descritas en este artículo, otras posibilidades interesantes para dBASE vienen a mi mente, usted podría crear su propia aplicación de auto-ejecución, o su propio programa de instalación para distribuir sus aplicaciones.  Imagine que tiene todo escrito incluyendo el paquete de instalación en dBASE.  Eso puede hacerse!


Nota:  El autor quiere agradecer a Fabian Cevallos y David L. Stone, sus lectores de prueba, por las mejoras que trajeron a este texto (version en Ingles).

Gracias a Santiago Gil por su excelente revisión y mejoras aportadas para la traducción al Español.

Traducción por : Juan Manuel Espinosa, Desarrollador de Software en México, D.F.
Administrador de la Comunidad de dBASE en Español
puede contactarlo por e-mail en: juan_espinosa_mx@yahoo.com ó db2kSistemas@netscape.net