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 ARROBA yahoo PUNTO com ó db2kSistemas ARROBA netscape PUNTO net