UNIVERSIDAD DE SEVILLA Escuela Superior de Ingenieros Proyecto Fin de Carrera Ingeniería de Telecomunicación Aplicación de Instalación del Entorno de Trabajo Discovery Carlos Velo Carrasco Tutor: Susana Hornillo Mellado Índice de Contenidos: 1. Introducción y Situación Inicial. ................................................................... 1 1.1 Descripción de la empresa y su situación en el mercado.......................... 1 1.2 ¿En qué consiste el entorno de trabajo Discovery? .................................. 2 1.3 Problemas a solventar con este proyecto. ................................................ 3 1.4 Soluciones adoptadasàAsignación del proyecto...................................... 4 2. Fase de Investigación.................................................................................. 5 3. Fundamentos de la Aplicación Web. ........................................................... 9 3.1 Interfaz de Usuario, el Navegador........................................................... 11 3.2 Capa de negocio, COM+......................................................................... 12 3.3 Capa de Datos, Base de datos. .............................................................. 12 4. Análisis de los componentes a instalar:..................................................... 13 4.1 Aplicación COM+. ................................................................................... 13 4.2 Aplicación IIS. ......................................................................................... 23 4.3 Base de Datos......................................................................................... 31 4.4 Infomap. .................................................................................................. 35 4.5 Ficheros Ejecutables. .............................................................................. 35 4.5.1 Satcom Configuration. ...................................................................... 35 4.5.2 Satcom Wavecom MODEM. ............................................................. 36 4.5.3 Satcom GPRS. ................................................................................. 36 4.5.4 Satcom TrakM8 FTP Client. ............................................................. 36 4.6 Otros. ...................................................................................................... 36 5. Elección de una herramienta de trabajo para la aplicación: Visual Basic.. 38 6. Desarrollo de la Aplicación de instalación del entorno de trabajo Discovery. ......................................................................................................... 40 6.1 Aplicación de Instalación......................................................................... 42 6.1.1 Formularios....................................................................................... 43 6.1.1.1 frmSetUp. ................................................................................... 43 6.1.1.2 frmLicense.................................................................................. 45 6.1.1.3 frmProductKey. .......................................................................... 47 6.1.1.4 frmSelection (Instalación modo Servidor). ................................. 49 6.1.1.5 frmIdentity (Instalación modo Servidor)..................................... 53 6.1.1.6 frmDatabaseSelection (Instalación modo Servidor). .................. 55 6.1.1.7 frmMSDE2000Finish (Instalación modo Servidor). .................... 56 6.1.1.8 frmSetUpInServer (Instalación modo Servidor).......................... 58 6.1.1.9 frmBrowser y frmFolderName (Instalación modo Servidor)....... 62 6.1.1.10 frmExeFiles (Instalación modo Servidor). ................................ 63 6.1.1.11 frmClientInstallation (Instalación modo Cliente) ....................... 66 6.1.1.12 frmClientInstallation2 (Instalación modo Cliente). .................... 69 6.1.1.13 frmPJSoftLicenseFiles y PJSOftBrowser (Instalación modo Cliente)................................................................................................... 70 6.1.1.14 frmIISServerName (Instalación modo Cliente). ........................ 72 6.1.1.15 frmFinish y frmFinishWithoutInstall. ......................................... 73 6.1.2 Módulos. ........................................................................................... 76 6.1.2.1 Módulo Principal (Main Module)................................................. 76 6.1.2.2 Módulo EditRegistry. .................................................................. 77 6.1.2.3 Módulo EncrypFile. .................................................................... 78 6.1.2.4 Módulo Reboot........................................................................... 78 6.1.2.5 Módulo SerialNumber. ............................................................... 79 6.1.2.6 Módulo VersionVerify. ................................................................ 80 6.1.2.7 Módulo de Clase IISVirtualDirectory. ......................................... 80 6.2 Aplicación de encriptación....................................................................... 82 6.2.1 Formulario frmEncryp. ...................................................................... 82 6.2.2 Módulo EncrypModule. ..................................................................... 84 6.3 Aplicación del Código de Desbloqueo..................................................... 85 6.3.1 Formulario frmProductKeyMaker. ..................................................... 85 6.4 Creación del CD de Instalación. .............................................................. 87 6.4.1 Directorios y Subdirectorios.............................................................. 88 6.4.1.1 Directorio Com. .......................................................................... 88 6.4.1.2 Directorio DLL´s & OCX´s: ......................................................... 89 6.4.1.3 Directorio EXEFILES.................................................................. 90 6.4.1.4 Directorio Icons. ......................................................................... 91 6.4.1.5 Directorio IISFOLDER................................................................ 91 6.4.1.6 Directorio MSDE. ....................................................................... 91 6.4.1.7 Directorio PJSoft License........................................................... 92 6.4.1.8 Directorio SATCOMADDONS. ................................................... 93 7. Instrucciones Post-Instalación. .................................................................. 94 7.1 SQL Server o MSDE 2000. ..................................................................... 94 7.2 Satcom Configuration.............................................................................. 95 7.3 Satcom Trakm8 FTP Client. .................................................................... 96 7.4 Satcom GPRS. ........................................................................................ 98 7.5 Satcom Wavecom Modem. ..................................................................... 99 8. Conclusiones. .......................................................................................... 101 9. Anexos..................................................................................................... 103 9.1 Código de la Aplicación de Instalación.................................................. 104 9.1.1 Formularios..................................................................................... 104 9.1.1.1 frmSetUp. ................................................................................. 104 9.1.1.2 frmLicense................................................................................ 106 9.1.1.3 frmProductKey. ........................................................................ 108 9.1.1.4 frmSelection (Instalación modo Servidor). .............................. 110 9.1.1.5 frmIdentity (Instalación modo Servidor).................................... 114 9.1.1.6 frmDatabaseSelection (Instalación modo Servidor). ................ 123 9.1.1.7 frmMSDE2000Finish (Instalación modo Servidor). .................. 125 9.1.1.8 frmSetUpInServer (Instalación modo Servidor)........................ 126 9.1.1.9 frmBrowser (Instalación modo Servidor). ................................. 133 9.1.1.10 frmFolderName (Instalación modo Servidor).......................... 135 9.1.1.11 frmExeFiles (Instalación modo Servidor). .............................. 136 9.1.1.12 frmClientInstallation (Instalación modo Cliente). .................... 141 9.1.1.13 frmClientInstallation2 (Instalación modo Cliente). .................. 144 9.1.1.14 frmPJSoftLicenseFiles (Instalación modo Cliente). ................ 145 9.1.1.15 frmPJSOftBrowser (Instalación modo Cliente). ...................... 147 9.1.1.16 frmIISServerName (Instalación modo Cliente). ...................... 148 9.1.1.17 frmFinish. ............................................................................... 151 9.1.1.18 frmFinishWithoutInstall........................................................... 153 9.1.2 Módulos. ......................................................................................... 154 9.1.2.1 Módulo principal (MainModule). ............................................... 154 9.1.2.2 Módulo EditRegistry. ................................................................ 171 9.1.2.3 Módulo EncrypFile. .................................................................. 179 9.1.2.4 Módulo Reboot......................................................................... 181 9.1.2.5 Módulo SerialNumber. ............................................................. 184 9.1.2.6 Módulo VersionVerify. .............................................................. 189 9.1.2.7 Módulo de Clase IISVirtualDirectory. ....................................... 191 9.2 Código de la Aplicación de Encriptación. .............................................. 200 9.2.1 Formulario frmEncrypt. ................................................................... 200 9.2.2 Módulo EncrypModule. ................................................................... 201 9.3 Código de la Aplicación del Código de Desbloqueo.............................. 204 9.3.1 Formulario frmProductKeyMaker. ................................................... 204 9.4 TRANSACT-SQL y OSQL/ISQL............................................................ 205 9.5 Visor de API´s y declaración de API´s en VisualBasic. ......................... 209 9.6 Ejemplo de funcionamiento de la función CheckVersion....................... 211 10. Bibliografía. .......................................................................................... 213 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 1. Introducción y Situación Inicial. 1.1 Descripción de la empresa y su situación en el mercado. Satcom Technology LTD es una compañía irlandesa encargada fundamentalmente al seguimiento y vigilancia de flotas de vehículos, entrando en su mercado sobre todo los vehículos involucrados en el transporte de mercancías peligrosas, transporte de mercancías altamente valiosas, coches de lujo y cualquier vehículo en general que necesite de una vigilancia adicional. Está situada en Cork, ciudad del sur de Irlanda y segunda ciudad más grande después de Dublín; además de disponer de otra sede en el Reino Unido. Desde ambas oficinas abarca a gran cantidad de clientes a lo largo de ambos países, siendo unas de las empresas más punteras y que más ha crecido en el ámbito de la ingeniería e I+D en los últimos diez años. Su actividad es muy diversa, abarcando muchos campos de la ingeniería, e ideal como destino de un ingeniero de telecomunicaciones, donde puede desarrollar conocimientos en campos como electrónica, programación (telemática) y señales. Para que esto se vea con más claridad voy a pasar a resumir de modo superfluo la actividad de la empresa a la que concierne este proyecto. La empresa se encarga del seguimiento y vigilancia de flotas de vehículos y para ello primero se coloca un dispositivo hardware en cada vehículo. Este dispositivo consta fundamentalmente de un receptor GPS que localiza el vehículo y de un MODEM GSM/GPRS que nos permite interactuar con él, además de diversos sensores que constituirán el sistema de alarma. Satcom no fabrica estos dispositivos, sino que los compra por partes como cajas negras y los conecta creando la solución final, del mismo modo que se encarga de conectarlo a las diferentes partes del vehículo en cuestión. Es por esto que 1 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY el conocimiento de la electrónica es fundamental en el día a día en esta compañía. Una vez instalado el hardware en el vehículo, se le debe instalar al cliente en su oficina, casa o lugar de trabajo el software necesario para poder monitorizar y gestionar las alarmas de su vehículo o flota de vehículos (aplicación Discovery). Con lo que se trata de crearle un completo entorno de trabajo desde el cual pueda tener acceso a la configuración de su flota y pueda estar al tanto a tiempo real de lo que ocurre en cada momento. Para lo cual se requieren conocimientos en el ámbito de la programación de aplicaciones, bases de datos y páginas Web, etc. Y por supuesto y debido a que todas las comunicaciones con los vehículos se realizan por vía GSM/GPRS y la localización por GPS, el dominio de estas materias constituye la base de todo el proyecto. 1.2 ¿En qué consiste el entorno de trabajo Discovery? Discovery es un complejo sistema diseñado para que el cliente pueda disponer de una completa información y control sobre su flota de vehículos a tiempo real. Consiste en una aplicación Web, que permite al usuario monitorizar la situación de su vehículo, localizarlo vía satélite por GPS y mediante GSM o GPRS mandar las órdenes oportunas para la gestión de las alarmas. Además, permite elaborar un informe de la situación del vehículo que desvele la ruta seguida y los eventos que se quieran conocer, como pueden ser el exceso de velocidad, los tiempos de parada, etc. Para que el cliente pueda localizar su vehículo se incluye un software de mapeo que nos permite avistar el mismo en un nivel de detalle de gran calidad, pudiéndose encontrar a la unidad en cualquier calle de toda Europa. Para lo cual, y debido al constante cambio de las ciudades, los mapas son fácilmente actualizables. En la siguiente figura se puede apreciar el entorno de trabajo Discovery en funcionamiento. 2 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 1.2. Entorno de Trabajo Discovery en funcionamiento. 1.3 Problemas a solventar con este proyecto. La empresa necesitaba una actualización de la solución software que se le instala a los clientes, de manera que se mejoren ostensiblemente las propiedades de esta aplicación y que resulte un sistema robusto y fiable que se adecue a las necesidades de los clientes. Hasta entonces y debido a la complejidad del sistema a instalar, era necesario el desplazamiento de un ingeniero hacia la oficina del cliente para configurarle toda la aplicación, lo cual conllevaba los consecuentes gastos de desplazamiento y en algunos casos de alojamiento. Situación que se trataba de solventar con mi trabajo en este proyecto. 3 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 1.4 Soluciones adoptadasàAsignación del proyecto. Así pues, frente a esta necesidad de renovación se estudió el proyecto de hacer una aplicación de instalación del entorno de trabajo Discovery de manera que el cliente tuviera una aplicación personalizada y fácil de instalar. Esta solución ya la había afrontado anteriormente la empresa, pero debido a la complejidad del proyecto todo se quedo en las primeras investigaciones. La tarea a desarrollar se presentaba bastante difícil, no tanto a la hora de programar la aplicación de instalación, que ya de por si es una tarea más que compleja, sino también en la elección de los componentes a instalar y en la personalización de estos, ya que una de las directrices de la empresa es la de crear soluciones para cada cliente. Así pues, se decidió hacer una investigación previa de los componentes a instalar con Discovery, de los prerrequisitos que se le pedirían al cliente y de las posibles configuraciones con las que estos podrían tener sus sistemas. 4 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 2. Fase de Investigación. Ante la complejidad del proyecto se tuvo que desarrollar primero un estudio previo que englobase tanto todos los componentes que se debían instalar, como los sistemas que nos podríamos encontrar en el cliente. Y así empezar a planificar de manera correcta, y con el menor número de equívocos posibles la solución adecuada. Esto nos llevó unos 30 días de investigación en los cuales tuvimos que instruirnos en muchas materias y en los que tuvimos que adelantarnos en la medida de lo posible a las posibles dificultades que nos encontraríamos más adelante, para así escoger el camino correcto para una solución satisfactoria. Desde un principio teníamos claro que la aplicación se debería adecuar a las diversas configuraciones de las que podía disponer el cliente, con lo que enfocamos el estudio en hacer una implantación del sistema en forma de módulos independientes, para que así el cliente se instalará sólo lo que necesita en cada ordenador. Por ejemplo, si estamos proveyendo de un sistema de seguimiento a un solo individuo con un coche de lujo, este probablemente dispondrá únicamente de un ordenador desde donde gestionar su vehículo, por lo que todo el sistema Discovery irá instalado en su ordenador. Pero también nos podemos encontrar con la situación en la que el cliente sea por ejemplo una empresa de transporte, por lo que en su oficina tendrá una red de ordenadores conectados y un servidor; en este caso tendríamos que considerar el dividir la instalación en dos: la instalación en el servidor y la instalación en los diferentes ordenadores. En el servidor iría todo el grueso de la aplicación como son la base de datos, la comunicación con el MODEM GSM/GPRS, etc., de manera que éste se encargaría de distribuirlo a cada ordenador particular de la red y de facilitar todo el potencial de Discovery. Por otro lado tendríamos la instalación en los distintos ordenadores de la red, donde nos limitaríamos a instalar el software de mapeo y a crear un enlace con el servidor para acceder a las demás virtudes de Discovery. 5 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Para acometer esto se decidió que la solución debía ser a modo de aplicación Web de manera que se pudiera colocar en el Intranet de la empresa, y de ahí ser utilizado por todos los ordenadores de la red de forma independiente pero siempre compartiendo los pilares básicos que serían proveídos por el servidor. Para acceder a Discovery se utilizará un cliente Web o navegador, que decidimos que fuera el Internet Explorer, ya que es el que tiene más difusión y viene incluido con los sistemas operativos Windows. Además se tendría que modificar algunas de las propiedades de dicho navegador para que así no hubiera conflictos con la aplicación. Satcom Technology es una empresa del ámbito de la seguridad que provee de sistemas de alarma a clientes de muy diversa índole, ya sea a particulares o grandes empresas de transporte de mercancías peligrosas o incluso al transporte de explosivos. Es por ello que la confidencialidad debe ser extrema, de manera que nadie ajeno a los acuerdos entre la empresa y los clientes pueda hacerse con los servicios del entorno de trabajo Discovery. Por ello se tendría que diseñar un sistema de identificación del cliente y una manera de impedir que ningún extraño se pueda instalar la aplicación. Asimismo Satcom tendría que tener constancia de cada cliente y del número de instalaciones que éste realiza en su entorno de trabajo. Por otro lado la aplicación de instalación debe ser moldeable a las necesidades de cada cliente, es decir clientes con diferentes necesidades tendrán instalaciones diferentes. Así que estas distinciones también las tendremos que salvar de posibles intrusiones utilizando algún tipo de algoritmo de codificación o encriptado. Esto implica que la aplicación deberá ser fácilmente adaptable y actualizable, ya que a clientes diferentes tendremos que mandar aplicaciones de instalación diferentes, con lo cual no tendremos que crear una nueva aplicación para cada uno, sino sólo modificar un par de ficheros de configuración a los que accederá la aplicación y actuará en consecuencia. Todo el sistema deberá estar cimentado en una base de datos que almacene todo lo concerniente a las unidades que se tratan de gestionar, así 6 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY como los informes que éstas generen. Esta base de datos deberá ser instalada en el servidor en caso de que éste esté ubicado en un lugar diferente, y ser compartida y proveída por éste. Además ésta debe ser modificable según las necesidades del cliente y por tanto debe aparecer encriptada. Para poder localizar los vehículos se tendrán que instalar un software de mapeo que nos provea de calidad suficiente capaz de distinguir entre calles pequeñas en los lugares más remotos. Dicho software, en caso de la instalación en una red, deberá ir alojado en cada uno de los ordenadores ya que dependerá de la actualización del mapa que se quiera usar, además del sistema operativo de cada ordenador. Esta aplicación de mapeo debe ser fácilmente actualizable, de manera que el cliente pueda elegir entre un tipo de mapas u otros. Aun así se deberá instalar un sistema de mapeo por defecto, un sistema suficientemente bueno para que el cliente estándar no tenga en principio ninguna queja de calidad y por tanto se quede satisfecho con dicha instalación. Asimismo se debe dar la posibilidad al cliente de instalar ciertas aplicaciones creadas por Satcom, aplicaciones fundamentales para el correcto funcionamiento de Discovery y que en instalaciones en redes de ordenadores irán en el servidor. Estas aplicaciones son una herramienta de configuración post-instalación, un programa para mandar ordenes por medio de un MODEM GSM, un programa para la gestión de la comunicación GPRS y otro para la carga/descarga vía FTP de las unidades. De entre ellos sólo la herramienta de configuración se instalará siempre, los demás dependerán de si el cliente opta por contratar los servicios de Satcom bajo GPRS o sólo vía GSM. Así pues, tras este periodo de investigación previa llegamos a gran cantidad de útiles conclusiones que nos allanarían el terreno a la hora de implementar la aplicación de instalación de Discovery y que seguiríamos como guía de nuestros pasos. Concretando, estas conclusiones se pueden resumir en los siguientes puntos: 7 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY - Dividir la instalación en dos partes: instalación en servidor e instalación en cliente. En el caso de que el cliente sólo disponga de un ordenador se instalarán ambas en el mismo. - La solución será una aplicación Web, de manera que irá instalada en la Intranet de la empresa. - Uso del navegador Internet Explorer para acceder a Discovery y modificación de algunas de su propiedades. - Incluir un sistema de identificación de los usuarios fiable de manera que se sepa que empresa y cuantos de sus ordenadores tienen instalado Discovery. - Desarrollar un sistema de encriptado que asegure la confidencialidad de los datos de la aplicación de instalación. - Se deberá incluir una base de datos fácilmente modificable a las necesidades del cliente y que aparezca de forma encriptada en la aplicación para evitar posibles intrusiones. - Elegir e instalar un software de mapeo de calidad. - Instalar siempre la aplicación de configuración post-instalación y dejar como optativo la instalación de otras aplicaciones (GSM, GSM/GPRS, FTP). 8 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 3. Fundamentos de la Aplicación Web. Tras la fase de investigación, nos centramos en el desarrollo de la aplicación Web y de los componentes que ésta introduce en nuestro proyecto de instalación. Para ello optamos por desarrollar una aplicación Web con una arquitectura distribuida. Una aplicación distribuida utiliza los recursos de múltiples máquinas por medio de la separación de la funcionalidad de la aplicación en grupos más manejables de tareas. El hecho de dividir las aplicaciones en partes tiene grandes beneficios entre los cuales se encuentran la reutilización y la escalabilidad. Dividir una aplicación de este modo da lugar a la aparición de ciertas capas, cada una responsable de una parte del proceso global de la aplicación. El estudio de estas capas supone los cimientos de lo que será nuestra aplicación y por tanto merece más que una mera mención aunque sean unos conceptos mayormente teóricos. Las aplicaciones en capas se caracterizan por la cantidad de capas por las que pasa la información desde la capa de datos donde estos están almacenados (normalmente una base de datos) hasta la capa de presentación que será la que visualizarán los clientes. La importancia de la arquitectura distribuida está en que cada una de estas capas puede estar situada en sistemas/ordenadores diferentes. Cuando el número de capas es dos, estamos frente al típico modelo cliente/servidor. Este tipo de arquitectura funciona muy bien cuando se trata de una pequeña empresa con un conjunto limitado de recursos y con pocas expectativas de crecimiento en el volumen de datos a tratar. Pero desde Satcom se da servicio a todo tipo de empresa, desde un único particular con su ordenador personal hasta grandes multinacionales donde la distribución de sus recursos informáticos son totalmente escalables. Y por tanto no se podrían suplir a estos clientes si se escogiera una arquitectura cliente/servidor. 9 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Frente a las aplicaciones de dos capas optamos por un modelo de 3 capas. Donde en términos meramente teóricos existe una capa de servicios de usuario o de presentación, una capa de servicios de negocio que se encarga de las funciones que desempeña la aplicación en sí y una capa de servicio de datos. Figura 3. Representación de un modelo de 3 capas. La principal diferencia entre un modelo de 2 capas o cliente/servidor y un modelo de 3 capas, está en que la lógica de negocio se separa del interfaz de usuario y de la fuente de datos. Esta capa de servicio de negocio consiste en todas las funciones y métodos que resuelven las funcionalidades de la aplicación, es decir, si estuviéramos hablando por ejemplo de una aplicación Web que tratara de gestionar los asuntos económicos de una empresa, encontraríamos que la lógica de negocio englobaría funciones como el cálculo del IVA, suma de beneficios, cálculo del descuento pronto-pago, etc. En nuestro caso, este nivel o capa contiene funciones y métodos que resuelven la gestión de las alarmas, el añadir o quitar un vehículo dentro de una flota, el cálculo de la dirección hacia la que se dirige el vehículo, la gestión de las rutas, etc. La capa de datos concentra lo que es la estructura de los datos y su almacenamiento. Lo que viene a ser la base de datos. La capa de servicio de usuario constituye el interfaz que el cliente dispone para acceder a los datos y modificarlos, es decir la página Web en si misma que le permite realizar la gestión adecuada de su flota. Por medio de está empleará la capa de negocio para acceder a los datos. 10 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Con este tipo de aplicación con arquitectura de 3 capas, el cliente nunca debe acceder directamente al sistema de almacenamiento de datos sino que debe hacerlo a través de la capa intermedia de negocio para así asegurarse la corrección de los datos. La separación de los distintos aspectos de la aplicación en 3 capas permite que cualquiera de ellas pueda ser modificada de forma independiente sin tener que cambiar las otras. Esto nos permitirá concentrarnos en cada parte por separado y por tanto aumentará la eficacia del desarrollo de la aplicación. Llegado a este punto, nada más queda identificar cuales serán nuestras tres capas y que utilidad tendrán éstas. Utilizaremos como interfaz principal de usuario al navegador. La información de nuestra aplicación Web fluirá desde el servidor hasta el cliente usando el protocolo HTTP. Nuestro servidor de aplicaciones será Internet Information Server de Microsoft funcionando tanto como servidor Web y como servidor de aplicaciones. Nuestra lógica de negocio y el acceso a los datos estarán encapsulados dentro de componentes COM+ y servirán como conectores que enlazan con las partes de nuestra aplicación. Y finalmente, nuestra capa de datos será una base datos SQL. 3.1 Interfaz de Usuario, el Navegador. El interfaz de usuario se presenta dentro de un navegador Web. Nuestra elección fue la de Internet Explorer debido sobre todo a su amplia difusión, ya que viene incorporado dentro de la instalación por defecto de los sistemas Windows. La comunicación entre el cliente y la aplicación es crítica para el diseño y la implementación de la aplicación. El protocolo de transporte de hipertexto (HTTP) define como se gestiona en el servidor el requerimiento de información realizado por el cliente usando el navegador y después el cómo se manda esta información. Como servidor de la aplicación Web tendremos Internet Information Server (IIS) de Microsoft, que sostendrá una aplicación desarrollada usando Active 11 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Server Pages (ASP). Con el uso de ASP como “lenguaje” de desarrollo Web, ganamos en solidez y dinamismo de nuestra solución, ya que el uso de ASP nos permite dar soporte a la lógica de negocio dentro de nuestro código y acceder a la base de datos usando los componentes COM+ pertinentes. 3.2 Capa de negocio, COM+. Toda la funcionalidad de Discovery, sus funciones y métodos que resuelven las distintas situaciones que el cliente requiere con su uso, están englobadas en componentes COM+. La separación del acceso a datos y de la lógica de negocio dentro de componentes hace posible que la aplicación sea más fiable y que pueda atender mayores requerimientos con mayor facilidad. Estos componentes son compilados antes de su ejecución con lo que el rendimiento de la aplicación mejora ya que no se compilan durante el tiempo de ejecución de Discovery. Esta mejora del rendimiento supone una mayor carga que podrá soportar la aplicación. 3.3 Capa de Datos, Base de datos. El pilar básico de nuestra aplicación está en los datos y en su estructura. Dicha organización debe ser fácilmente moldeable y ampliable, de manera que quede prevista la posible ampliación en la empresa cliente en cuanto a volumen de datos a tratar, como son la incorporación de nuevas flotas de vehículos. En cuanto a la herramienta para desarrollar la base de datos la elección escogida ha sido el uso de SQL Server de Microsoft, una potente herramienta que permite completa interacción con las otras capas. 12 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 4. Análisis de los componentes a instalar: Discovery es un complejo entorno de trabajo que no se podría entender sin una explicación previa de los componentes que lo constituyen. En este apartado se describirá cada uno de estos elementos y cómo actúan dentro de la aplicación. Cada uno de estos componentes se tendrá que incluir y configurar en la aplicación de instalación de Discovery, objeto de este proyecto. 4.1 Aplicación COM+. Por medio de COM+ podemos diseñar todo lo concerniente a la capa de negocio que nos permitirá desarrollar las funcionalidades de Discovery. Para llegar a entenderlo primero es preciso definir el concepto de componente. La definición literal de componente es: objeto que contiene código para manipular datos, y que suministra acceso a ese código por medio de un conjunto bien especificado de servicios disponibles de manera pública. Lo que en palabras más prácticas viene a significar que un componente es un fragmento de código encapsulado que realiza alguna función para una aplicación. Como ejemplo un componente puede ser algo tan simple como una suma entre dos números dados o algo tan complicado como queramos hacerlo. En nuestro caso englobará, entre otras, las funciones necesarias para la recuperación de la correspondiente información de la base de datos para su posterior uso en la aplicación Web y su posible modificación cuando el cliente así lo requiera. Con el uso de componentes, la programación de aplicaciones de tres o más capas se hace una tarea mucho más sencilla, ya que COM+ se encargará de todas las relaciones entre los componentes y entre estos y el sistema operativo. 13 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY COM significa Component Object Model (modelo de objeto componente) y consiste en un modelo de objetos desarrollado por Microsoft e implementado en todas las plataformas Windows. Forma la base de todas las aplicaciones desarrolladas para Windows para casi todas las interacciones con el sistema operativo por medio de interfaces definidas por la propia COM. Define un estándar para la interoperabilidad de componentes, es decir, la capacidad de los componentes para interactuar entre sí. No especifica el lenguaje con el que se programan dichos componentes, simplemente especifica como deben comunicarse los componentes entre sí y con el propio sistema operativo. Con lo que deja un amplio abanico de posibilidades al programador para que desarrolle los componentes usando el lenguaje con el que se encuentre más cómodo. Gracias a los estándares de comunicación entre componentes que especifica COM, los componentes pueden ser reutilizados sin ninguna dependencia del lenguaje con el que fueron escritos. No importa si una aplicación contiene componentes escritos en Visual Basic, C++ o Java siempre y cuando estos componentes sigan la especificación de COM. COM+ es la segunda generación de COM que Microsoft empezó a distribuir a partir del lanzamiento de Windows 2000. Incluye nuevos rasgos que hacen de COM más fácil de utilizar y simplifica el desarrollo de aplicaciones distribuidas por capas. En términos generales se puede decir que COM+ es un conjunto de servicios que combinan COM con Microsoft Transaction Server (MTS) que a grandes rasgos gestionaba el tiempo de vida de los componentes. Una vez clarificada la funcionalidad que queremos que tenga COM+ en nuestra aplicación, y una vez programados nuestros diferentes componentes debemos descubrir la manera de instalar dichos componentes en la máquina del cliente. La herramienta que Microsoft nos da para gestionar nuestras aplicaciones COM+ es el Explorador de Servicios de Componentes, que se puede encontrar a partir de Windows 2000 en la carpeta “Herramientas Administrativas” en el menú de inicio, herramienta que se puede utilizar para crear nuevas aplicaciones COM+, y para agregar componentes a las aplicaciones ya creadas. Las aplicaciones COM+ no son más que conjuntos de componentes relacionados. 14 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 4.1.a. Ventana inicial de la herramienta Servicios de Componentes. Después de haber escrito todo el código de nuestro componente se utiliza Visual Basic para compilar dicho componente como una DLL y registrarlo en el sistema operativo. Una vez hecho esto, el archivo DLL es una versión ejecutable del componente que se cargará gracias a COM+ cada vez que la aplicación lo requiera. El siguiente paso es crear la aplicación COM+ que suministrará los servicios COM+ para nuestra aplicación Web. Para ello, lo primero es iniciar el Explorador de Servicios de Componentes de Microsoft, tras lo que se selecciona “Servicios de Componentes” y luego la máquina en cuestión. Posteriormente se hace clic con el botón derecho del ratón sobre la carpeta “Aplicaciones COM+” y en el menú de contexto que aparece se selecciona Nuevo/Aplicación. 15 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 4.1.b Creación de una aplicación COM+. Esto inicia el asistente de instalación de aplicación COM+ (figura 4.1.c) que nos guiará por los pasos de la creación de una nueva aplicación. 16 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 4.1.c. Asistente para la instalación de aplicaciones COM+. Como estamos creando una nueva aplicación, deberemos seleccionar la opción crear una aplicación vacía. Figura 4.1.d. Asistente: Creación de una aplicación vacía. 17 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Aquí nos pregunta parte de la configuración de nuestra aplicación, como son el nombre y si queremos una aplicación de biblioteca o de servidor. Seleccionamos la segunda opción, que viene por defecto, y hacemos clic en el botón de siguiente. El siguiente paso es identificar al usuario bajo el cual se ejecutará la aplicación, que podrá ser el que tenga actualmente iniciada la sesión o uno correctamente especificado en los text boxes colocados para tal fin. Figura 4.1.e. Asistente: Identidad de la aplicación. Si hubiéramos escogido un usuario explícito, cada cliente que utilice Discovery deberá tomar esa identidad al procesarla. Tras haber seleccionado al usuario nos aparecería la siguiente pantalla de fin de la instalación de la aplicación COM+. 18 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 4.1.f. Asistente: Aplicación instalada. Con este proceso ya tendremos instalada la aplicación COM+, con que sólo restaría asociarle los componentes correspondientes. Para hacer esto, abrimos la carpeta de la aplicación para que nos muestre las carpetas de componentes, componentes heredados y funciones que dispone. Seleccionaremos la carpeta de componentes, que visualizará todos los componentes instalados en la aplicación, y por tanto aun estará vacía. Haremos clic sobre la carpeta de componentes usando el botón derecho del ratón y sobre el menú de contexto seleccionaremos Nuevo/Componente, lo que hará aparecer el asistente de instalación de componentes, tal y como podemos apreciar en la figura 4.1.g. 19 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 4.1.g. Asistente para la instalación de componentes COM+. Este asistente nos permitirá instalar los componentes para nuestra aplicación COM+. Pulsamos en “Siguiente” y en la pantalla que nos aparece seleccionamos Instalar Nuevos Componentes, tras lo que nos pedirá que escojamos el archivo DLL en donde están nuestros componentes. Lo vemos en la siguiente figura 4.1.h. 20 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 4.1.h. Asistente: Elección del fichero dll. Elegimos la DLL, en este caso SatData.dll y pulsamos en el botón de “Siguiente”. Tras lo cual nos debe salir la pantalla de finalización del asistente diciéndonos que todo se ha efectuado correctamente. Siguiendo los pasos anteriormente descritos instalaríamos los componentes COM+ necesarios para el funcionamiento de Discovery en una máquina manualmente, pero esto no es exactamente lo que buscamos, ya que queremos que se haga desde una aplicación de instalación situada en un CD de instalación, y que lo haga automáticamente para que así el cliente no se pierda durante el proceso. Por lo cual, todo lo anterior tendremos que implementarlo en la aplicación de instalación para que se haga de manera oculta al usuario. Para ello hice uso de unas de las facilidades que nos proporciona el programa de Servicios de Componentes de Microsoft, la de exportar aplicaciones COM+ a otras máquinas. Que mediante un fácil asistente nos guiará en todo el proceso. Nos situamos sobre la carpeta de nuestra aplicación y pulsamos el botón derecho del ratón para seleccionar en el menú contextual la opción:”Exportar”. 21 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 4.1.i. Exportar aplicaciones COM+. Esto de nuevo nos iniciará un asistente que nos permitirá seguir todo el proceso de manera sencilla. Para ello el asistente crea un fichero de configuración con extensión *.msi que contendrá toda la información de nuestra aplicación. Nos pedirá el nombre completo del fichero msi que queremos crear y el modo en el que queremos exportarlo, que en nuestro caso será Aplicación de Servidor. 22 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 4.1.j. Asistente para exportar aplicaciones COM+. Finalmente pulsamos sobre “Siguiente” y tras un breve período de tiempo el asistente concluirá diciéndonos que todo se ha efectuado correctamente. Con este fichero (que nosotros hemos llamado satcom.msi) podremos instalar nuestra aplicación COM+ en el ordenador del cliente simplemente importándola. Esto lo tendremos que hacer de manera oculta al usuario y a través de nuestro CD de instalación, por lo que quedaría la cuestión de cómo programarlo. 4.2 Aplicación IIS. El cliente accederá al entorno de trabajo Discovery a través de un cliente Web o navegador, concretamente utilizando Internet Explorer. Desde el punto de vista de este usuario final, Discovery se ejecuta como cualquier otra página Web y por tanto como un documento que en cualquier momento se puede 23 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY solicitar a un servidor Web. Cuando se conecta con dicho servidor se solicita un servicio, a partir de un determinado puerto TCP, al que alguien tiene que responder. Ese “alguien” es el servidor Web, es decir la aplicación que se encarga de estar a la escucha y responder a las peticiones de los clientes. Microsoft, a partir de la plataforma Windows 2000 incluye un servidor Web conocido como Internet Information Server (IIS). Éste puede ser administrado mediante una de las herramientas del sistema situada en el menú de inicio, en concreto con la utilidad Servicios de Internet Information Server. La cual ofrece un amplio abanico de posibilidades como son detener el servicio, pausarlo y establecer la configuración pertinente de la aplicación Web. Tanto el servidor como la utilidad Servicios de Internet Information Server no se instalan por defecto con Windows, sino que se proporcionan con el CD de instalación pero como componentes opcionales que el usuario puede instalar o no. El servidor IIS, como todo servidor Web, tiene una función primordial: servir los documentos solicitados por el cliente. Realmente, su cometido es el de actuar como vinculo o herramienta por la que el usuario puede disponer o modificar de la información deseada. O lo que en otras palabras definimos en una sección anterior como interfaz de usuario. Por lo que a través de componentes COM+ accede a los datos de la base de datos y se los presenta al cliente. El protocolo que permite que el cliente y el servidor se entiendan es HTTP (Hypertext Transfer Protocol), gracias al cual un usuario puede simplemente introducir, directa o indirectamente, un URL y obtener a cambio prácticamente cualquier tipo de documento, desde una página HTML hasta una imagen, un sonido o un vídeo. Al principio, los servidores Web se limitaban a enviar a los clientes los documentos solicitados sin efectuar ningún proceso de estos. Esto era así hasta la aparición de una técnica conocida como páginas ASP (Active Server Pages), que a groso modo se pueden calificar como documentos HTML que contienen partes para el cliente y partes para el servidor. Cuando un cliente solicita un documento que es una página ASP, iniciales que coinciden con su extensión, IIS explora el contenido del documento en 24 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY busca de marcas <% y %>, que son las encargadas de delimitar la sección de la página que debe procesar el servidor (script). A continuación se sirve de un módulo para analizar ese contenido, generalmente código de script escrito la mayoría de las veces en VBScript o Jscript, y lo procesa obteniendo el resultado. Finalmente, ese resultado sustituye a todo el contenido comprendido entre los delimitadores anteriores. Desde el código de una página ASP es posible efectuar prácticamente cualquier proceso, desde simplemente mantener un contador hasta obtener información de una base de datos SQL Server. Es posible usar además controles ActiveX diseñados para ASP. Para el desarrollo del interfaz de usuario usando páginas ASP se ha utilizado una de las herramientas que forman parte de Visual Studio 6, concretamente Visual InterDev, que cuenta con asistentes que nos proveen de hojas de estilo y código prefabricado, contando con editores para páginas HTML, código de script, etc. Resumiendo, podemos decir que el uso de páginas ASP nos permite crear documentos Web dinámicos, es decir donde el usuario puede interactuar con la aplicación, y por tanto nos provee de la solución ideal para el desarrollo del interfaz de usuario del entorno de trabajo Discovery. Además como servidor de esta aplicación Web empleamos a Internet Information Server de Microsoft, dado su alto grado de fiabilidad y difusión por estar incluido en toda plataforma Windows posterior a Windows 2000. Una vez descrito lo que queremos instalar, tenemos que tener claro como hacerlo, es decir como desarrollar una aplicación que instale el interfaz de usuario en la máquina del cliente sin que éste tenga que preocuparse de su configuración. Para ello, primero vemos como se realizaría manualmente para luego programarla adecuadamente. No se trata de crear la aplicación Web y después instalarla, ya que la aplicación ya está creada, sino en usar IIS para distribuirla en la Intranet de la empresa o en ordenador del propio usuario. Para ello debemos iniciar la herramienta Servicios de Internet Information Server, que podemos encontrar 25 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY dentro de la carpeta Herramientas Administrativas del menú de Inicio (previamente se debe instalar del CD de Windows si aun no se ha hecho). Debemos tener en cuenta que el cliente puede disponer tanto de un único ordenador donde quiera instalar todo el entorno de trabajo Discovery o una completa red de ordenadores, donde uno de ellos será el que actúe como servidor Web mientras que los otros solo lo hacen como clientes. En ambos casos tendremos un servidor Web, el único ordenador en el primer caso y el propio servidor en el segundo, y será allí donde tendremos que instalar la aplicación Web. Para publicar un documento en IIS debemos situarlo en el directorio de publicación de Web predeterminado, denominado directorio principal, y que está localizado por defecto en \Inetpub\Wwwroot, directorio al que accederíamos escribiendo en la barra de direcciones http://nombredelequipo o http://localhost o http://127.0.0.1 . Así pues, debemos situar nuestra aplicación Web dentro de ese directorio. Con esto ya podremos acceder a nuestra aplicación Web, pero para poder configurarla usaremos la herramienta Servicios de Internet Information Server. Para lo que crearemos un directorio virtual dentro del sitio Web predeterminado y situaremos allí nuestra aplicación. Figura 4.2.a. Creación del directorio virtual. Una vez que hacemos clic en directorio virtual nos aparecerá un asistente que nos ayudará a la instalación de nuestra aplicación Web. 26 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 4.2.b. Asistente para la creación de un directorio virtual. Al pulsar el botón siguiente pasaremos a una pantalla donde se nos preguntará por el nombre del directorio virtual, nombre que tendremos que poner posteriormente en la barra de direcciones cuando queramos acceder a él. Así pues nosotros elegimos el nombre “SATCOM”. Figura 4.2.c. Elección del nombre del directorio virtual. 27 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Tras lo que nos preguntarán sobre la ubicación física donde se encuentra el directorio con toda la aplicación Web. Ésta es donde previamente guardamos el directorio, en el directorio principal: \Inetpub\Wwwroot\Satcom. Figura 4.2.d. Ubicación del directorio virtual. Finalmente nos ofrece la posibilidad de configurar los permisos de acceso a dicho directorio, opción que dejamos con la configuración mostrada por defecto ya que se adecua perfectamente a nuestras necesidades. Figura 4.2.e. Configuración de los permisos de acceso. 28 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Cuando pulsamos sobre el botón de siguiente nos saldrá una ventana indicándonos que el directorio virtual se ha creado correctamente. Gracias a este asistente ya tenemos la aplicación Web dispuesta para poder configurarla por medio de la herramienta Servicios de Internet Information Server. En concreto lo que nos proponemos es cambiar el tiempo de espera de sesión (Session Timeout). Dicha propiedad especifica el tiempo tras el que si el usuario no realiza ninguna petición o no actualiza la página, la sesión expira. Por defecto este valor está configurado a 20 minutos, valor que queremos cambiar a otro periodo de tiempo más elevado que permita al cliente vigilar la aplicación a la espera de una posible alarma durante una semana completa, tiempo más que suficiente para que éste interactúe de algún modo con Discovery y que por tanto el periodo de Timeout se reinicie. Dicho tiempo deberá ser entonces cambiado a 7 días, o lo que es lo mismo 10080 minutos. También deseamos modificar el tiempo que se asigna a la espera de secuencia de comandos ASP, que por defecto es de 90 segundos. Este periodo es el tiempo durante el cual se puede estar ejecutando un script ASP antes de terminar su función. Como en nuestro caso Discovery es un sistema bastante complejo que necesita de representación gráfica de sistemas de mapeo y que puede estar distribuido entre diferentes máquinas y por tanto acarrear ciertos retrasos, debemos cambiar este valor a uno más alto que nos garantice una mayor fiabilidad. El valor escogido ha sido de 900 segundos, es decir 15 minutos, tiempo más que suficiente. De hecho en el proceso de prueba cuando nos acercábamos a dicho valor era señal de que el script no funcionaba correctamente. Para realizar estos cambios se utiliza la herramienta Servicios de Internet Information Server, se sitúa el ratón sobre el directorio virtual apropiado, es decir el que hemos llamado SATCOM, hacemos clic con el botón derecho del ratón y nos vamos a “Propiedades”. 29 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 4.2.f. Cambio de la configuración de la aplicación Web. Donde podremos apreciar que ya tenemos configurado la ruta de acceso local, que es donde se ubica físicamente el directorio de nuestra aplicación Web. Ahora pulsamos en configuración y seleccionamos la etiqueta opciones. Figura 4.2.g. Cambio de los tiempos de expiración. 30 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Es en esta ventana que nos aparece donde podemos efectuar los cambios antes explicados, establecer el tiempo de espera de sesión de 7 días y el tiempo de espera de secuencia de comandos ASP de 15 minutos. Como ya detallé antes con la aplicación COM+, esto sería la forma manual de hacerlo, y como los empleados de Satcom configuraban los ordenadores de los clientes antes de que se iniciara este proyecto. Ahora debemos encontrar una manera de programar todo esto para que se haga de forma transparente al usuario, sin que éste tenga que tener conocimiento alguno sobre IIS, ASP o el Servicio de Internet Information Server. De manera que el cliente sólo deba elegir el equipo donde va a ubicar el servidor Web y le de un botón de nuestra aplicación para que todo se haga automáticamente. Concluyendo, nuestra aplicación de instalación de Discovery deberá permitir elegir al cliente la instalación del servidor Web en la máquina que él desee (generalmente el servidor de la red) y en dicho caso instalará la aplicación en el directorio principal, creará el correspondiente directorio virtual en el servicio de Internet Information Server y cambiará tanto el tiempo de espera de sesión como el tiempo de espera de secuencia de comandos ASP. Y todo esto lo debe hacer a modo de un programa de instalación y por tanto de manera sencilla para el usuario. 4.3 Base de Datos. Una base de datos es una combinación de información de esquema y datos que nos permite almacenar información de forma ordenada. Dicha ordenación nos permite que podamos disponer de la información en diferentes aplicaciones, ya que sabremos de antemano la estructura o esquema en que van a estar dispuestos los datos. Una base de datos puede estar compuesta de un solo archivo, que es lo más habitual, o bien varios de ellos repartidos en diversos volúmenes. En cualquier caso, el contenido de la base de datos no se limita tan sólo a los datos propiamente dichos y a la información de esquema, sino que además, 31 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY también pueden albergar otros elementos como contadores y distintas funciones para su gestión. La información de esquema describe la estructura de los datos almacenados en la base de datos. Estos se agrupan formando registros o filas donde cada una de las cuales cuenta con varios campos o columnas. Las filas se agrupan formando tablas y la suma de las tablas, los contadores, las funciones, etc. forman la base de datos. Siendo más incisos, un campo es la unidad mínima de información que es posible crear o modificar en una base de datos. Un registro o fila es un conjunto de campos o columnas relacionadas entre sí. Por último, una tabla es una colección de registros que, conteniendo informaciones distintas, guardan una misma estructura. Además, las bases de datos no sólo sirven para guardar datos sino que pueden así mismo asegurar la validez de éstos. Es por esto que la base de datos no sólo definirá las tablas y su estructura, además también se establecerán reglas y restricciones para establecer los rangos de valores que pueden tomar ciertas columnas, especificar el tipo de dato que van a almacenar, dar valores por defecto a ciertas columnas, etc. En resumen, las reglas y restricciones de las bases de datos sirven para asegurar que la información introducida, ya sea por cualquier aplicación o directamente por un usuario, sea siempre válida. La base de datos propiamente dicha es el archivo en el que se almacenan los datos, la información de esquema, las reglas y restricciones y los procedimientos o funciones almacenados. Pero las aplicaciones no acceden directamente a esa información, sino que lo hacen de forma indirecta a través de una aplicación conocida como Motor de Bases de Datos. Será este motor el que determine las posibilidades y limitaciones de nuestras aplicaciones con acceso a datos. En nuestro caso, debemos tener en cuenta que Discovery puede que se trate de instalar en una configuración en red, de manera que tendremos que usar una base de datos que funcione en una configuración Cliente/Servidor, de tal forma que la base de datos se divide en dos capas: un cliente, al que accede la 32 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY aplicación en el ordenador local, y un servidor, que se ejecuta en el ordenador que aloja la base de datos. Figura 4.3 Representación de base de datos funcionando en configuración Cliente/Servidor. Llegado a este punto nos decidimos por emplear una base de datos SQL, ya que permite una completa interoperabilidad con el resto de la aplicación y sigue un esquema Cliente/Servidor como el definido anteriormente, y que por tanto se adecua perfectamente a nuestras necesidades. Otra de las causas de esta elección es que en el caso de que el cliente no tenga instalado SQL Server 2000 o uno posterior, podemos instalar de forma gratuita (sin cargos por distribución) MSDE 2000, que es un motor de base de datos totalmente compatible con SQL 2000, aunque eso si con menos capacidades. Así pues, tendremos que instalar una base de datos con toda la información sobre la flota de vehículos, su gestión y control en la máquina adecuada del cliente. En el caso de que disponga de un solo ordenador, lógicamente la base 33 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY de datos se instalará en éste. Si estamos instalando Discovery en una red de ordenadores la base de datos se instalará en el servidor. Para ello, el programa de instalación deberá preguntar si el cliente tiene instalado SQL Server 2000 o posterior, y darle la posibilidad de instalar la base de datos usando éste o instalarlo utilizando MSDE 2000. Además, también se deberá posibilitar la instalación de MSDE 2000, si así lo requiere el usuario. Tanto SQL Server 2000 como MSDE 2000 disponen de una herramienta que nos permite controlar y gestionar la base de datos desde la línea de comandos. Utilizando declaraciones y comandos en Transact-SQL podremos interactuar e incluso crear nuevas bases de datos a partir de cierto fichero de configuración previamente desarrollado. Dicho fichero consta de todo el esquema de la base de datos, la estructura de las diferentes tablas y el tipo de contenido de cada uno de sus campos, así como de distintos procedimientos y funciones que se utilizarán para gestionar dichos datos. La información de este fichero debe ser confidencial, ya que aloja toda la estructura de la información que va a disponer el cliente, así como los diferentes procedimientos para su gestión. Por ello, este fichero deberá aparecer encriptado en el CD de instalación, y se desencriptará de forma automática por la aplicación, no dejando en ningún momento que pueda ser visto o manipulado por ninguna persona ajena a Satcom, ni tan siquiera el cliente. El método de encriptación será explicado en un apartado posterior de este proyecto. Una vez que la aplicación de instalación del entorno de trabajo Discovery desencripte el fichero, este se ejecutará en la línea de comandos. Tanto SQL Server 2000 como MSDE 2000 disponen de una herramienta para gestionar y controlar la base de datos desde la línea de comandos utilizando órdenes en Transact-SQL. Dicha herramienta se conoce como ISQL en el caso de SQL Server 2000 ó OSQL en caso de MSDE. Ambas tienen funcionalidades similares y nos permiten leer los comandos Transact-SQL desde un fichero. Fichero donde se encontrarán las órdenes pertinentes para crear la base de datos deseada. 34 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY En la sección de Anexos (Anexo 9.4) se incluye una breve guía de la funcionalidad de dichas herramientas. 4.4 Infomap. Discovery se debe basar en un buen software de mapeo que permita al cliente seguir su flota de vehículos hasta en la calle más recóndita de Europa. Además el software de mapeo utilizado debe de tener suficiente calidad para que los clientes queden satisfechos con él, que será el que se distribuya por defecto. Por todo ello, además de por la facilidad que ofrece para programar funciones que actúen sobre el mapa, la elección se decantó por utilizar el software de mapeo Infomap. Infomap es un sistema de información geográfica para Windows, que gracias a su gran diseño permite modificar o crear objetos en el mapa, así como un gran número de funciones que interactúan con la base de datos. Además presenta un conjunto de mapas de gran calidad que describen con todo detalle las carreteras de toda Europa, incluyendo países como Andorra o el Vaticano. 4.5 Ficheros Ejecutables. El entorno de trabajo Discovery necesita de algunas aplicaciones adicionales para su correcto funcionamiento. Dependiendo del acuerdo al que cliente y Satcom Technology hayan llegado, el cliente se instalará el ejecutable que corresponda. 4.5.1 Satcom Configuration. Satcom Configuration es una herramienta fundamental para el funcionamiento de Discovery, ya que realiza la configuración final que enlaza el servidor de la base de datos con las librerías utilizadas para la aplicación Web. 35 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 4.5.2 Satcom Wavecom MODEM. Este programa se encarga de mandar y recibir mensajes de textos desde un modem Wavecom, así como de establecer llamadas de datos (data calls). Con ello se comunica el entorno de trabajo Discovery con la unidad en cuestión. 4.5.3 Satcom GPRS. Con esta aplicación tanto los vehículos como Discovery intercambian información a través de TCP/IP utilizando la tecnología GPRS. 4.5.4 Satcom TrakM8 FTP Client. Para los clientes que hayan optado por GPRS en vez de GSM, se les facilita esta aplicación de FTP que les permite a las unidades que le manden a Discovery su historial. Esto se realizaba mediante Data Calls en el caso de los clientes con GSM. 4.6 Otros. A lo largo de la aplicación de instalación se instalan diversos ficheros ejecutables necesarios para el correcto funcionamiento de Discovery. El conjunto de ficheros ejecutables que se instalan son los siguientes: - MDAC_TYP27: instala los ficheros de librería para ADO, lo que permite a una aplicación hacer llamadas a base de datos tales como Microsoft ACCESS o SQL. - VBRun60sp4: es un fichero proveído por Microsoft que permite que una aplicación creada en Visual Basic funcione en una maquina ajena. 36 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY - InfoMap Components 3.0 EN: permite el uso de un conjunto de funciones sobre los mapas. 37 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 5. Elección de una herramienta de trabajo para la aplicación: Visual Basic. Antes de comenzar a desarrollar la Aplicación de Instalación del Entorno de Trabajo Discovery, se tuvo que estudiar y debatir previamente a cerca de que sistema de programación se utilizaría para crearla. Debido a la naturaleza de interactividad que requería la aplicación, donde se debe requerir información al usuario para tomar un rumbo u otro, en un primer momento se pensó en hacerla utilizando código en HTML, de manera que todo fuera en modo página Web. Pero una vez iniciada la aplicación, se cayó en la cuenta de que necesitábamos un lenguaje de programación más potente que nos permitiera poder configurar el sistema del cliente con relativa facilidad. Llegados a este punto, el abanico de posibilidades se extendía ampliamente. La mejor opción que vislumbramos fue el utilizar uno de los posibles lenguajes que nos provee el paquete Microsoft Visual Studio 6.0 que es un sistema de herramientas multipropósito, que nos permite desarrollar prácticamente cualquier tipo de proyecto. Las alternativas eran pues o utilizar Visual Basic 6.0 o utilizar Visual C++ 6.0. La elección no resultó fácil, ya que mientras con Visual C++ ganamos en potencia de programación y en recursos, también es verdad que resulta más complicado de utilizar. Por otro lado, el uso de Visual Basic es ideal para crear interfaces de usuario, ya que es básicamente una tarea que se reduce a algunas operaciones de arrastrar y soltar, y aunque el lenguaje en sí no llega tan lejos como Visual C++ con respecto a posibilidades de desarrollo, si que es más que suficiente para desarrollar la aplicación que nos planteamos. 38 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY A todo esto hay que añadir un cierto grado de egoísmo por mi parte, ya que mientras que ya había trabajado antes con C++, nunca lo había hecho con Visual Basic, con lo que me interesaba aprender a utilizarlo. Finalmente y teniendo en cuenta todo lo dicho anteriormente, se opto por el uso de Visual Basic 6.0 para desarrollar la Aplicación de Instalación del Entorno de Trabajo Discovery. Y tras haberla realizado, habría que indicar que la decisión fue la correcta, ya que ante cualquier eventualidad, siempre teníamos recursos suficientes para solventarla de modo satisfactorio, además de que se trata de un lenguaje de programación ampliamente difundido y por tanto más que bien documentado. 39 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6. Desarrollo de la Aplicación de instalación del entorno de trabajo Discovery. En este apartado se describirá como se ha desarrollado la aplicación, haciéndose un análisis exhaustivo de los métodos empleados así como de los propósitos a conseguir en cada uno de los formularios realizados. Una de las directrices a seguir en el desarrollo de la aplicación es el considerar que el cliente no tiene por qué tener un conociendo alto con respecto a la gestión de sus recursos hardware, como son sus ordenadores o su posible red. Por lo que la aplicación debe de ser fácil de seguir y comprender para un usuario medio. Otra de las directrices que ya se ha mencionado a lo largo del proyecto es la necesidad de un alto grado de confidencialidad, es por ello que se debe desarrollar de forma paralela una aplicación de encriptado para codificar el fichero de configuración de la base de datos, de manera que no sea comprensible para alguien ajeno a Satcom que desconozca el método de encriptación empleado. Así mismo, y siguiendo la directriz de la confidencialidad, sería necesario el desarrollo de una tercera aplicación que nos proporcione un código de producto único para cada ordenador, a partir del cual se creará una clave de desbloqueo también única que permitirá al poseedor del CD de la aplicación instalarla. Dicha clave de desbloqueo será proporcionada al cliente directamente por Satcom, por lo que de este modo la empresa tendrá en todo momento control sobre quien se ha instalado el entorno de trabajo Discovery y en cuantas máquinas lo ha hecho. Como ya se especificó en el apartado anterior, la herramienta usada para programar dichas aplicaciones es Visual Basic 6.0. En esta plataforma de 40 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY programación, los proyectos se dividen en distintos formularios que guiarán e interactuarán con el usuario a través de la aplicación. Cada formulario consta de un código propio que se ejecuta cuando dicho formulario es cargado. Además, existen los llamados Módulos, donde se agrupan todo aquel código común a todos los formularios, y que por tanto podrá ser utilizado desde todos ellos. Con Visual Basic también tenemos la posibilidad de crear Módulos de Clase, que nos permitirá crear objetos nuevos dentro de nuestra aplicación, establecer sus atributos y definir los eventos que describen su comportamiento. También, haremos uso de los servicios ofrecidos por el sistema operativo en forma de API (Interfaz de Programación de Aplicaciones), es decir, un conjunto de funciones que nos permiten realizar las tareas propias del sistema operativo, tal y como pueden ser, cerrar la sesión, editar el registro de Windows,etc. En los anexos (Anexo 9.5) se incluye un apartado que explica como incluir una función API en nuestra aplicación. Para el desarrollo de una aplicación ordenada, lo aconsejable es mantener ciertas reglas, como pueden ser reglas de nomenclatura, o programar varios módulos, cada uno para cierta parte de la aplicación. Siguiendo estos axiomas desarrollamos nuestras aplicaciones de manera que puedan ser fácilmente legibles durante su diseño además de que para un posible programador que pueda incorporarse al proyecto posteriormente no sea muy complicado el seguirla. Resumiendo, para la instalación del entorno de trabajo Discovery deberemos: - Crear la propia aplicación de Instalación. - Crear la aplicación de Encriptación. - Crear la aplicación del Código de Desbloqueo. - Realizarlas de forma que el cliente puede seguir la aplicación fácilmente (la aplicación de instalación). - Desarrollarlas de forma ordenada, agrupando las funciones en módulos y utilizando reglas de nomenclatura. 41 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1 Aplicación de Instalación. Es la aplicación central del proyecto que se encarga de instalar el entorno de trabajo Discovery en el ordenador/red de ordenadores del cliente. Por ello debe ser capaz de instalar los distintos componentes de forma independiente y en diferentes máquinas si así se precisa. Es por esto que deberá distinguir entre una instalación cliente, donde sólo se instalaría el software de mapeo y se enlazaría con los recursos dados por el servidor, y una instalación servidor, donde se instalarían el grueso de la aplicación como son los componentes COM+, el directorio virtual IIS, la base de datos y los distintos ejecutables. En la siguiente figura se puede apreciar esta distribución por medio del diagrama de flujo. Figura 6.1. Diagrama de flujo de la Aplicación de Instalación. En el diagrama se puede ver que en función de la elección del usuario entre una instalación en modo Servidor o en modo Cliente, la aplicación seguirá un curso u otro. Cuando se opta por el modo Cliente, primero el usuario deberá aceptar la licencia e introducir un código de desbloqueo que le permita instalar 42 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY el producto, tras lo que la aplicación le guiará en la instalación del software de mapeo (InfoMap) y “enlazará” la máquina del cliente con el servidor Web de Discovery. Cuando la elección es el modo Servidor, también se empieza certificando que el usuario acepta la licencia e introduce un código de desbloqueo válido, tras lo que se le guía en la instalación de forma distribuida de los diferentes componentes que deben ser instalados, pudiéndose instalar éstos cada uno en una máquina distinta. La aplicación de instalación está formada por 18 formularios, 6 módulos y un módulo de clase. Para que la explicación sea más comprensible, se hará de manera guiada. Es decir, se explicarán los formularios en el orden en el que aparecerían si un cliente estuviera tratando de instalar la aplicación, aunque deteniéndonos en cada formulario para explicar su contenido. 6.1.1 Formularios. La aplicación de instalación está formada por 18 formularios que permitirán al cliente elegir entre distintos modos de instalación y configuración. Cada formulario (excepto el primero) estará precedido de otro/s que lo invoca/n en función del camino elegido por el usuario. De esta manera la aplicación puede seguir el rumbo que deseemos y permitirá que el cliente pueda realizar una instalación del entorno de trabajo Discovery de forma distribuida. 6.1.1.1 frmSetUp. Este es el primer formulario que aparece cuando iniciamos la aplicación. Con él, el cliente tiene la posibilidad de elegir entre si quiere hacer una 43 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY instalación en modo servidor o en modo cliente. Se diferencian así ambos tipos por si el usuario dispone de una red de ordenadores y prefiere tener una instalación del entorno de trabajo Discovery de manera distribuida. Figura 6.1.1.1. Formulario frmSetup Además del mensaje de bienvenida, el formulario habilitará el botón “Install” sólo si se ha elegido previamente un modo de instalación. Dependiendo de la elección del cliente, la aplicación guardará en una variable global llamada “strWhoCall” el valor “Server” cuando el cliente elige la instalación modo servidor, o “Client” cuando el usuario elige la instalación modo cliente. Esta variable será utilizada posteriormente para llamar a un formulario o a otro en función de la selección escogida por el usuario. Al ser este el primer formulario, tiene una funcionalidad añadida que es fundamental para el resto de la aplicación. Esta es la identificación de la ruta del directorio de Windows (normalmente C:\Windows\System32) y del disco donde éste está ubicado (normalmente C:). Está información es vital por que nos indicará en que disco instalar Discovery y en que directorio instalar los archivos DLL y OCX necesarios. Para ello utiliza la función GetWindowsDirectory() ubicada en el módulo principal de la aplicación y que por tanto se explicará más adelante. Todo esto se realizará nada más iniciar la aplicación, es decir al cargar este formulario. 44 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.1. 6.1.1.2 frmLicense. Desde el punto de vista del usuario, éste es la típica ventana para aceptar la licencia que nos permite usar la aplicación. Visualmente el formulario consta de un scroll vertical que nos permite desplazarnos a lo largo del documento, además de dos checkboxes donde el cliente puede aceptar el contrato de licencia o no. Hasta que no esté activada la casilla de aceptar, no se habilitará el botón “Next” que nos dirige al siguiente formulario. Una vez aceptada la licencia, la aplicación está legalmente autorizada para empezar la instalación. Así pues, cuando el cliente haga clic sobre el botón “Next”, la aplicación dará los primeros pasos de la instalación. Estos son el crear un directorio llamado Satcom Discovery en la carpeta Archivos de Programas del ordenador del cliente, donde se almacenarán los diferentes ejecutables y archivos de configuración necesarios. Además se creará una entrada en el registro de Windows para dejar constancia de que se ha instalado ciertos componentes de Discovery. Dicha entrada se llamará Satcom y estará situada en la clave del registro: HKEY_LOCAL_MACHINE\SOFTWARE\Satcom. La siguiente figura (figura 6.1.1.2) muestra el aspecto de este formulario. 45 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 6.1.1.2. Formulario frmLicense. Este formulario también se encarga de instalar y registrar en el sistema un archivo OCX necesario para el uso de barras de progreso en la aplicación. Las barras de progreso son los típicos espacios huecos que se van rellenando a medida que algo se está instalando en el ordenador dando así una impresión al usuario de cuanto se ha instalado y de cuanto falta aun por instalar. Estas barras también son de utilidad para hacer un depurado de la aplicación ya que cuando ésta falla, según el recorrido que haya tenido la barra de progreso sabremos más o menos por donde estará el código erróneo. Aunque lógicamente se utilizan técnicas y facilidades dadas por Visual Basic para el depurado de las aplicaciones, este uso nos puede ahorrar unos segundos de búsqueda. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.2. 46 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.1.3 frmProductKey. Éste sería el siguiente formulario en aparecer. Se trata de cumplir con una de las directrices que nos marcamos a la hora de desarrollar esta aplicación, que no pudiera emplearse fuera del control estricto de Satcom. Figura 6.1.1.3. Formulario frmProductKey. Para ello se diseño el formulario de modo que al cliente le apareciese un código del producto único, y con él, se pusiera en contacto con Satcom para obtener el código de desbloqueo que le permita seguir adelante con la aplicación. Como el código en sí es largo y difícil de transcribir a papel, se añade un botón que permite copiarlo al portapapeles de Windows, y desde ahí el usuario podrá maniobrar como quiera con él. 47 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY De esta manera, conseguimos tener un control sobre nuestros clientes, y como el código es único para cada máquina, también controlamos el número de instalaciones que cada cliente realiza y en cuantos equipos. Una vez el cliente se ha puesto en contacto con Satcom y se verifica su contrato, se le proporcionará el código de desbloqueo, código que el cliente deberá escribir en el text box “Unlock Key” para poder continuar con aplicación de instalación. Se le permitirán al usuario cuatro oportunidades para introducir el código correcto, tras las cuales la aplicación se cerrará. Cuando el código de desbloqueo es el correcto y se pulsa el botón “Next” se creará un valor nuevo de tipo REG_SZ (para valores alfanuméricos) en la clave del registro creada en el formulario anterior (HKEY_LOCAL_MACHINE\SOFTWARE\Satcom) con el nombre Unlock Key y que contendrá el código de desbloqueo para que en ese ordenador esté código aparezca ya automáticamente en su campo del formulario en las posteriores ocasiones que se utilice la aplicación de instalación. Hasta aquí, tanto la instalación modo Servidor como la modo Cliente coinciden. Es ahora, tras la aceptación de la licencia, que ambos caminos se bifurcan. Para ello, este formulario mira en la variable global strWhoCall, valorada en el primer formulario (frmSetUp), y en función de su contenido encamina la aplicación hacia un formulario o hacia otro. Para mejor comprensión del proyecto se empezará explicando la instalación en modo Servidor. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.3. 48 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.1.4 frmSelection (Instalación modo Servidor). Éste es el formulario principal de la instalación en modo Servidor ya que desde aquí el usuario decidirá que componente instalar en el ordenador que está usando en ese momento. Figura 6.1.1.4.a Formulario frmSelection. Como ya se ha mencionado a lo largo del proyecto, el cliente puede optar por instalar el entorno de trabajo Discovery de forma distribuida, por lo que la separación en distintos componentes de instalación era una cuestión necesaria. El formulario consta de varios botones a través de los cuales se realizaran funcionalidades diferentes. Cada uno de estos botones haría lo siguiente: 49 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY • Botón “Install COM+ Aplication”: debido a que para la instalación de la aplicación COM+ es necesario que el cliente de más información acerca de la configuración que desea, este botón se limita a ser un puente hacia otro formulario (frmIdentity) donde dicha información será requerida y COM+ instalado. • Botón “Install IIS”: en este caso, ya disponemos de toda la información necesaria para la instalación del directorio virtual en IIS, con lo que haremos la instalación directamente desde este formulario. Para ello primero tendría que explicar que el formulario no es exactamente como se muestra en la figura anterior, sino que es algo más alto ya que dispone de una barra de progreso. Cuando el usuario pulse sobre este botón, el formulario engrandecerá pasa mostrar dicha barra de progreso y cuando termine de instalar el directorio virtual volverá a su tamaño normal para ocultarla. Figura 6.1.1.4.b Formulario frmSelection con la barra de progreso. 50 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Además, se bloquea el formulario para que así no se pueda pulsar ningún otro botón mientras se esta ejecutando éste y así evitar posibles errores y sobrecargas. En el plano estético, se cambia el símbolo del ratón de la flecha al típico reloj de arena para indicar que se está ejecutando la aplicación. A partir de entonces se empieza a realizar la instalación; primero copiamos nuestro directorio Satcom, donde está la aplicación Web, en el directorio principal de IIS, es decir en “\Inetpub\wwwroot”. Y finalmente y utilizando un módulo de clase creado para tal utilidad que se explicará más adelante, se realizará toda la configuración que se explicó en el apartado 4.2 en la herramienta Servicios de Internet Information Server, es decir, crear el directorio virtual y configurarlo según nuestras necesidades: llamarlo SATCOM, relacionarlo con su ubicación física en “\Inetpub\wwwroot\Satcom”, y cambiar tanto el tiempo de espera de sesión como el tiempo de espera de secuencia de comandos ASP. Pero ahora, eso sí, de forma automática y sin que el cliente tenga que realizar acción alguna. • Botón “Install Database”: al pulsar este botón el usuario será dirigido a otro formulario (frmDatabaseSelection) donde se realizará la instalación y configuración de la base de datos. • Botón “Communications”: con “communications” se refiere a los ficheros ejecutables que en Discovery nos permiten comunicarnos con los vehículos, es decir, el cliente FTP, el gestor del MODEM GSM/GPRS ,… Cuando se hace clic sobre este botón, primero se instalan y registran los archivos DLL y OCX necesarios para el correcto funcionamiento de dichos ficheros ejecutables, para lo que se hace uso de un procedimiento Sub llamado “InstallDLL” definido en el módulo principal y que por tanto se describirá posteriormente. Tras este paso, se llamará al formulario que instala las diferentes aplicaciones de comunicación. • Botón “Finish”: para identificar cuando se ha instalado algún elemento en la máquina del cliente se crea una variable global booleana llamada “boAnyInstalled” a la que le daremos el valor verdadero siempre que se 51 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY haya instalado algo. Así podremos distinguir entre dos posibles finales de la aplicación de instalación, uno en el que no hará falta reiniciar el equipo, y otro en el que se le aconseja al usuario a que lo reinicie. Este formulario actúa como eje central de la instalación en modo Servidor, de manera que una vez que se instale cualquier componente se volverá a este formulario antes de salir de la aplicación por si el cliente quiere instalar algo más. Por este motivo, y para que el cliente sepa en cada momento que ha instalado previamente, se crean unos valores en el registro de Windows para identificar que parte de la instalación está concluida. Así, cada vez que se carga el formulario, se chequea el registro para ver que hay instalado, y se añade una etiqueta en rojo al lado del componente que ya lo esté. Estas etiquetas no atañen al botón “Communication” ya que esto se hará en el formulario que instala los ficheros de comunicación (frmExeFiles). Para un ordenador con todo ya instalado, tendríamos la siguiente apariencia: Figura 6.1.1.4.c. Formulario frmSelection con los tres primeros componentes ya instalados. 52 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.4. 6.1.1.5 frmIdentity (Instalación modo Servidor). Este es el formulario encargado de instalar la aplicación COM+ que englobará toda la capa de negocio de Discovery. Se llega a aquí cuando el cliente pulsa sobre el botón “Install COM+ Application” en el formulario de selección (frmSelection). Figura 6.1.1.5. Formulario frmIdentity. Tal y como ocurría cuando tratábamos de instalar la aplicación COM+ manualmente, se necesita identificar al usuario bajo el cual se ejecutará la 53 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY aplicación. Para ello se creó este formulario, dando la opción de ser el usuario que tenga iniciada la sesión u otro correctamente especificado en los text boxes que se habilitan cuando se valida la opción “This User”. Así pues, cuando el cliente pulse sobre el botón “Next” dependiendo de la opción elegida instalará la aplicación COM+ bajo el usuario por defecto (el que tenga iniciada la sesión) o bajo el especificado por el cliente. Cuando se pulsa sobre el botón “Back” simplemente se vuelve al formulario anterior, que es el formulario central de la instalación en modo Servidor: frmSelection. Algunas particularidades añadidas de este formulario son, que además de que los text boxes referentes a la identificación de un usuario concreto sólo están habilitados cuando esta opción es la escogida, cuando esto ya se ha hecho previamente, ésta pasa a ser la opción por defecto y los text boxes se rellenan automáticamente con los valores escritos en la ocasión anterior. Para lo que se hace uso del almacenamiento y lectura de esa información en el registro de Windows en la clave de Satcom. También incluye una barra de progreso, que como en el caso del formulario anterior está oculta por el tamaño de la ventana. Mientras se esté ejecutando la instalación, el formulario aumentará su tamaño y dejará ver dicha barra, ocultándola de nuevo al finalizar la instalación. Como ya se explicó, el formulario frmSelection es el formulario central de la instalación en modo Servidor. Por tanto, y tal y como se ha visto en el código, cuando se termine este formulario se volverá al frmselection. De esta manera, el cliente tras haber instalado la aplicación COM+ en un ordenador podrá decidir si instalar el directorio virtual, la base de datos, y/o los ficheros de comunicación en esa misma máquina o no. Lo mismo pasará con los formularios para crear la base de datos y para instalar los ficheros de comunicación, que cuando terminan su cometido, vuelven al formulario frmselection. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.5. 54 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.1.6 frmDatabaseSelection (Instalación modo Servidor). A través de este formulario el cliente podrá instalarse la base de datos necesaria para el funcionamiento del entorno de trabajo Discovery. Además, podrá elegir entre hacerlo utilizando SQL Server 2000, si es que el cliente ya dispone de este software o hacerlo utilizando MSDE 2000. Figura 6.1.1.6. Formulario frmDatabaseSelection. En el caso de que el cliente no disponga de ninguno de los anteriores programas, se le da la opción de que se instale MSDE 2000, ya que éste es un software del cual Microsoft permite su libre distribución. Como para instalar la base de datos es necesario que el cliente especifique ciertos parámetros, desde este formulario se accederá a otros donde estos datos serán solicitados. Cuando el cliente selecciona la opción de instalar MSDE 2000, debemos cerciorarnos primero de que no lo tiene ya instalado, para ello se hizo un estudio para ver como podíamos saber si un usuario lo tenía instalado o no. De 55 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY este estudio decidimos que la mejor manera para saberlo es observando el registro de Windows, ya que seguramente en él se almacenaría algún dato que nos lo indicará. Y efectivamente así es, ya que mirando en el registro vemos que la clave:"LocalMachine\SOFTWARE\Microsoft\Microsoft SQL Server" existe, y por tanto que será nuestra señal para determinar que MSDE 2000 ya está instalado. El resto de botones actuarán como accesos a otros formularios. Así, el botón “Install Database in SQL Server 2000” nos llevará al formulario donde se instalará la base de datos especificándole a dicho formulario que se desea instalarla utilizando SQL Server 2000. Del mismo modo, cuando pulsamos sobre el botón “Install Database in MSDE 2000”, se pasará al mismo formulario pero especificando que se quiere emplear MSDE 2000. Por último el botón “Back” nos lleva de nuevo al formulario frmSelection. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.6. 6.1.1.7 frmMSDE2000Finish (Instalación modo Servidor). Cuando se instala MSDE 2000 en el equipo del cliente, es necesario que se reinicie el sistema para poder instalar la base de datos bajo esa herramienta. Es por ello que se creó este formulario, que avisa al cliente de tal información. Figura 6.1.1.7. Formulario frmMSDE2000Finish. 56 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Además le da la posibilidad al cliente de que reinicie su equipo desde la misma aplicación. Ésta es una tarea bastante compleja, y para acometerla se ha programado un módulo (módulo Reboot) que engloba las funciones y procedimientos necesarios para tal fin. Cuando el cliente pulsa sobre el botón “Finish without restarting” se sale de la aplicación de instalación. Para ello, se descarga el formulario actual y como éste es el único activo en ese momento, se saldrá de la aplicación. Una vez que el usuario ha reiniciado su equipo, la instalación de MSDE 2000 toma efecto, con sus consecuentes cambios en la configuración del sistema del cliente. Entre ellos, el que nos permite identificar si MSDE 2000 está instalado o no. Esta tarea la desempeña (como ya hemos explicado) el formulario anterior frmDatabaseSelection chequeando para ello el registro de Windows en busca de la llave “LocalMachine\SOFTWARE\Microsoft\Microsoft SQL Server", que tras la instalación hecha en este formulario y tras el reinicio del sistema deberá a existir y por lo tanto no se permitirá en el formulario anterior su re-instalación. Así pues, volviendo al formulario anterior y para facilitar una mejor comprensión de esta aplicación, seguimos la explicación con el siguiente paso de la aplicación de instalación. Es decir, una vez reiniciado el sistema y de vuelta en el formulario frmDatabaseSelection el cliente deberá especificar si quiere instalar la base de datos utilizando SQL Server 2000 o MSDE 2000. Una vez que el cliente ha decidido que instrumento utilizar para instalar la base de datos, e independientemente de la elección escogida, se procederá a instalarla en el siguiente formulario: frmSetUpInServer, en donde se distinguirá entre una opción u otra. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.7. 57 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.1.8 frmSetUpInServer (Instalación modo Servidor). A este formulario se llega desde el formulario frmDatabaseSelection cuando se selecciona cualquiera de los dos botones para instalar la base de datos. Para controlar que opción escogió el cliente, se mirará en la variable global strDatabaseFlag que nos dirá si prefirió instalar la base de datos utilizando SQL Server 2000 o MSDE 2000. La diferencia, a efectos de la instalación, entre las dos opciones reside en la herramienta para crear la base de datos por la línea de comandos, que en el caso de SQL Server se llama ISQL y en el caso de MSDE 2000 se llama OSQL. Figura 6.1.1.8. Formulario frmSetUpInserver. El cliente tan solo tendrá que especificar donde quiere almacenar los ficheros de la base de datos y los ficheros LOG, para lo que se le facilita un formulario “Browser” donde podrá elegir o crear el directorio determinado. Para 58 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY conocer si dicho formulario está destinado a seleccionar la ubicación del fichero de la base de datos o del fichero LOG, se usa una variable global que lo indicará (strOrigin). De este modo podremos utilizar un único formulario Browser para ambos cometidos. Dicho formulario se explicará en el próximo apartado. Además, debido a que SQL Server permite que el cliente pueda tener varias versiones instaladas pero con diferentes instancias, el formulario añade la posibilidad de que el usuario especifique una instancia determinada donde instalar la base de datos. Se obligará al cliente a especificar una ubicación para el fichero de la base de datos y para el fichero LOG, de tal modo que hasta que estos no sean elegidos no se habilitará el botón “Next” que instala la base de datos. Asimismo, cuando se selecciona una ubicación para uno de los dos tipos de ficheros, está se auto-seleccionará para el otro tipo también, ya que lo más común es que ambos estén en el mismo directorio; aun así, el cliente tiene siempre la posibilidad de elegir ubicaciones diferentes. Por último, y tal y como se ha ido realizando en formularios anteriores, se usará el registro de Windows para almacenar información que puede ser útil para el cliente en re-instalaciones. De este modo, de este formulario se guardarán las ubicaciones para el fichero de la base de datos y el fichero LOG, así como de la instancia. Una vez instalada la base de datos, si el cliente quiere volver a instalarla o modificarla, esos datos aparecerán por defecto escritos en el formulario. Cuando el cliente ha rellenado los textboxes (el de instancia es opcional) y pulsa sobre el botón “Next” se procede a la instalación de la base de datos. Tarea que resulta bastante tediosa debida a la obligatoriedad de tener un alto grado de confidencialidad y por tanto de usar código complejamente encriptado. Para ello se realizan los siguientes pasos: - Se desencripta el fichero Encryp.enc que está en el CD de instalación dado al cliente y que contiene parte de la información de la base de datos pero de forma encriptada. Dicho fichero se desencripta y se 59 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY guarda en un fichero llamado filler.sql (fichero de relleno) en el directorio “Archivos de programa\Satcom Discovery”. - Se localiza el directorio temporal del ordenador del cliente y se crea allí un fichero llamado SatcomSQL.sql que contendrá toda la información de la base de datos a instalar, y que será el fichero que posteriormente utilizaremos con la herramienta ISQL ó OSQL para instalar la base datos. Este fichero constará de una cabecera fija, que describe el tamaño y la topología de la base datos, y del resto de la base de datos como son las distintas tablas, procedimientos y funciones. La cabecera será fija y estará escrita en este formulario, mientras que el resto de la base de datos estará en el CD de instalación en el fichero Encryp.enc, que en el paso anterior hemos traducido al fichero filler.sql. Así pues, copiamos primero la cabecera y luego el contenido de filler.sql en el fichero SatcomSQL.sql. El motivo de tanto movimiento es que no se quiere que el poseedor del CD pueda acceder a los datos, para lo que se decodificarán justo antes de su instalación y se borrarán una vez que la base de datos esté debidamente instalada. - Se crea en el directorio temporal un nuevo directorio llamado SATCOMADDONS, donde se guardarán de forma temporal ficheros encriptados adicionales que formarán parte de la base de datos; ficheros que contendrán opciones adicionales de ésta, como pueden ser nuevas funciones o procedimientos. De esta manera aumentamos la escalabilidad de la aplicación, ya que tan sólo se necesitará encriptar un fichero de configuración adicional e incluirlo en esta carpeta para personalizar la base de datos. De forma estándar, copiaremos desde el CD de instalación a esta carpeta el fichero encriptado totalfile.enc, aunque como ya se ha mencionado se podría personalizar en función de las necesidades del cliente. - Se añade a nuestro fichero de configuración SatcomSQL.sql la información procedente de los ficheros que estén en la carpeta SATCOMADDONS descrita en el paso anterior, para lo que previamente se desencripta la información. - Se borra la carpeta SATCOMADDONS del directorio temporal. 60 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY - Se utiliza la herramienta ISQL ó OSQL (según se haya elegido SQL Server 2000 ó MSDE 2000 respectivamente) para instalar la base de datos según el fichero de configuración que hemos creado: SatcomSQL.sql. - Se borra del ordenador el fichero de configuración SatcomSQL.sql y el de relleno filler.sql. Con lo que no quedará restos ninguno de la información de la base de datos en el ordenador. - Finalmente se copia en el registro de Windows la ruta del fichero de la base de datos y del fichero Log, así como el nombre de la instancia cuando ésta haya sido usada. De esta manera, se consigue que si una persona ajena se hace con un CD de instalación no pueda instalar la base de datos a no ser que sea con la aplicación de instalación, que asimismo, no se lo permitirá a no ser que contacte con Satcom para pedir una clave de desbloqueo. Por otro lado, se logra un alto grado de escalabilidad ya que la base de datos se podrá aumentar y personalizar simplemente añadiendo ficheros previamente encriptados a un directorio concreto del CD de instalación (también llamado SATCOMADDONS), que posteriormente los copiará al directorio SATCOMADDONS en la carpeta temporal. Para que se pueda apreciar de forma dinámica el proceso de instalación se incluye en el formulario una barra de progreso que irá rellenándose a medida que la aplicación vaya avanzando. Como ocurría con formularios anteriormente descritos, dicha barra permanece oculta hasta que se procede con la instalación, momento en el que el formulario aumenta de tamaño y la muestra en la parte inferior. Al terminar la instalación, el formulario vuelve a su tamaño normal ocultándola de nuevo. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.8. 61 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.1.9 frmBrowser y frmFolderName (Instalación modo Servidor). Estos formularios están intrínsicamente ligados al anterior frmSetUpInServer. El formulario Browser aparece en la aplicación cuando el cliente pulsa sobre el botón “Browse” para seleccionar la ruta del fichero de la base de datos o del fichero LOG. Figura 6.1.1.9.a Formulario frmBrowser. Su funcionalidad es la típica de un formulario explorador que le facilita al usuario la tarea a la hora de seleccionar un directorio o de encontrar una ruta específica. Así pues, el cliente podrá elegir entre las diferentes unidades gracias a la herramienta de selección colocada en la zona superior, y finalmente entre los diferentes directorios usando la herramienta de selección central. También se facilita la posibilidad de crear una nueva carpeta pulsando sobre el botón “New Folder”, que nos dirigirá al formulario frmFolderName. Cuando el cliente haya elegido la ruta o creado una nueva y pulse sobre el botón “OK”, esta información se auto-rellenará en el formulario que llamo a éste, es decir el frmSetUpInServer visto en el apartado anterior y dependiendo de si la ruta buscada era para el fichero de la base de datos o para el fichero LOG, se rellenará un text box de este formulario u otro. 62 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Como ya se ha mencionado, el botón “New Folder” guía la aplicación hacia el formulario frmFolderName que nos permite crear un nuevo directorio en el equipo del cliente. Figura 6.1.1.9.b. Formulario frmFolderName. Este formulario simplemente le pregunta al cliente el nombre de la carpeta que quiere crear y la coloca justo en el directorio que estaba seleccionado en el frmBrowser. Para un análisis más detallado se incluye el código debidamente comentado de ambos formularios en los anexos 9.1.1.9 y 9.1.1.10. 6.1.1.10 frmExeFiles (Instalación modo Servidor). Este formulario constituye la última parte de la aplicación en modo Servidor y lleva a cabo la instalación de los ficheros ejecutables adicionales necesarios para el correcto funcionamiento de Discovery. El aspecto de este formulario se puede apreciar en la siguiente figura (figura 6.1.1.10). 63 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 6.1.1.10.a. Formulario frmExeFiles. Dependiendo del tipo de contrato que el cliente haya adoptado con Satcom podrá instalarse unas aplicaciones u otras. De este modo, si se ha optado por un seguimiento de las flotas vía GSM, la aplicación sería Satcom GSM Modem, mientras que si se optó por utilizar GPRS para controlar la posición de los distintos vehículos, la aplicación adecuada sería Satcom GPRS y el cliente FTP. Mención aparte merece la aplicación Satcom Configuration, que es una herramienta necesaria y vital para el correcto funcionamiento de Discovery y que como tal no se presenta como una instalación opcional, sino obligatoria. El propósito de dicha aplicación es el de vincular Discovery con la base da datos creada, y se deberá ejecutar a modo de herramienta post-instalación de configuración. Las aplicaciones deberán copiarse del CD de instalación al directorio de Satcom Discovery creado al inicio de la aplicación en la carpeta “Program Files”. Asimismo, exceptuando la aplicación Satcom Configuration, el resto deberán ejecutarse siempre que el cliente inicie su ordenador, problema que solventamos creando accesos directos de dichos ficheros en la carpeta de inicio. 64 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Además, este formulario también dispone de unas etiquetas que nos indican cuales de las aplicaciones están actualmente instaladas. Figura 6.1.1.10.b Formulario frmExeFiles cuando todo ha sido previamente instalado. Para lo cual hace uso del registro de Windows para almacenar qué aplicaciones están instaladas. Como ya ocurría con anteriores formularios de instalación, éste se ha proveído con una barra de progreso que informe al cliente de manera gráfica de la situación de la instalación. Dicha barra está inicialmente oculta y se mostrará cuando el cliente pulse sobre el botón “install” para luego volver a ocultarse al finalizar la instalación. Por último la funcionalidad de los botones es bastante gráfica, el botón “Install” procede a la instalación de las aplicaciones mientras que el botón “Back” devuelve la aplicación al formulario frmSelection. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.11. 65 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.1.11 frmClientInstallation (Instalación modo Cliente) Hasta ahora, hemos estado analizando la parte de la aplicación que en una configuración distribuida instala todos los componentes correspondientes al servidor. Cuando estemos en el caso en que el cliente no disponga de una configuración de red sino de un único ordenador donde iría todo el entorno de trabajo Discovery, dichos componentes irían ubicados en el ordenador junto con los componentes asociados a la instalación en modo Cliente sin que con ello ocurra ningún tipo de conflicto. Como ya se explicó en el apartado 6.1.1.3, es en el formulario frmProductKey donde la aplicación de instalación se bifurca según la elección que el cliente estableció al principio entre instalación en modo Servidor o en modo Cliente. El presente formulario es el primero en aparecer tras esa bifurcación y procede a la instalación de la aplicación en modo Cliente. Figura 6.1.1.11.a. Formulario frmClientInstallation. Pese a que el aspecto de este formulario pueda resultar algo simple, la tarea que desarrolla dista mucho de la simplicidad y lleva tras de si bastante trabajo de investigación. Es debido al axioma que establecimos al principio acerca de la claridad a vistas del cliente, que se desarrolló este formulario de una manera que el usuario lo pudiera comprender con sencillez, aunque con ello se limitara en cierto modo su capacidad de decisión. El entorno de trabajo Discovery se basa en una aplicación Web que sirve de interfaz de usuario, y que utilizará el navegador Microsoft Internet Explorer. La 66 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY aplicación Web se ubicará en la Intranet de la empresa, utilizando como servidor Web Internet Information Server (IIS). Para que no ocurran incompatibilidades se debe configurar la seguridad de la Intranet, tarea que se puede realizar cambiando ciertos parámetros de Internet Explorer relacionados con las ActiveX. En concreto, los cambios serán activar la casilla de “Inicializar y activar la secuencia de comandos de los controles ActiveX no marcados como seguros” y marcar en “Pedir Datos” bajo la opción de “Descargar los controles no firmados para ActiveX”. El por qué de esta configuración, es debido a que en la aplicación Web se introduce un frame creado como control ActiveX donde irá situado el mapa elegido por el cliente y que no está marcado previamente como seguro, por lo que se deberán emplear estos cambios para que se pueda utilizar correctamente. Figura 6.1.1.11.b. Configuración de seguridad de Intranet a cambiar en Internet Explorer. Además, a lo largo de está aplicación y más concretamente en el formulario frmIISServerName, se incluirá a la aplicación Web dentro de los Sitios de Confianza definidos por Internet Explorer y que por tanto se consideran que no van a perjudicar al ordenador ni a su información. Del mismo modo, también se 67 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY cambiará la configuración de seguridad para estos Sitios de Confianza activando tanto la opción “Inicializar y activar la secuencia de comandos de los controles ActiveX no marcados como seguros” como la opción “Descargar los controles no firmados para ActiveX”. Estas opciones de configuración son fáciles de cambiar desde la sección de seguridad de las opciones de internet del Internet Explorer, pero se trata de hacerlo de manera automática y sin intervención del cliente, ya que se trata de un tema que seguramente éste desconozca. La manera de llevarlo a cabo nos llevo bastante tiempo de indagación, optándose finalmente por investigar los cambios que Internet Explorer hacía en el Registro de Windows cada vez que se cambiaba una configuración de seguridad. De este modo, se concluyó que Internet Explorer almacena su configuración en el Registro y que por tanto desde allí se puede modificar ésta. La dificultad estaba ahora en encontrar la clave donde se producían los cambios y como realizarlos. Lo primero se solventó mediante un programa que comparaba el contenido del registro en dos instantes distintos y mostraba los cambios, con lo que se ubicó la clave y el valor concreto que cambiaba. El realizar los cambios automáticamente mediante programación, se realizó utilizando un conjunto de API´s declaradas en el módulo EditRegistry, que nos permiten controlar la información almacenada en el Registro de Windows. Por último, este formulario instala y registra los ficheros Dll y/o OCX necesarios para la instalación en modo Cliente. Todo esto se realiza cuando el cliente accede a la instalación y pulsa sobre el botón “Install”, en caso contrario, si pulsa sobre el botón “Cancel” se saldrá de la aplicación de instalación. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.12. 68 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.1.12 frmClientInstallation2 (Instalación modo Cliente). La parte principal de la instalación en modo Cliente es la instalación de un Software de mapeo que permita seguir las rutas de cada uno de los vehículos. Dicho software debe ser fácilmente actualizable debido al continuo cambio de las carreteras, además de que debe ofrecer una calidad de detalle muy alta para presentar los callejeros de las poblaciones más recónditas. La solución adoptada fue la de instalar por defecto el software de mapeo InfoMap ya que cumple notablemente con todas estas necesidades. Figura 6.1.1.12. Formulario frmClientInstallation2. Este formulario instala los componentes necesarios para la utilización de los diferentes mapas proporcionados por InfoMap, así como sus actualizaciones. De este modo, una vez instalado el entorno de trabajo Discovery, el cliente podrá instalar cualquier mapa dado por InfoMap y éste interactuará correctamente con Discovery. Cuando el cliente pulsa sobre el botón “Skip” se entiende que ya tiene instalado dichos componentes de InfoMap, por lo que se pasa al siguiente paso de la instalación en modo Cliente (frmIISServerName). En el caso de que el cliente pulse sobre el botón “Next” se procederá a la instalación de estos componentes, para lo que se ejecutará el fichero “InfoMap Components 3.0 EN” situado en el CD de instalación en la carpeta “EXEFILES”. 69 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Una vez instalado se pasará a un formulario intermedio frmPJSoftLicenseFiles donde se llevarán a cabo las acciones necesarias para cumplir con los ficheros de licencia. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.13. 6.1.1.13 frmPJSoftLicenseFiles y PJSOftBrowser (Instalación modo Cliente). El formulario frmPJSoftLicenseFiles se encargará de instalar correctamente los ficheros de licencia de InfoMap. Estos deben ubicarse en la carpeta “ActiveX” dentro de la carpeta donde InfoMap Components 3.0 EN haya sido instalado, además de en la carpeta de sistema “System32”. Por tal motivo, se deberá preguntar al cliente donde acaba de instalar InfoMap Components y así trazar la ruta adecuada para ubicar los ficheros de licencia. Figura 6.1.1.13.a. Formulario frmPJSoftLicenseFiles. Como se puede apreciar, el formulario facilita la acción al cliente en caso de que a la hora de instalar InfoMap Components lo hiciera en la ruta por defecto, escribiendo tal ruta en su lugar. 70 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Cuando el cliente rellene el text box de la ruta y pulse sobre el botón “Next” procederá a la instalación de los ficheros de licencia, para lo que primero se comprobará que la ruta dada es correcta y contiene una carpeta llamada “ActiveX”, en caso contrario se dará un mensaje de error. Además se le facilita al usuario un formulario browser para que pueda seleccionar la carpeta buscada de forma gráfica. Dicho formulario (frmPJSOftBrowser) se cargará cuando se pulse sobre el botón “Browse” y desempeñará las funciones habituales de un browser, es decir las de posibilitar la elección de forma gráfica de una determinada ruta. Figura 6.1.1.13.b. Formulario frmPJSOftBrowser. En él, el cliente podrá seleccionar cualquier carpeta de cualquiera de los discos de los que disponga en su ordenador. Una vez seleccionada, tras pulsar el botón “Ok” se volverá al formulario frmPJSoftLicenseFiles donde se colocará la ruta escogida. Con el botón “Cancel” tan solo se cierra el Browser, volviendo al formulario anterior. Para un análisis más detallado se incluye el código debidamente comentado de ambos formularios en los anexos 9.1.1.14 y 9.1.1.15. 71 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.1.14 frmIISServerName (Instalación modo Cliente). Este es el último formulario perteneciente a la instalación en modo Cliente y se encarga de nombrar la aplicación Web y crearle un acceso directo en el escritorio de Windows. Además, coloca esta aplicación Web dentro de los “Sitios de confianza” del navegador Internet Explorer. Figura 6.1.1.14. Formulario frmIISServerName. Generalmente, el servidor IIS tiene el mismo nombre que el nombre del equipo, por lo que nuestro formulario mostrará este nombre por defecto para hacer la instalación más fácil para el cliente. En caso de que el nombre sea distinto, el usuario no tiene más que cambiarlo. Cuando ya se ha hecho previamente una instalación en modo Cliente, el text box se auto-rellena con el nombre escogido con anterioridad, para lo que utiliza el registro de Windows para almacenarlo en el ordenador del usuario. Para incluir el nombre de la aplicación Web en los “Sitios de confianza” primero se realizó un estudio de cómo se podía realizar de manera automática, estudio del que se sacó la conclusión de utilizar el registro de Windows ya que el navegador Internet Explorer almacena casi toda su información en él. Así, estudiando la clave apropiada del registro y viendo sus cambios al introducir un nuevo link en los sitios de confianza de manera manual, deducimos los pasos a seguir por la aplicación. Para ello, en el caso de que el nombre del servidor coincida con el nombre del equipo (caso más general), se colocará una nueva 72 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY clave en el registro llamada “localhost” incluyendo en ella un valor llamado “http” donde almacenaremos un 2. Cuando el nombre del servidor sea distinto, se creará la nueva clave con el nombre de este servidor y en ella se incluirá un valor llamado “http” donde almacenaremos un 2. Por último, una vez terminada la instalación se pasa al formulario frmFinish que dará por terminada la aplicación. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.1.16. 6.1.1.15 frmFinish y frmFinishWithoutInstall. A lo largo de la aplicación hemos ido utilizando la variable booleana global boAnyInstalled para marcar si se ha instalado algo en el ordenador del cliente. Su empleo se debe a la naturaleza de la aplicación, ya que ésta no se desarrolla de forma continua de principio a fin, sino que dependiendo de lo que el cliente quiera instalar la aplicación seguirá un camino u otro. Por ello habrá veces en las que el cliente sólo trate de instalar por ejemplo la aplicación COM+ en un ordenador o incluso cuando llegue al formulario central de la instalación en modo servidor y vea que ya está instalada decida no instalar nada. Debemos diferenciar las ocasiones en las que el cliente instala algo y cuando no, ya que en el primer caso se deberá reiniciar el ordenador para que lo instalado funcione correctamente. Así pues, en el caso de que se haya instalado algún software, se debe dar la posibilidad al usuario de elegir entre si quiere finalizar la aplicación sin más o si quiere hacerlo reiniciando el ordenador. Es esta la función del formulario frmFinish, que se cargará siempre que el cliente decida finalizar la aplicación de instalación y la variable boAnyInstalled contenga el valor TRUE. En caso de que su valor sea el de FALSE, se pasará a cargar el formulario frmFinishWithoutInstall que simplemente dará un mensaje de despedida. 73 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY El aspecto del formulario frmFinish es el siguiente: Figura 6.1.1.15.a. Formulario frmFinish. La tarea de reiniciar el ordenador es bastante compleja ya que se necesita de ciertos privilegios en el ordenador en cuestión para que a través de una aplicación se pueda reiniciar el equipo. Por ello, se programan una serie de funciones agrupas en un nuevo módulo (módulo Reboot) que desarrollarán todo este complicado trabajo. Además, en este formulario se le informa al cliente del código del producto que acaba de instalar así como del código de desbloqueo utilizado. Dichos códigos son a su vez copiados en un fichero de texto situado dentro de la carpeta de Satcom Discovery. Los dos códigos mostrados son obtenidos a partir de las variables globales que los almacenan, strProductSerialNumber y strUnlockKey, y son copiados al cargarse el formulario. El formulario frmFinishWithoutInstall simplemente informa al cliente de que no se ha instalado ningún tipo de software en su ordenador y que se ha finalizado con la aplicación de instalación. 74 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY El aspecto de este formulario es el siguiente: Figura 6.1.1.15.b. Formulario frmFinishWithoutInstall. Cuando el cliente pulse sobre el botón “Finish” se finalizará la aplicación de instalación. Para un análisis más detallado se incluye el código debidamente comentado de ambos formularios en los anexos 9.1.1.17 y 9.1.1.18. 75 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.2 Módulos. Hasta ahora hemos visto lo que podemos denominar la estructura externa de la aplicación de instalación, constituida por los formularios que guían al cliente durante todo el proceso. Pero éstos no podrían constituir la aplicación por si solos, ya que ésta necesita de variables y constantes globales, declaraciones de APIs y funciones y procedimientos que implementen funcionalidades comunes necesitadas por varios formularios. La columna vertebral de la aplicación la constituyen los módulos, donde se desarrollan las funciones y procedimientos empleados en cada formulario. Además, para seguir un modo de programación ordenado, dependiendo de la naturaleza o funcionalidad de cada función o procedimiento, se ha almacenado en un módulo u otro. Con lo que se desarrolla el trabajo de una manera mucho más ordenada y fácil de seguir. En total se han creado 7 módulos, uno de los cuales es un módulo de clase que nos permitirá trabajar con un nuevo tipo de objeto. Dentro de cada módulo podemos encontrarnos con diferentes elementos como son funciones (devuelven algún valor), procedimientos (no devuelven ningún valor), declaraciones de APIs, declaraciones de variables globales y declaraciones de constantes. Todo lo que haya en los módulos podrá ser accesible por los formularios, es por esto que se colocan ahí las declaraciones globales. En los anexos se incluye el código debidamente comentado sirviendo de análisis detallado de cada una de las funciones y procedimientos que los módulos contienen. 6.1.2.1 Módulo Principal (Main Module). Este es el módulo donde se almacenan las funciones más comunes de la aplicación, así como las constantes, variables y declaraciones de APIs. 76 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY En el anexo 9.1.2.1 se analizarán cada una de estas partes por separado, haciendo un estudio del código empleado para cada una de ellas. Entre las funciones que engloba, cabe destacar la función CheckVersion que nos permite conocer cúal entre dos ficheros tiene una versión mas actualizada. Un ejemplo del funcionamiento de esta función se incluye en el anexo 9.6. 6.1.2.2 Módulo EditRegistry. Este módulo engloba las funciones, procedimientos y APIs necesarias para la edición del registro de Windows. Ésta es una tarea de gran importancia ya que nos permite usar el registro como lugar de almacenamiento para nuestros parámetros de configuración. Además, como se ha ido explicando a lo largo de este documento, necesitamos de consultas y modificaciones en el registro para conseguir ciertos de nuestros objetivos, como son el cambio de los parámetros de seguridad de Microsoft Internet Explorer o el averiguar si MSDE 2000 está instalado. Teniendo en cuenta que el registro de Windows almacena gran parte de la configuración de éste y que su más pequeña modificación puede ocasionar daños en el sistema, el diseño de estas funciones se ha realizado con sumo cuidado y testado en varias ocasiones para comprobar su correcto funcionamiento. El módulo consta de funciones, procedimientos, declaraciones de APIs y constantes globales necesarias para estas últimas. No se introdujeron variables globales en este módulo. En el anexo 9.1.2.2 se analizarán cada una de estas partes por separado, haciendo un estudio del código empleado para cada una de ellas. 77 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.2.3 Módulo EncrypFile. Una de las bases sobre la que desarrollar la aplicación de Instalación era la de confidencialidad. Debido a ella, el fichero de configuración de la base de datos a través del que ésta se construye se codifica y se ubica en el CD de instalación totalmente encriptado, de manera que sea totalmente ilegible. Es la propia aplicación de instalación la que regenera el fichero de la base datos, crea ésta y finalmente borra de nuevo el fichero. El modo en que se encripta el fichero no es tarea de esta aplicación, sino que se desarrolló de forma paralela a ésta en la Aplicación de Encriptación que se detallará posteriormente. En este módulo se engloban un procedimiento y una función que nos permitirán desencriptar los ficheros de la base de datos situados en el CD de instalación para así crear un fichero desencriptado con el que desarrollar la base de datos. El procedimiento desencripta el fichero que se le pasa por parámetro, para lo que hace uso de la función que desencripta el carácter que se le pasa. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.2.3. 6.1.2.4 Módulo Reboot. Este es un elaborado módulo donde se hace posible que el cliente pueda reiniciar su sistema a través de la aplicación. Para conseguirlo, la aplicación primero tendrá que conseguir los privilegios necesarios que le den autoridad suficiente para controlar tal evento. Para un mejor manejo de los privilegios y de los datos que se utilizan en el módulo se crean ciertas estructuras de datos. Para ello se usa el comando Type, que tiene funciones similares al comando struct en el lenguaje de programación C. 78 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY El módulo hace uso de algunas APIs para lograr su propósito, lo que conlleva el parejo uso de constantes globales que se declaran tras estas APIs. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.2.4. 6.1.2.5 Módulo SerialNumber. Las funciones y procedimientos englobados en este módulo se encargan de la autentificación del cliente. Para ello realiza la identificación del producto y hace que éste adquiera un código de producto único. El cliente deberá ponerse en contacto con Satcom y proporcionarle tal código, con el que Satcom averiguará el código de desbloqueo que proveerá al cliente. Con esto conseguimos que Satcom tenga un alto control sobre la distribución de Discovery. La aplicación de Instalación también necesita saber como conseguir este código de desbloqueo, ya que debe comparar el que introduce el usuario con el verdadero para decidir si le permite continuar con la aplicación o no. En caso de que el número de intentos exceda a 4, se le comunicará al cliente que se ponga en contacto con Satcom y se cerrará la aplicación de instalación. Para obtener un número único identificativo de la máquina del cliente sobre el que elaborar un código de producto utilizamos la API GetVolumeInformation que nos da el número de formato de la unidad de disco duro colocada como master. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.2.5. 79 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.1.2.6 Módulo VersionVerify. Para el correcto funcionamiento del entorno de trabajo Discovery es necesario la instalación de varios ficheros de librerías de extensión *.Dll y *.OCX. Pero esta instalación no debe hacerse sin antes comprobar que la versión que vamos a instalar no es más antigua que la que actualmente dispone el ordenador del cliente. Con este objetivo se crearon un conjunto de funciones y procedimientos que nos permite comprobar que los ficheros a instalar están más actualizados que los que ya existen. En caso contrario, o en el caso de que la versión coincida, los ficheros no se instalarán y se respetarán los que el usuario ya tenga instalados. La función principal que se encarga de estas tareas, CheckVersion, está situada en el módulo principal y por tanto ya ha sido explicada anteriormente. Pero esta función hace uso de otras funciones y procedimientos para conseguir su función. Estas son las funciones y procedimientos que están ubicadas en este módulo. Este módulo no engloba declaraciones de variables, constantes o APIs, sino que solamente contiene funciones y procedimientos. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.2.6. 6.1.2.7 Módulo de Clase IISVirtualDirectory. Gracias a este módulo de clase conseguimos crear un objeto nuevo que se ciñe a nuestras necesidades para configurar nuestra aplicación Web en un directorio virtual de Internet Information Server (IIS). 80 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Este nuevo objeto será llamado con el nombre del módulo de clase, es decir IISVirtualDirectory, y nos permitirá tratar con difíciles opciones de configuración del IIS a través de nuestra aplicación de instalación. El desarrollo de este módulo es anterior a la aplicación de instalación, y ya fue usado en un proyecto anterior de Satcom Technology. Aun así se necesita adecuarlo a la situación y necesidades de este proyecto. Por ello, fundamentalmente se debe prestar atención a la función Create, que es donde estos cambios tienen lugar. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.1.2.7, donde se indicarán los cambios acontecidos para adecuarlo a nuestros requisitos. 81 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.2 Aplicación de encriptación. Paralelamente a la aplicación de instalación, se deben desarrollar otras aplicaciones que nos permitan conseguir cumplir con requisitos tales como la confidencialidad y el control de la distribución del producto. Como ya se ha explicado, a la hora de crear el CD de instalación se introducirán en él los ficheros que nos permitan crear la base de datos en el equipo del cliente. Pero al ser ésta personalizada, se necesita de algún mecanismo de seguridad para evitar que alguien ajeno pueda hacerse con tal información. El método escogido fue el de introducir los ficheros de la base de datos de manera encriptada en el CD de instalación, de manera que la aplicación de instalación los desencriptará y los englobará en un único fichero de configuración que bien usando la herramienta isql ó osql (dependiendo si el cliente ha elegido SQL Server 2000 o MSDE2000 respectivamente) creará la base de datos. Pero para conseguirlo, primero se necesita de una aplicación de encriptación que nos permita encriptar los ficheros de la base de datos para colocarlos en el CD de instalación. Y éste es el cometido de esta aplicación. La aplicación está desarrollada en Visual Basic y consta de un formulario (frmEncryp) y de un módulo (EncrypModule). 6.2.1 Formulario frmEncryp. Este formulario nos sirve de interfaz de usuario para realizar la encriptación de los ficheros. 82 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 6.2.1. Formulario frmEncryp. Para usar correctamente el formulario, el cliente debe primero rellenar el text box antecedido por la palabra “File” con la ruta del fichero que quiere encriptar, tras lo que deberá indicar en el text box “Into” donde quiere colocar el fichero resultado de la encriptación. Una vez rellenados estos dos campos, ya se podrá realizar la encriptación pulsando sobre el botón “Encryp”. La encriptación finalizará cuando se nos muestre un mensaje por pantalla indicándolo. Adicionalmente se incluye la posibilidad de desencriptar el fichero recién encriptado rellenando la casilla “Unencryp into” con la ruta completa en la que queremos colocar el fichero resultado. Tras lo que no tendremos más que pulsar sobre el botón “Unencryp” y esperar a que se nos muestre un mensaje indicando que se ha realizado correctamente. En el gráfico anterior se muestra el formulario relleno con un ejemplo de utilización, donde si pulsamos sobre el botón “Encryp” se crearía el fichero FICHERO_ENCRIPTADO.enc a partir del fichero 83 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY FICHERO_BASE_DE_DATOS.sql y en la ruta indicada en el text box. Además si el usuario pulsará sobre el botón “Unencryp”, la aplicación desencriptaría el FICHERO_ENCRIPTADO.enc creando el fichero FICHERO_RECUPERADO.txt en la ruta especificada, o sea en C:\. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.2.1. 6.2.2 Módulo EncrypModule. Aquí es donde se sitúan las funciones empleadas por el formulario y que permiten hacer la encriptación y la desencriptación. Está compuesto por los dos procedimientos a los que llama el formulario, Enc_File y Unencryp_File a los que se les pasa por parámetro las rutas de los ficheros a encriptar/desencriptar y la ruta donde ubicar el fichero resultado; además de la clave para realizarla. Pero además, estos dos procedimientos Sub hacen uso de una función cada uno que les realizará la encriptación/desencriptación de los caracteres que se le pasen como parámetro. Estas funciones son la función Encrypter y la función Unencrypter. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.2.2. 84 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.3 Aplicación del Código de Desbloqueo. Una de los principales fundamentos de la aplicación de instalación es la necesidad de llevar un estricto control sobre los clientes que adquieren el producto Discovery. La solución que se llevo a cabo fue crear un sistema de código de producto y código de desbloqueo, de tal modo que sólo conociendo el código de desbloqueo asociado a su código de producto, el cliente podrá continuar con la Aplicación de Instalación. De esta manera conseguimos que sólo clientes autorizados por Satcom puedan hacer uso de la aplicación, pero al mismo tiempo esto nos permite llevar un control de los clientes que usan el producto, ya que estos necesitan ponerse en contacto con Satcom para obtener su código de desbloqueo. Esta es la aplicación que estaría en la oficina de Satcom, de tal manera que cuando un cliente llame y de su código de producto, con éste se generará su código de desbloqueo que le dará acceso a la aplicación de instalación. Para llevar a cabo tal código, la aplicación consta de un formulario y de un módulo. 6.3.1 Formulario frmProductKeyMaker. Consiste en el interfaz que le permite al personal de Satcom encontrar la clave de desbloqueo partiendo de un código de producto y de una clave de codificación. 85 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 6.3.1. Formulario frmProductKeyMaker. El usuario tan solo deberá rellenar el text box precedido por la palabra “Prekey” con el código del producto dado por el cliente y pulsar sobre el botón “Get the Product Key !!!!” tras lo que el código de desbloqueo aparecerá en el text box “Product Key”. El código de este formulario es sencillo y se basa en una llamada a una función del módulo de la aplicación que le devuelve el código de desbloqueo. El módulo en si no se diferencia del ya explicado en la Aplicación de Instalación en su módulo SerialNumber, módulo que ya se ha explicado y que por tanto no se va a volver analizar. Para un análisis más detallado se incluye el código debidamente comentado en el anexo 9.3.1. 86 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.4 Creación del CD de Instalación. Una cuestión importante de la Aplicación de Instalación es como organizar los ficheros y directorios necesarios para la aplicación en el CD de instalación. Se debe seguir una estructura simple, legible y coherente con lo que es la aplicación, ya que esta será la que se adentre en el CD para buscar los ficheros que necesite. Así pues ante cualquier cambio que se haga en el CD de instalación se deberá actualizar la aplicación ya que puede que sino ésta llegue a un error de localización. El contenido del CD de instalación debe ser como el de la siguiente figura, respetando siempre la nomenclatura usada. Figura 6.4. Estructura del CD de instalación. 87 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Donde los archivos sueltos son la aplicación de instalación en sí (setupproject.exe) y el fichero que contiene la información de la base de datos encriptado (encryp.enc). Este último fichero es previamente creado por la Aplicación de Encriptación ya que contiene configuraciones personalizadas para la empresa cliente en cuestión. Se especificará ahora el contenido de cada directorio. 6.4.1 Directorios y Subdirectorios. 6.4.1.1 Directorio Com. Este directorio contiene los componentes COM+, almacenados en dos ficheros satcom.msi y satcom.msi.cab, tal y como se generaron tras hacer una exportación de componentes desde la herramienta del sistema “Servicios de componentes”, como ya se explicó al principio del presente proyecto en el apartado 4.1. El aspecto de la carpeta es por tanto el siguiente: Figura 6.4.1.1. Estructura del directorio “com”. 88 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.4.1.2 Directorio DLL´s & OCX´s: Este directorio contiene las librerías Dll ó OCX necesarias para el correcto funcionamiento del entorno de trabajo Discovery y de la aplicación de Instalación. Para una mejor lectura, esta carpeta se ha divido en cuatro subdirectorios, donde se organizan los archivos DLL y OCX según su funcionalidad. Además, si en un futuro se necesitan instalar más librerías para una posible mejora de Discovery, tan solo bastaría con incluir dichos archivos en la subcarpeta correspondiente y la aplicación de instalación se encargaría de instalarlas y registrarlas en el equipo del cliente automáticamente. Este directorio tiene por tanto la siguiente estructura: Figura 6.4.1.2. Estructura del directorio “DLL´s & OCX´s”. Donde cada subcarpeta contiene: - ClientDll´s: contiene las librerías necesarias para la instalación en modo Cliente. - DLLNoVersion: esta subcarpeta contiene las librerías que no poseen número de versión alguno. Se agrupan en una carpeta aparte ya que no se puede ver si son más actuales que las que el cliente pueda tener 89 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY ya instaladas. Como son librerías creadas por Satcom, se instalarán siempre. - Installation OCX´s: contiene las librerías que nos permiten ejecutar la aplicación de instalación. En un principio el único fichero que contiene es el que nos permite introducir barras de progreso en la aplicación. Pero si en un futuro fuera necesario introducir más librerías tan solo habría que colocarlas en esta carpeta. - Server DLL´s: este subdirectorio contiene las librerías necesarias para la instalación en modo Servidor. 6.4.1.3 Directorio EXEFILES. Es donde se engloban todos los ficheros ejecutables utilizados. La aplicación de instalación se dirigirá a esta carpeta cada vez que quiera ejecutar o copiar alguno de ellos a la máquina del cliente. Figura 6.4.1.3. Estructura del directorio “EXEFILES”. 90 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.4.1.4 Directorio Icons. Es donde se encuentran los iconos utilizados por la aplicación de instalación. Actualmente tan solo se utiliza uno, por lo que sólo éste aparecerá en este directorio, pero si en un futuro se necesitan de más iconos habrá que situarlos en la misma carpeta. Figura 6.4.1.4. Estructura del directorio “Icons”. 6.4.1.5 Directorio IISFOLDER. Esta carpeta contiene una subcarpeta llamada Satcom con la aplicación Web en la que se basa el entorno de trabajo Discovery. Será la carpeta que se copiará en un directorio virtual de Internet Information Server (IIS). 6.4.1.6 Directorio MSDE. Este es el directorio donde se ubica MSDE2000, y a partir del que se instalará este software de libre distribución. Contendrá un fichero de instalación y un conjunto de ficheros y directorios que éste necesitará para su ejecución. Su estructura será la indicada en la siguiente figura. 91 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 6.4.1.6. Estructura del directorio “MSDE” 6.4.1.7 Directorio PJSoft License. A lo largo de la instalación en modo Cliente, se instala un componente de mapeo (InfoMap Components EN 3.0) que necesita que se manejen unos ficheros de licencia de manera correcta para que el software funcione. Esta carpeta contiene dichos ficheros de licencia. Figura 6.4.1.7. Estructura del directorio “PJSoft License”. 92 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 6.4.1.8 Directorio SATCOMADDONS. Esta carpeta contiene los ficheros que son añadidos al fichero Encryp.enc para crear la base de datos. Por lo general se trata de funciones añadidas y actualizadas a la medida del cliente, así, de esta manera, conseguimos que para actualizar la base de datos tan sólo tengamos que añadir en esta carpeta el fichero actualizado. Todos los ficheros que estén en esta carpeta están encriptados por la Aplicación de Encriptación y será la Aplicación de Instalación la que los desencriptará mientras se ejecuta, instalando la base de datos. Actualmente toda esta información adicional se ha englobado en un único fichero “totalfile.enc”, pero podría añadirse a modo de diferentes ficheros. En este caso la aplicación reuniría la información procedente de ellos y los englobaría automáticamente. Por lo tanto si se quiere actualizar la base de datos con nuevos procedimientos y funciones, tan solo hay que encriptar el/los fichero/s que las declare utilizando la aplicación de encriptación y luego colocar dicho/s fichero/s en esta carpeta. El aspecto actual de este directorio es el siguiente: Figura 6.4.1.8. Estructura del directorio “SATCOMADDONS”. 93 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 7. Instrucciones Post-Instalación. Satcom Discovery es una compleja combinación de aplicaciones diseñadas y desarrolladas para obtener el mejor rendimiento del equipo del usuario. Proveyendo al cliente de una potente herramienta de seguimiento basada en una base de datos hecha a medida. Una vez que la Aplicación de Instalación ha realizado su cometido, el cliente debe realizar una pequeña configuración para adecuar el entorno de trabajo Discovery a su ordenador. Consiste en poner a punto los programas que la Aplicación de Instalación ha instalado. Para una mejor comprensión se estudiarán estos cambios uno por uno en función de la aplicación en cuestión, ya que debido a la naturaleza distribuida de Discovery, cada computador deberá configurar lógicamente sólo los programas que haya instalado. 7.1 SQL Server o MSDE 2000. Para poder poner en funcionamiento la base de datos, primero hay que iniciar el servicio SQL Server Service Manager. Para lo que solamente hay que cliquear sobre su icono situado en la esquina inferior derecha de la pantalla al lado del reloj de sistema. Una vez abierto, se selecciona SQL Server de la lista llamada “Services” y se activa la casilla de “Auto-Start service when OS starts”. Entonces se debe seleccionar el nombre del servidor del desplegable y pulsar sobre el botón de “start” que iniciará el motor de la base de datos. Al final, el servicio SQL Server Service Manager queda de la siguiente manera: 94 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 7.1. Puesta a punto del servicio SQL Server Service Manager. Ahora, se selecciona SQL Server Agent, se realizan los mismos cambios y ya estaría configurado. 7.2 Satcom Configuration. La aplicación de configuración es una herramienta creada para configurar correctamente el enlace con la base de datos y sus DLL. Una vez que la aplicación de Instalación ha finalizado, aparecerá en el escritorio del cliente esta aplicación. El cliente debe pulsar sobre su icono e introducir el nombre del servidor de la base de datos, tras lo que debe pulsar sobre el botón “test”. Tal y como aparece e la siguiente figura. 95 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 7.2. Puesta a punto de la aplicación de configuración Satcom Configuration. Tras lo que aparecerá un mensaje de aprobación y se deberá pulsar sobre el botón “Apply”. 7.3 Satcom Trakm8 FTP Client. En el caso de que se haya instalado esta aplicación, se deberá configurarla para todas las unidades disponibles. Esta aplicación aparecerá cada vez que se inicie el sistema, ya que se ha instalado con ese propósito. Una vez iniciada, se debe pulsar sobre el botón “File” y luego sobre la opción “Unit Type”. Y en la ventana que aparece se deben seleccionar todas las unidades que aparezcan y luego pulsar sobre el botón “Save” para que todo quede configurado permanentemente. Gráficamente la secuencia de acciones a realizar es la siguiente: 96 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Primero se seleccionan las unidades pulsando sobre el botón “Unit Type”. Figura 7.3.a. Puesta a punto de la aplicación TrakM8 2 FTP Client, Se seleccionan todas las unidades. Figura 7.3.b. Ventana de selección de unidades. Se salvan los cambios. Figura 7.3.c. Ventana para salvar la configuración. Y eso es todo. 97 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 7.4 Satcom GPRS. Si se ha instalado Satcom GPRS, esta aplicación aparecerá automáticamente siempre que se inicie el sistema. La primera vez que esto ocurra, se le preguntará al cliente por su nombre de usuario y contraseña, que será proporcionada por Satcom. Figura 7.4.a. Ventana de información de usuario. Tras introducir estos datos, el cliente debe pulsar sobre el menú “File” y después sobre “Save” para que se almacene. Después de esto se iniciará la aplicación, y tal y como hicimos con la aplicación anterior debemos configurarla para que atienda a todo los tipos de unidades que aparezcan. Gráficamente se realizaría del siguiente modo: Se selecciona la opción tipo de unidad, Figura 7.4.b. Visión del menú contextual para seleccionar los tipos de unidades. y se seleccionan todas, como en la siguiente figura. 98 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 7.4.c. Ventana de selección de unidades. Y finalmente se guardan los cambios. Figura 7.4.d. Ventana para almacenar los cambios. 7.5 Satcom Wavecom Modem. Por último, el cliente deberá actualizar esta aplicación para que considere todos los vehículos. Para ello una vez que Satcom Wavecom Modem se inicie, se debe pulsar sobre el menú ”File” y luego seleccionar la opción “UnitType”. Figura 7.5.a. Visión del menú contextual que lleva a la selección de unidades. Tras lo que se deberán seleccionar todas las unidades que aparezcan. 99 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Figura 7.5.b. Ventana de selección de unidades. Y finalmente salvar los cambios. Figura 7.5.c. Tras pulsar sobre “Apply” quedarán salvados los cambios. Y esto es todo. 100 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 8. Conclusiones. El entorno de trabajo Discovery implementa un complejo sistema de seguimiento y alarmas que le permite al usuario tener un estricto control y conocimiento de su flota de vehículos a tiempo real. Se trata de un sistema distribuido que engloba componentes como son la base de datos, los componentes COM+, una aplicación Web desarrollada con ASP y demás herramientas que nos permiten comunicarnos con la flota de vehículos bien por GSM o por GPRS. Todos estos aspectos se tuvieron que tener muy en cuenta a la hora de desarrollar la Aplicación de Instalación, y son los responsables de su gran complejidad. Dificultad a la que habría que añadir el que se realizó en Irlanda y por tanto utilizando una lengua extranjera. Antes que nada es importante recalcar que éste no es un proyecto teórico, sino que se trata de un proyecto sugerido por la empresa para solventar un importante problema que ésta estaba sufriendo, y como tal se está utilizando actualmente. Por tanto antes de sacarlo al mercado tuvo que pasar un período de testeo, período que superó satisfactoriamente. De los aspectos que más me han interesado han sido los referentes a la encriptación de la información, para lo que tuve que diseñar un completo sistema de encriptado que fuera lo suficientemente complejo para evitar cualquier lectura o apropio ajeno de la información. Además del sistema creado para controlar la distribución del producto, que utilizando códigos de producto y de desbloqueo, consigue además un estricto control de los clientes que se hacen con Discovery y de las máquinas en las que lo instalaban. Estas tareas me llevaron la mayor parte del tiempo de desarrollo de la aplicación, tiempo más que fundamentado, ya que tal y como he ido nombrando a lo largo del proyecto, uno de los aspectos más importantes de Satcom Technology es la seguridad. 101 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY Otra de las ventajas de este proyecto habría que enfocarla en el plano personal, ya que comprende muchos de las materias estudiadas en la carrera, desde el uso de modems GSM/GPRS para comunicarnos con los vehículos, hasta el conocimiento de lenguajes de programación y de sistemas operativos. Además de haber aprendido a programar profesionalmente en un lenguaje como Visual Basic tan extendido hoy en día y el saber desenvolverse trabajando en el seno de una empresa de telecomunicaciones. Para concluir, la Aplicación de Instalación del Entorno de Trabajo Discovery está siendo ya utilizada comercialmente, y por tanto su funcionamiento está más que comprobado. Aun así, se trata de la primera versión que se realiza y por tanto se puede mejorar en algunos aspectos. Como recomendación de mejora yo incluiría que sea compatible no sólo con sistemas operativos Windows, sino con otros como Unix, Linux,etc. Aunque para ello habría que rediseñar primero Discovery para que pudiera funcionar en estas plataformas. 102 APLICACIÓN DE INSTALACIÓN DEL ENTORNO DE TRABAJO DISCOVERY 9. Anexos. 103 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN 9.1 Código de la Aplicación de Instalación. En este anexo se incluirá todo el código desarrollado en la Aplicación de Instalación del Entorno de Trabajo Discovery, tanto el contenido de los formularios como el de los diferentes módulos. Este código esta debidamente comentado para que su lectura y su seguimiento pueda ser entendida sin mucha dificultad. Para lo que los comentarios se han introducido siguiendo la nomenclatura particular de Visual Basic. Esto es, se considera un comentario todo aquello que vaya precedido en su línea por el carácter “ ‘ “. Aun así, para que no haya posibilidad de confusión, los comentarios aparecerán con letra cursiva. En total, la aplicación está distribuida en 18 formularios y 7 módulos, cada uno de los cuales serán explicados a nivel de código en este anexo. 9.1.1 Formularios. 9.1.1.1 frmSetUp. ‘ Este procedimiento Sub gestiona que se habilite el botón “Install” Private Sub CmbMainSelection_click() If CmbMainSelection.Text = "Server Installation" Or CmbMainSelection.Text = "Client Installation" Then cmdInstall.Enabled = True Else cmdInstall.Enabled = False End If End Sub ‘ Este procedimiento Sub controla que se seleccione una de las dos ‘ posibilidades, sino muestra un mensaje de error. Cuando es correcta 104 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ la elección, se cierra el actual formulario, se guarda la opción ‘ elegida en la variable global strWhoCall, y se carga el siguiente ‘ formulario (frmLicense). Private Sub cmdInstall_Click() If CmbMainSelection.Text = "" Or CmbMainSelection.Text = "Choose an installation mode" Then MsgBox "Please select an item before", vbExclamation, "Error" ElseIf CmbMainSelection.Text = "Server Installation" Then Unload frmSetUp strWhoCall = "Server" Load frmLicense frmLicense.Show ElseIf CmbMainSelection.Text = "Client Installation" Then Unload frmSetUp strWhoCall = "Client" Load frmLicense frmLicense.Show End If End Sub ‘ El siguiente procedimiento Sub cierra la aplicación cuando el ‘ cliente pulsa sobre el botón “Quit”. Para ello simplemente descarga ‘ el actual formulario, ya que éste es el único que está actualmente ‘ cargado. Private Sub CmdQuit_Click() Unload frmSetUp End Sub ‘ Este procedimiento Sub se ejecuta al cargarse el formulario, es ‘ decir al principio de la aplicación. Hace uso de la función ‘ GetWindowsDirectory para obtener la ruta del directorio de Windows, ‘ y posteriormente el disco donde éste está localizado. Ésta función ‘ está ubicada en el módulo principal de la aplicación y por tanto se ‘ explicará más adelante cuando se analice dicho módulo. ‘ La ruta del directorio de Windows se guardará en la variable global ‘ strWindowsFolder, y la unidad correspondiente en strMasterDrive. ‘ También almacena en la variable global strINSTALLPATH la ruta desde ‘ donde se está ejecutando la aplicación. Private Sub Form_Load() strWindowsFolder = GetWindowsDirectory() 105 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN strMasterDrive = Left(strWindowsFolder, 2) ‘ La siguiente línea guarda en strINSTALLPATH la ruta donde se ‘ estará ejecutando la aplicación, es decir donde esté situado el ‘ ejecutable de la aplicación (por lo general en el CD de ‘ instalación y por tanto la ruta = D:). strINSTALLPATH = app.path End Sub 9.1.1.2 frmLicense. ‘ Los siguiente dos procedimientos Sub habilitan el botón “NEXT” sólo ‘ cuando la casilla de aceptar la licencia (“I agree”) está activada. Private Sub Check_agree_Click() If Check_agree.Value = 1 Then Cmd_NextButton.Enabled = True If Check_agree.Value = 0 Then Cmd_NextButton.Enabled = False End Sub Private Sub Check_Disagree_Click() If Check_Disagree.Value = 1 Then Cmd_NextButton.Enabled = True If Check_Disagree.Value = 0 Then Cmd_NextButton.Enabled = False End Sub ‘ Este procedimiento Sub gestiona la funcionalidad del botón “Back”, ‘ que dirigiría al usuario de nuevo al formulario anterior (frmSetUp). ‘ Para ello descarga el formulario actual, carga el frmSetUp y lo hace ‘ aparecer en pantalla. Private Sub Cmd_BackButton_Click() Unload frmLicense Load frmSetUp frmSetUp.Show End Sub ‘ El siguiente código desarrolla todo la actividad antes mencionada, ‘ primero crea una instancia a un objeto tipo FileSystemObject, que ‘ permite realizar operaciones típicas de manejo de ficheros y ‘ directorios. Hace un segundo chequeo de que el cliente ha accedido a ‘ la instalación e instala el fichero OCX haciendo uso de un 106 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ procedimiento Sub (InstallSetUPOCX) definido en el módulo principal ‘ de la aplicación y que por tanto será explicado posteriormente. Private Sub Cmd_NextButton_Click() Dim lngAux As Long Dim objF As FileSystemObject Set objF = New FileSystemObject Dim ret If Check_Disagree.Value = 0 Then ‘ Llama al procedimiento Sub para instalar y registrar el fichero ‘ OCX InstallSetUPOCX ‘ Ahora crea el directorio “Satcom Discovery” en el directorio ‘ “Archivos de Programas”, siempre y cuando no esté creado ya. If Not (objF.FolderExists(strMasterDrive & "\Program Files\Satcom Discovery")) Then objF.CreateFolder strMasterDrive & "\Program Files\Satcom Discovery" End If ‘ Ahora crea la clave en el registro de Windows donde se guardará ‘ cierta información relevante para el desarrollo de la ‘ aplicación. Para ello utiliza la API RegCreateKey que se ‘ declarará posteriormente en el módulo. lngAux = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Satcom", ret) RegCloseKey (ret) ‘ Finalmente descarga el actual formulario y pasa al siguiente ‘(frmProductKey) Unload frmLicense Load frmProductKey frmProductKey.Show ‘ Por último si el cliente no está de acuerdo con la licencia, la ‘ aplicación termina aquí. ElseIf Check_Disagree.Value = 1 Then Unload frmLicense End If End Sub 107 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Este último procedimiento Sub termina la aplicación si el cliente ‘ pulsa sobre el botón “Quit SetUP Wizard” Private Sub Cmd_quitButton_Click() Unload frmLicense End Sub 9.1.1.3 frmProductKey. ‘ Incluimos esta cláusula al comienzo del código para especificar ‘ que imponemos ‘ quiere decir una que declaración para evitar explícita de problemas al las variables. equivocarse Esto con el ‘ nombre de las variables y que Visual Basic las identifique como ‘ variables nuevas y las declare automáticamente, con esta cláusula ‘ cada vez que Visual Basic detecte un nombre de variable sin ‘ declarar nos mostrará un mensaje de error. Option Explicit ‘ Este procedimiento Sub nos permite copiar en el portapapeles el ‘ código del producto. Private Sub cmdCopy_Click() Clipboard.Clear Clipboard.SetText (lblProductPreKey.Caption) End Sub ‘ El siguiente procedimiento Sub engloba casi toda la funcionalidad de ‘ este formulario. Se trata del código que se ejecuta una vez que el ‘ cliente pulsa sobre el botón “Next”. Private Sub cmdNextButton_Click() ‘ Primero, compara el código de desbloqueo introducido por el ‘ usuario con el correcto, el cual lo crea la función GetProductKey ‘ que está definida en el módulo SerialNumber y por tanto será ‘ descrita posteriormente. Cuando el código es incorrecto aparece ‘ un mensaje de error y se permite al usuario volver a intentarlo ‘ tres veces más, tras las cuales se le comunica que contacte con ‘ Satcom para un código válido y se cierra la aplicación. If txtProductKey.Text <> GetProductKey(lblProductPreKey.Caption, strSatcomKey) Then 108 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN MsgBox "Incorrect Unlock Key ", vbExclamation, "Error" intCounter = intCounter + 1 If intCounter = 4 Then MsgBox "Please contact Satcom for a valid Unlock Key", vbCritical, "Error" Unload Me End If ‘ Una vez que el código de desbloqueo es el correcto proseguimos ‘ con la aplicación. Almacenamos el valor del código de producto y ‘ el del código de desbloqueo en dos variables globales llamadas ‘ strProductserialNumber y strUnlockKey respectivamente. Else strProductSerialNumber = Me.lblProductPreKey.Caption strUnlockKey = Me.txtProductKey.Text ‘ A continuación se crea un valor en el registro de Windows donde ‘ se almacenará el código de desbloqueo, de manera que si el ‘ usuario quiere volver a instalar Discovery o simplemente quiere ‘ pasar a la instalación en modo Cliente, el código de desbloqueo ‘ le aparecerá automáticamente. Para ello utiliza el ‘ procedimiento Sub SetRegistryStringValue definido en el módulo ‘ EditRegistry que se explicará más adelante. SetRegistryStringValue "Unlock Key", strUnlockKey ‘ Ahora en función de el modo de instalación que seleccionó el ‘ cliente, se continiará con un formulario u otro. If strWhoCall = "Server" Then Unload Me Load frmSelection frmSelection.Show ElseIf strWhoCall = "Client" Then Unload Me Load frmClientInstallation frmClientInstallation.Show End If End If End Sub 109 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ El procedimiento que sigue se ejecuta al cargar el formulario y por ‘ tanto antes de que éste se muestre en pantalla. Efectúa un chequeo ‘ previo de que el código del producto se ha creado correctamente (en ‘ caso contrario sería igual a 0) y lo copia en el espacio reservado ‘ para tal información en el formulario. Después busca en el registro ‘ si ya se ha escrito el código de desbloqueo previamente, y en caso ‘ afirmativo lo copia en el text box adecuado del formulario. Para ‘ ello utiliza funciones como GetPreKey (definida en el módulo ‘ SerialNumber) y RegCheckValueExists y RegReadstringvalue (definidas ‘ en el módulo EditRegistry) y que por tanto serán analizadas ‘ posteriormente. Private Sub Form_Load() Dim strTestPrekey As String strTestPrekey = GetPreKey(strMasterDrive & "\") If strTestPrekey = "0" Then MsgBox "Prekey Error , please contact Satcom", vbCritical, "Error" Unload Me End If lblProductPreKey.Caption = strTestPrekey If RegCheckValueExists("Unlock Key") Then txtProductKey.Text = RegReadStringValue("Unlock Key") End Sub 9.1.1.4 frmSelection (Instalación modo Servidor). ‘ Especificamos declaración explícita de las variables. Option Explicit ‘ Este procedimiento Sub se ejecuta cuando pulsamos sobre el botón ‘ “Communications”, primero deshabilita el formulario mientras instala ‘ los archivos DLL y OCX necesarios usando el procedimiento InstallDLL ‘ que se describirá más adelante cuando se vea el módulo principal. Y ‘ finalmente carga el formulario frmExeFiles donde los archivos de ‘ comunicación serán instalados. Private Sub cmdCommunications_Click() Me.Enabled = False 110 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN InstallDLL Me.Enabled = True ‘ Como ya se han instalado los DLL y OCX, cambiamos boAnyInstalled ‘ a true. boAnyInstalled = True Unload Me Load frmExeFiles frmExeFiles.Show End Sub ‘ ‘ El siguiente encaminando la procedimiento aplicación Sub hacia gestiona un el formulario botón final “Finish”, u otro en ‘ función de si se ha instalado algo o no, información que es dada por ‘ la variable boAnyInstalled. Private Sub cmdFinishButton_Click() If boAnyInstalled = True Then Unload Me Load frmFinish frmFinish.Show Else Unload Me Load frmFinishWithoutInstall frmFinishWithoutInstall.Show End If End Sub ‘ Este procedimiento Sub simplemente carga el formulario frmIdentity, ‘ donde se instalará y configurará la aplicación COM+. Private Sub CmdInstallComPlus_Click() Unload Me Load frmIdentity frmIdentity.Show End Sub ‘ Este procedimiento Sub simplemente carga el formulario ‘ frmDatabaseSelection, donde se procederá a la instalación de la base ‘ de datos. Private Sub cmdInstallDatabase_Click() Unload Me Load frmDatabaseSelection 111 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN frmDatabaseSelection.Show End Sub ‘ Con el siguiente código se instala el directorio virtual y se ‘ configura la herramienta de Servicios de Internet Information Server. Private Sub cmdInstallIIS_Click() ‘ Deshabilita el formulario, cambia el puntero del ratón, cambia el ‘ tamaño del formulario para que aparezca la barra de progreso, y ‘ configura los límites de esta barra de progreso. Me.Enabled = False Me.MousePointer = 11 Me.Height = 8100 ProgressBar.Min = 0 ProgressBar.Max = 5 ProgressBar.Value = 0 ‘ Crea una instancia a un objeto tipo FileSystemObject para tratar ‘ con las funciones típicas del manejo de ficheros y directorios. Dim objF As FileSystemObject Set objF = New FileSystemObject ‘ Chequea si ya había un directorio llamado Satcom en el directorio ‘ principal de IIS, y si así es lo borra. If objF.FolderExists(strMasterDrive & "\inetpub\wwwroot\Satcom") Then objF.DeleteFolder strMasterDrive & "\inetpub\wwwroot\Satcom", True End If ProgressBar.Value = ProgressBar.Value + 1 ‘ Copia la aplicación ASP contenida en el directorio Satcom en el ‘ directorio principal de IIS. objF.CopyFolder strINSTALLPATH & "\IISFOLDER\Satcom", strMasterDrive & "\inetpub\wwwroot\Satcom", True ProgressBar.Value = ProgressBar.Value + 1 ‘ Ahora, haciendo uso del módulo de clase IISVirtualDirectory, se ‘ crea y configura el directorio virtual en la herramienta 112 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Servicios de Internet Information Server. Este módulo de clase ‘ será explicado posteriormente. Dim oIIS As IISVirtualDirectory Set oIIS = New IISVirtualDirectory With oIIS ‘ Ubica físicamente el directorio virtual. .PhysicalDirectoryName = strMasterDrive & “\inetpub\wwwroot\Satcom" ‘ Ahora pone el nombre del directorio virtual (SATCOM) .VirtualDirectoryName = "SATCOM" ‘ Ahora crea el directorio virtual, en caso de error mostraría un ‘ mensaje de error e iría hacia la salida de error declarada al ‘ final del procedimiento. If .Create() Then ' MsgBox "Created" Else MsgBox .LastError GoTo errorexit End If End With ProgressBar.Value = ProgressBar.Value + 1 ‘ Libera la instancia. Set oIIS = Nothing ‘ Almacena en la clave de Satcom en el registro de Windows un valor ‘ llamado “IIS” que valdrá 1 cuando el directorio virtual esté ‘ instalado. Además activa la variable boAnyInstalled, habilita de ‘ nuevo el formulario y normaliza su tamaño y el puntero del ratón. SetRegistryValue "IIS", 1 boAnyInstalled = True Me.Enabled = True ProgressBar.Value = 5 Me.Height = 7320 Me.MousePointer = 0 Unload Me Load frmSelection 113 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN frmSelection.Show Exit Sub ‘ En caso de que haya habido un error a la hora de crear el directorio ‘ vitual, se mostraría un mensaje de error que ya se escribió antes y ‘ se dejaría al usuario en el mismo formulario por si quiere intentar ‘ instalar otro componente de la aplicación. errorexit: If Err.Number <> 0 Then Me.Enabled = True Me.Height = 7320 Me.MousePointer = 0 Exit Sub End If End Sub ‘ Este es el procedimiento que se ejecuta al cargar este formulario. ‘ En él se lee el registro de Windows en la clave de Satcom a la ‘ búsqueda de entradas que nos indiquen que componentes hay ya ‘ instalados. Para ello hace uso de la función ReadRegistryValue que ‘ se explicará posteriormente en el módulo EditRegistry. Private Sub Form_Load() If ReadRegistryValue("IIS") = 1 Then boIISFOLDERINSTALLED = True If ReadRegistryValue("Database") = 1 Then boDATABASEINSTALLED = True If ReadRegistryValue("COM+") = 1 Then boCOMPLUSINSTALLED = True Me.Label_IISInstalled.Visible = boIISFOLDERINSTALLED Me.Label_DatabaseInstalled.Visible = boDATABASEINSTALLED Me.Label_ComInstalled.Visible = boCOMPLUSINSTALLED End Sub 9.1.1.5 frmIdentity (Instalación modo Servidor). ‘ Este procedimiento Sub gestiona el botón “Back” y simplemente vuelve ‘ hacia el formulario de selección(frmSelection). Private Sub cmdBackButton_Click() Unload frmIdentity 114 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Load frmSelection frmSelection.Show End Sub ‘ Con el siguiente código desarrollamos las acciones deseadas al ‘ pulsar sobre el botón “Next”. Osea, instalamos la aplicación COM+ ‘ bajo el usuario especificado por el cliente. Private Sub cmdInstallButton_Click() ‘ Especificamos que si ocurre un error pase a la siguiente línea. On Error Resume Next ‘ Deshabilitamos el formulario durante la instalación, cambiamos el ‘ puntero del ratón al típico reloj de arena y configuramos la ‘ barra de progreso. Me.Enabled = False Me.MousePointer = 11 ProgressBar.Min = 0 ProgressBar.Max = 5 ProgressBar.Value = 0 ‘ Se declara una instancia a un objeto FileSystemmObject para ‘ tratar con las funciones típicas para el manejo de archivos y ‘ directorios. Tras lo que se verifica si el password y la ‘ confirmación de password coinciden. En el caso de que el cliente ‘ haya elegido la opción de ejecutar la aplicación bajo el usuario ‘ de la actual sesión, tanto el password como su confirmación ‘ estarían en blanco y por tanto coincidirían. Una vez chequeado ‘ que no hay error se prosigue con la instalación. Dim objAux As FileSystemObject Set objAux = New FileSystemObject ‘ Se crea el nombre completo del dominio. Dim strDomainPath As String strDomainPath = Me.Domain_text.Text & "\" & Me.User_text.Text If Password_text.Text <> Confirm_text.Text Then MsgBox "Password and confirm do not match." Me.Enabled = True Me.MousePointer = 0 Else 115 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Aumentemos el tamaño del formulario para que se aprecie la ‘ barra de progreso. Me.Height = 8100 ProgressBar.Value = ProgressBar.Value + 1 ‘ Ahora se procede a instalar y registrar el archivo DLL donde ‘ están contenidos los componentes COM+ que queremos instalar, en ‘ nuestro caso el archivo SatData.dll. Para ello se hace uso del ‘ procedimiento InstallOneDll que se explicará cuando se analice ‘ el módulo principal. InstallOneDll strINSTALLPATH & "\DLL's & OCX's\Server DLL's\SatData.dll" ‘ Ahora continuamos instalando la aplicación COM+, primero vemos ‘ si ya existe, en cuyo caso la borramos para crear una nueva. ‘ Para ello se utiliza la función ApplicationExist que nos ‘ devuelve TRUE si ya existe y que se explicará más adelante con ‘ el módulo principal. Dim catalog As COMAdmin.COMAdminCatalog Set catalog = New COMAdmin.COMAdminCatalog If (ApplicationExists("satcom") = True) Then DeleteApplication ("satcom") End If ‘ Ahora empezamos analizando el caso en que el cliente ha elegido ‘ la segunda opción, es decir la de identificar a otro usuario. If Option2.Value = True Then If Me.Domain_text.Text = "" Then strDomainPath = Me.User_text.Text ‘ Instala la aplicación utilizando el password dado y el ‘ nombre/dominio. Para ello instala el fichero satcom.msi ‘ creado para tal fin. catalog.InstallApplication strINSTALLPATH & "\com\satcom.msi", , , strDomainPath, Password_text.Text ‘ En caso de error muestra un mensaje en pantalla y reinicia el ‘ formulario, para que el cliente pueda intentarlo de nuevo. 116 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN If Err <> 0 Then MsgBox "User or/and Password incorrect", vbCritical, "ERROR" Me.Height = 7320 Unload Me Load frmIdentity frmIdentity.Show ‘ Si no ha habido error se continua con la instalación de los ‘ componentes. Else ProgressBar.Value = ProgressBar.Value + 1 Me.MousePointer = 11 Call catalog.InstallComponent("satcom", strWindowsFolder & "\Satdata.dll", "", "") ‘ Se chequea que no haya habido errores, en tal caso se ‘ muestra un mensaje en pantalla y se vuelve a iniciar el ‘ formulario. If Err <> 0 Then MsgBox "Install Component Error", vbCritical, "ERROR" Me.Height = 7320 Unload Me Load frmIdentity frmIdentity.Show End If ‘ Ahora se instala el archivo VBRun60sp4.exe en modo ‘ silencioso, para lo que se usa la función ShellandWait ‘ descrita en el módulo principal y que por tanto veremos ‘ posteriormente. Básicamente lo que hace esta función es ‘ ejecutar el archivo dado y no continuar con el código de ‘ nuestra aplicación hasta que haya la ejecución haya acabado. ShellandWait (strINSTALLPATH & "\EXEFILES\VBRun60sp4.exe /Q") ProgressBar.Value = ProgressBar.Value + 1 ‘ Ahora instala del mismo modo el fichero MDAC_TYP27.exe, ‘ pero como este fichero no permite una instalación ‘ silenciosa, se le informa al usuario de su instalación. MsgBox "Now it will install the Microsoft Data Access Components 2.7 , please follow the instructions and do not 117 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN restart your system at the end", vbInformation, "Microsoft Data Components 2.7" ShellandWait (strINSTALLPATH & "\EXEFILES\MDAC_TYP27.exe /Q") ProgressBar.Value = ProgressBar.Value + 1 ‘ Como es muy probable que el cliente disponga de una red de ‘ ordenadores y haya optado por una instalación distribuida, ‘ deberá instalar el fichero de configuración también en la ‘ máquina donde instale la aplicación COM+. Por eso ‘ utilizamos el siguiente código para copiar dicho fichero en ‘ la carpeta Satcom Discovery y crearle un acceso directo en ‘ el directorio escritorio, para que así sea fácilmente ‘ accesible. If objAux.FileExists(strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe") Then objAux.DeleteFile strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe", True objAux.CopyFile strINSTALLPATH & "\EXEFILES\SatcomConfiguration.exe", strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe", True ‘ Para crear el acceso directo se utiliza la función ‘ CreateShortCut definida en el módulo principal y que por ‘ tanto será descrita posteriormente. CreateShortCut strMasterDrive & "\Documents and Settings\All Users\escritorio\SatcomConfiguration.lnk", strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe", strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe" ‘ Ahora se almacena un valor tipo string en el registro de ‘ Windows con los datos de usuario y dominio seleccionados ‘ para así rellenar estos campos automáticamente en futuras ‘ reinstalaciones. SetRegistryStringValue "COM+ User", User_text.Text If Domain_text.Text <> "" Then SetRegistryStringValue "COM+ Domain", Domain_text.Text 118 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN End If ‘ Ahora programamos el caso en el que el cliente elige instalar ‘ la aplicación COM+ bajo el usuario que haya iniciado la sesión. ElseIf Option1.Value = True Then ‘ Se instala la aplicación usando el fichero satcom.MSI catalog.InstallApplication strINSTALLPATH & "\com\satcom.MSI" ‘ Se chequea si ha habido algún error, sino se continua If Err <> 0 Then MsgBox "Install Application Error", vbCritical, "ERROR" Me.Height = 7320 Unload Me Load frmIdentity frmIdentity.Show Else ProgressBar.Value = ProgressBar.Value + 1 Me.MousePointer = 11 ‘ Se instalan los componentes contenidos en el fichero ‘ Satdata.dll y de nuevo se chequea si ha habido error. Call catalog.InstallComponent("satcom", strWindowsFolder & "\Satdata.dll", "", "") If Err <> 0 Then MsgBox "Install Component Error", vbCritical, "ERROR" Me.Height = 7320 Unload Me Load frmIdentity frmIdentity.Show End If ‘ Ahora se instala el archivo VBRun60sp4.exe en modo ‘ silencioso, para lo que se usa la función ShellandWait ‘ descrita en el módulo principal y que por tanto veremos ‘ posteriormente. Básicamente lo que hace esta función es ‘ ejecutar el archivo dado y no continuar con el código de ‘ nuestra aplicación hasta que haya la ejecución haya ‘ acabado. ShellandWait (strINSTALLPATH & "\EXEFILES\VBRun60sp4.exe /Q") 119 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ProgressBar.Value = ProgressBar.Value + 1 ‘ Ahora instala del mismo modo el fichero MDAC_TYP27.exe, ‘ pero como este fichero no permite una instalación ‘ silenciosa, se le informa al usuario de su instalación. MsgBox "Now it will install the Microsoft Data Access Components 2.7 , please follow the instructions and do not restart your system at the end", vbInformation, "Microsoft Data Components 2.7" ShellandWait (strINSTALLPATH & "\EXEFILES\MDAC_TYP27.exe /Q") ProgressBar.Value = ProgressBar.Value + 1 ‘ Se copia el fichero de configuración ‘ SatcomConfiguration.exe en la carpeta Satcom Discovery y ‘ se crea un acceso directo en el escritorio. If objAux.FileExists(strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe") Then objAux.DeleteFile strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe", True objAux.CopyFile strINSTALLPATH & "\EXEFILES\SatcomConfiguration.exe", strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe", True CreateShortCut strMasterDrive & "\Documents and Settings\All Users\escritorio\SatcomConfiguration.lnk", strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe", strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe" End If End If ‘ Ahora se finaliza el procedimiento Sub, liberando la ‘ instancia catalog, chequeando que no ha habido errores, ‘ volviendo el formulario a su tamaño natural, guardando en el 120 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ registro de Windows el valor “COM+” y dándole un valor ‘ para indicar que ya se ha instalado, = 1 activando la variable ‘ boAnyInstalled a verdadero, y volviendo al formulario ‘ anterior (frmselection), donde ahora aparecerá ya la etiqueta ‘ al lado del botón de COM+ Application diciendo que se ha ‘ instalado. Set catalog = Nothing ProgressBar.Value = 5 If Err <> 0 Then Me.Height = 7320 Unload Me Load frmIdentity frmIdentity.Show Else Me.Enabled = True Me.Height = 7320 Unload Me SetRegistryValue "COM+", 1 boAnyInstalled = True Load frmSelection frmSelection.Show End If End If Exit Sub End Sub ‘ El siguiente es el procedimiento Sub que se ejecuta al cargar el ‘ formulario, lo que hace es mirar en el registro de Windows por si ya ‘ hubiera una instalación anterior del tipo “especificar un usuario”, ‘ en tal caso selecciona dicha opción por defecto y rellena los text ‘ boxes adecuados con la información almacenada en el registro. Para ‘ eso utiliza las funciones RegCheckValueExists y RegReadStringValue ‘ ambas definidas en el módulo EditRegistry y que por tanto se ‘ explicarán más adelante. Private Sub Form_Load() If RegCheckValueExists("COM+ User") Then Option2.Value = True 121 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN User_text.Text = RegReadStringValue("COM+ User") If RegCheckValueExists("COM+ Domain") Then Domain_text.Text = RegReadStringValue("COM+ Domain") Else ‘ En caso contrario selecciona la opción primera por defecto. Option1.Value = True End If End Sub ‘ Los siguientes dos procedimientos Sub gestionan que se deshabiliten ‘ los text boxes de la segunda opción cuando se escoja la primera, y ‘ se habiliten cuando se escoja la segunda. Private Sub Option1_Click() If Option2.Value = False Then Label_User.Enabled = False Label_Password.Enabled = False Label_Confirm.Enabled = False Label_Domain.Enabled = False User_text.Enabled = False Password_text.Enabled = False Confirm_text.Enabled = False Domain_text.Enabled = False End If End Sub Private Sub Option2_Click() If Option2.Value = True Then Label_User.Enabled = True Label_Password.Enabled = True Label_Confirm.Enabled = True Label_Domain.Enabled = True User_text.Enabled = True Password_text.Enabled = True Confirm_text.Enabled = True Domain_text.Enabled = True ElseIf Option2.Value = False Then Label_User.Enabled = False Label_Password.Enabled = False 122 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Label_Confirm.Enabled = False Label_Domain.Enabled = False User_text.Enabled = False Password_text.Enabled = False Confirm_text.Enabled = False Domain_text.Enabled = False End If End Sub 9.1.1.6 frmDatabaseSelection (Instalación modo Servidor). ‘ Se especifica declaraciones explicitas. Option Explicit ‘ El siguiente código gestiona el funcionamiento del botón para ‘ instalar MSDE 2000. Para ello mira si existe la clave determinada en ‘ el registro de Windows, devolviendo un mensaje de error cuando el ‘ software ya está instalado. Sino, deshabilita el formulario para que ‘ así no se pueda pulsar otro botón durante la instalación y se ‘ procede a ella. Una vez acabada la instalación es necesario que se ‘ reinicie el ordenador antes de poder instalar la base de datos, por ‘ lo que se pasará a un formulario de fin donde se indique que se debe ‘ reiniciar. Private Sub cmdMSDEInstall_Click() Dim strKey As String strKey = "SOFTWARE\Microsoft\Microsoft SQL Server" ‘ Ahora utiliza la función RegKeyExits para ver si existe esa clave ‘ en el registro. Dicha función se explicará cuando se estudie el ‘ módulo EditRegistry. If RegKeyExists("LocalMachine", strKey) Then MsgBox "MSDE2000 is already installed on your computer, please proceed to install the Database", vbExclamation, "Software installed" Else 123 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Me.Enabled = False Me.MousePointer = 11 ‘ Ahora se instala MSDE 2000 usando la función ShellandWait que ‘ se describirá posteriormente. ShellandWait (strINSTALLPATH & "\MSDE\setup.exe /wait") Me.Enabled = True Me.MousePointer = 0 ‘ Se añade el efecto de tachar con una cruz el botón “Install ‘ MSDE 2000” una vez que éste se ha instalado. Me.cmdMSDEInstall.FontStrikethru = True Me.cmdMSDEInstall.Enabled = False ‘ Se cambia la variable global booleana boAnyInstalled a True, ya ‘ que se ha instalado algo y se necesitará reiniciar el equipo. boAnyInstalled = True Unload Me ‘ Se pasa al formulario de fin que nos aconseja y permite ‘ reiniciar el equipo. Load frmMSDE2000Finish frmMSDE2000Finish.Show End If End Sub ‘ El siguiente procedimiento Sub se ejecuta cuando el cliente pulsa ‘ sobre el botón “Install Database in SQL Server 2000” y dirige el ‘ flujo de la aplicación hacia el formulario donde se instalará la ‘ base de datos, especificando mediante la variable global ‘ strDatabaseFlag que se desea instalarla utilizando SQL Server 2000. Private Sub cmdSQL_Click() strDatabaseFlag = "SQL" Unload Me Load frmSetUpInServer frmSetUpInServer.Show End Sub 124 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ El siguiente procedimiento Sub se ejecuta cuando el cliente pulsa ‘ sobre el botón “Install Database in MSDE 2000” y dirige el flujo de ‘ la aplicación hacia el formulario donde se instalará la base de ‘ datos, especificando mediante la variable global strDatabaseFlag que ‘ se desea instalarla utilizando MSDE 2000. Private Sub cmdMSDE_Click() strDatabaseFlag = "MSDE" Unload Me Load frmSetUpInServer frmSetUpInServer.Show End Sub ‘ Por último, con el siguiente código se gestiona la utilidad del ‘ botón “Back” que devuelve la aplicación al formulario frmSelection. Private Sub cmdBack_Click() Unload Me Load frmSelection frmSelection.Show End Sub 9.1.1.7 frmMSDE2000Finish (Instalación modo Servidor). ‘ Se especifica declaración explícita. Option Explicit ‘ El siguiente código gestiona el botón “Finish without restarting”, ‘ que saldrá de la aplicación de instalación. Esto lo realiza ‘ descargándose el formulario, ya que al ser el único formulario ‘ activo se terminará la aplicación. Private Sub Command1_Click() Unload Me End Sub ‘ El siguiente código gestiona el funcionamiento del botón “Restart”, ‘ para ello llama al procedimiento Sub “RebootNT” definido en el ‘ módulo Reboot y que nos permitirá reiniciar el equipo del cliente ‘ desde la aplicación de instalación. Private Sub cmdRestart_Click() 125 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN RebootNT True Unload Me End Sub 9.1.1.8 frmSetUpInServer (Instalación modo Servidor). ‘ El siguiente código se ejecuta al cagarse el formulario y por tanto ‘ chequea el registro de Windows por si ya ha habido una instalación ‘ previa y por tanto por si hay información que se deba auto-rellenar ‘ en el formulario. ‘ RegCheckValueExists ‘ módulo y EditRegistry Para ello utiliza RegReadStringValue, que se analizará ambas las funciones definidas posteriormente en el cuando se ‘ expongan los módulos. Private Sub Form_Load() If RegCheckValueExists("Database PathName") Then txtPathName.Text = RegReadStringValue("Database PathName") If RegCheckValueExists("LogFiles PathName") Then txtPathNameLog.Text = RegReadStringValue("LogFiles PathName") If RegCheckValueExists("Instance Name") Then txtInstance.Text = RegReadStringValue("Instance Name") If txtPathName.Text <> "" And txtPathNameLog <> "" Then CmdInstall.Enabled = True End Sub ‘ Los siguientes dos procedimientos Sub, dirigen la aplicación hacia ‘ el formulario Browser que le permitirá al cliente especificar la ‘ ruta del directorio donde quiere guardar el fichero de la base de ‘ datos y el fichero LOG. Este formulario es el mismo para ambos ‘ botones y cuando ‘ correspondiente, termina por lo rellena que para automáticamente que conozca el quien text lo box está ‘ solicitando se utiliza la variable global strOrigen. Private Sub cmdBrowseButton_Click() Load frmBrowser strOrigin = "PathName" frmBrowser.Show 126 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN End Sub Private Sub CmdBrowseLogButton_Click() Load frmBrowser strOrigin = "PathNameLog" frmBrowser.Show End Sub ‘ A continuación vienen los dos procedimientos Sub que se encargan de ‘ que el botón “Next” se habilite sólo cuando ambas rutas, la del ‘ fichero de la ‘ seleccionadas. base Estos de datos y la procedimientos se del fichero ejecutan LOG, cuando los están text ‘ boxes dejan de estar enfocados. También, cuando uno de los text ‘ boxes está vacío y se selecciona una ruta para el otro, el primero ‘ se actualiza a esa misma ruta. Esto se hace porque suelen compartir ‘ la misma ruta, pero el cliente siempre tiene la posibilidad de ‘ cambiarla y seleccionar directorios diferentes. Private Sub txtPathName_lostfocus() If txtPathNameLog.Text = "" Then txtPathNameLog.Text = txtPathName.Text If txtPathName.Text <> "" And txtPathNameLog.Text <> "" Then Me.CmdInstall.Enabled = True Else Me.CmdInstall.Enabled = False End If End Sub Private Sub txtPathNameLog_lostfocus() If txtPathName.Text = "" Then txtPathName.Text = txtPathNameLog.Text If txtPathName.Text <> "" And txtPathNameLog.Text <> "" Then Me.CmdInstall.Enabled = True Else Me.CmdInstall.Enabled = False End If End Sub 127 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Ahora se procede a la instalación de la base de datos siguiendo los ‘ pasos antes descritos. Este código se ejecuta cuando el cliente ‘ pulsa sobre el botón “Next”. Private Sub cmdInstall_Click() ‘ Primero se declaran las variables que se van a emplear para ‘ llevar a cabo la instalación. Dim pathTempFile As String Dim path As String, strcopy As String, FreeHeaderFileNum As Integer Dim freeNum As Integer, strPathLog As String, strSourcePath As String Dim PathDestination As String Dim objD As Scripting.FileSystemObject, File As Variant, objF As Variant Dim strFileName As String, objAux As FileSystemObject Dim strSQLTool As String ‘ Se guardan en su correspondientes variables las rutas del fichero ‘ para la base de datos y para el fichero LOG. Además se hace un ‘ último chequeo de que el cliente ha completado los text boxes. Si ‘ no ha habido error se procede con la instalación, para lo que se ‘ aumenta el tamaño del formulario para dejar ver la barra de ‘ progreso y se deshabilita el formulario para evitar que se ‘ pulsen los botones durante la instalación. path = txtPathName.Text strPathLog = txtPathNameLog.Text If path = "" Or strPathLog = "" Then MsgBox "Fill the text box first,please", vbExclamation, "Error" Else Me.Enabled = False Me.Height = 8100 Me.MousePointer = 11 ProgressBar.Min = 0 ProgressBar.Max = 7 ProgressBar.Value = 0 ProgressBar.Value = ProgressBar.Value + 1 ‘ Ahora, se desencripta el fichero Encryp.enc situado en el CD de 128 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ instalación y se guarda en “Program Files\Satcom Discovery” ‘ como fichero filler.sql. Para lo que se utiliza el ‘ procedimiento Unencryp_File para desencriptar de un fichero a ‘ otro y que se explicará cuando se vea el módulo EncrypFile. ‘ Dicho procedimiento recibe como argumentos la ruta del fichero ‘ origen, la ruta del fichero destino y una clave para la ‘ encriptación. strSourcePath = strINSTALLPATH & "\Encryp.enc" PathDestination = strMasterDrive & "\Program Files\Satcom Discovery" & "\filler.sql" Call Unencryp_File(strSourcePath, PathDestination, "abcdefghiabcdefgh") ‘ Se localiza la carpeta temporal para crear el fichero de ‘ configuración SatcomSQL.sql. pathTempFile = Environ("tmp") & "\SatcomSQL.sql" ProgressBar.Value = ProgressBar.Value + 1 ‘ Ahora se crea el fichero SatcomSQL.sql en la carpeta temporal ‘ como fichero de salida, es decir, como fichero donde iremos ‘ almacenando información. De aquí en adelante para hacer ‘ referencia a dicho fichero se utilizará su numero de ‘ identificación #freenum. freeNum = FreeFile Open pathTempFile For Output As #freeNum ‘ Ahora se escribe en el fichero SatcomSQL.sql la cabecera fija ‘ que desarrollará la base de datos, en dicha cabecera se ‘ incluirá las rutas para el fichero de la base de datos y para ‘ el fichero LOG seleccionadas por el cliente en el formulario. Print #freeNum, "IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'satcom')" Print #freeNum, " DROP DATABASE [satcom]" Print #freeNum, "GO" Print #freeNum, "CREATE DATABASE [satcom] ON (NAME = N'satcom_Data', FILENAME = N'" & path & "\satcom_Data.MDF' , SIZE = 50, FILEGROWTH = 10%) LOG ON (NAME = N'satcom_Log', FILENAME = N'" & strPathLog & "\satcom_Log.LDF' , SIZE = 2, FILEGROWTH = 10%)" Print #freeNum, "GO" 129 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Ahora se accede al fichero filler.sql como entrada, ya que nos ‘ servirá para copiar la información que en él reside y copiarla ‘ en el fichero de configuración SatcomSQL.sql. A partir de ahora ‘ se hará referencia al fichero filler.sql utilizando su número ‘ de identificación #FreeHeaderFileNum. FreeHeaderFileNum = FreeFile Open strMasterDrive & "\Program Files\Satcom Discovery" & "\filler.sql" For Input As #FreeHeaderFileNum ProgressBar.Value = ProgressBar.Value + 1 ‘ Se copia el contenido de filler.sql en el fichero de ‘ configuración tras la cabecera. Tras lo cual se cierra el ‘ fichero filler.sql. Do While Not EOF(FreeHeaderFileNum) Line Input #FreeHeaderFileNum, strcopy Print #freeNum, strcopy Loop Close #FreeHeaderFileNum ‘ Ahora creamos un directorio llamado SATCOMADDONS en la carpeta ‘ temporal donde situaremos todos los ficheros que contengan ‘ información adicional o personalizada que queramos añadir. ‘ Estos ficheros se copiarán desde el CD de instalación a esta ‘ ubicación y estarán encriptados. Set objAux = New FileSystemObject objAux.CreateFolder (Environ("tmp") & "\SATCOMADDONS") ProgressBar.Value = ProgressBar.Value + 1 ‘ Ahora apuntamos al directorio del CD de instalación que ‘ contiene los ficheros adicionales (este directorio también se ‘ llama SATCOMADDONS). Set objD = New Scripting.FileSystemObject Set objF = objD.GetFolder(strINSTALLPATH & "\SATCOMADDONS") Set objAux = New FileSystemObject ‘ Una vez seleccionado el directorio, se hace un bucle que irá ‘ recorriendo cada fichero contenido en el directorio, y con cada ‘ fichero lo desencripta y lo guarda en el directorio 130 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ SATCOMADDONS en la carpeta temporal y por último irá copiando ‘ su información en el fichero de configuración SatcomSQL.sql For Each File In objF.Files strFileName = objAux.GetFileName(File) Call Unencryp_File(File, Environ("tmp") & "\SATCOMADDONS\" & strFileName, "abcdefghiabcdefgh") FreeHeaderFileNum = FreeFile ‘ Se abre el fichero determinado como entrada para copiarlo en ‘ el de configuración. Open (Environ("tmp") & "\SATCOMADDONS\" & strFileName) For Input As #FreeHeaderFileNum ‘ Una vez seleccionado el fichero se ejecuta este bucle para ‘ copiar su contenido al fichero de configuración SatcomSQL.sql. ‘ Al finalizar se cierra el fichero y se borra de la carpeta ‘ temporal. Tras lo que se pasa al siguiente fichero. Do While Not EOF(FreeHeaderFileNum) Line Input #FreeHeaderFileNum, strcopy Print #freeNum, strcopy Loop Close #FreeHeaderFileNum objAux.DeleteFile (Environ("tmp") & "\SATCOMADDONS\" & strFileName) Next ‘ Finalmente se cierra el fichero de configuración y se liberan ‘ las instancias a los objetos utilizados. Close freeNum Set objD = Nothing Set objF = Nothing Set objAux = Nothing ‘ Se borra la carpeta SATCOMADDONS del directorio temporal. Set objAux = New FileSystemObject objAux.DeleteFolder (Environ("tmp") & "\SATCOMADDONS") ProgressBar.Value = ProgressBar.Value + 1 ‘ Ahora el fichero de configuración SatcomSQL.sql está completo ‘ y listo para ser utilizado para crear la base de datos. Así 131 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ pues, en función de la elección del cliente se usará la ‘ herramienta ISQL ó OSQL, se esperará a que termine(usando la ‘ función ShellandWait que se explicará posteriormente en el ‘ módulo principal) y se borrará el fichero para que no queda ‘ ninguna constancia desencripada en el ordenador. If strDatabaseFlag = "SQL" Then strSQLTool = "ISQL -E -i " & pathTempFile If txtInstance <> "" Then strSQLTool = strSQLTool & " INSTANCENAME=" & txtInstance ShellandWait (strSQLTool) ElseIf strDatabaseFlag = "MSDE" Then strSQLTool = "OSQL -E -i " & pathTempFile If txtInstance <> "" Then strSQLTool = strSQLTool & " INSTANCENAME=" & txtInstance ShellandWait (strSQLTool) End If ‘ Finalmente se borran los ficheros filler.sql y SatcomSQL.sql. Set objAux = New FileSystemObject objAux.DeleteFile PathDestination, True objAux.DeleteFile pathTempFile, True ‘ Por último se activa el flag boAnyInstalled, se almacena en el ‘ registro de Windows el valor 1 en la clave “Database” para ‘ indicarnos que se ha instalado, además de la información dada ‘ por el cliente en lo referente a la ubicación deseada de ‘ ficheros y nombre de la instancia. ProgressBar.Value = 7 boAnyInstalled = True SetRegistryValue "Database", 1 SetRegistryStringValue "Database PathName", txtPathName.Text SetRegistryStringValue "LogFiles PathName", txtPathNameLog.Text If txtInstance.Text <> "" Then SetRegistryStringValue "Instance Name", txtInstance.Text ‘ Se redimensiona el formulario a su tamaño original, se ‘ habilitan los botones y se devuelve la aplicación al eje ‘ central de la instalación en modo Servidor, el formulario 132 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ frmSelection. Donde ahora aparecerá una etiqueta en rojo ‘ diciendo que la base de datos ya ha sido instalada con éxito. Me.Height = 7320 Me.MousePointer = 0 Me.Enabled = True Unload Me Load frmSelection frmSelection.Show End If End Sub ‘ Para concluir con las funciones desempeñadas por este formulario, el ‘ siguiente código gestiona el botón “Back” que dirige la aplicación ‘ hacia el formulario anterior frmDatabaseSelection. Private Sub cmdBack_Click() Unload Me Load frmDatabaseSelection frmDatabaseSelection.Show End Sub 9.1.1.9 frmBrowser (Instalación modo Servidor). ‘ Este primer procedimiento Sub gestiona la lista de selección de ‘ disco, no permitiendo la elección de la unida a:, usualmente ‘ designada al floppy disk. Básicamente este procedimiento hace que ‘ cambie la herramienta de selección de directorios cuando cambia la ‘ de selección de discos. Private Sub DriveListBox_Change() If DriveListBox = "a:" Then MsgBox "The a: unit is not a correct unit", vbExclamation, "Error" Else DirlistBox.path = DriveListBox End If End Sub 133 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Este sencillo código coloca en el text box la ruta escogida por el ‘ usuario. Private Sub DirlistBox_Change() TextPathSelected.Text = DirlistBox.path End Sub ‘ Programamos la utilidad del botón “OK”. Primero se detecta de que ‘ parte del formulario frmSetUpInServer se ha solicitado una ruta por ‘ medio de la variable global strOrigin que así lo indica. Tras lo que ‘ se rellena el text box de dicho formulario con la ruta elegida y en ‘ caso de que el otro text box esté vacio, se rellena también. Tras lo ‘ que habilita el botón “Next” de dicho formulario. Finalmente se ‘ descarga este formulario. Private Sub CmdOkButton_Click() If strOrigin = "PathName" Then frmSetUpInServer.txtPathName.Text = DirlistBox.path If frmSetUpInServer.txtPathNameLog.Text = "" Then frmSetUpInServer.txtPathNameLog.Text = DirlistBox.path frmSetUpInServer.cmdInstall.Enabled = True End If End If If strOrigin = "PathNameLog" Then frmSetUpInServer.txtPathNameLog.Text = DirlistBox.path If frmSetUpInServer.txtPathName.Text = "" Then frmSetUpInServer.txtPathName.Text = DirlistBox.path frmSetUpInServer.cmdInstall.Enabled = True End If End If Unload frmBrowser End Sub ‘ El botón “Cancel” simplemente descarga este formulario dejando como ‘ único formulario activo el frmSetUpInServer que lo llamó. Private Sub CmdCancelButton_Click() Unload frmBrowser End Sub 134 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Por último el botón “New Folder” conduce la aplicación al formulario ‘ que nos permite crear un nuevo directorio: frmFolderName. Private Sub CmdNewFolderButton_Click() Load frmFolderName frmFolderName.Show End Sub 9.1.1.10 frmFolderName (Instalación modo Servidor). ‘ Con el siguiente procedimiento Sub se programa como crear el nuevo ‘ directorio con el nombre dado por el cliente. Para ello se hace uso ‘ de la función CreateFolder que devolverá un valor booleano igual a ‘ Verdadero en caso de que no haya ningún error y de Falso cuando haya ‘ alguno. Dicha función se explicará posteriormente cuando se vea el ‘ módulo principal. El directorio se creará en la carpeta que esté ‘ seleccionada en ese momento en el formulario frmBrowser. Private Sub CmdOkButton_Click() If CreateFolder(frmBrowser.TextPathSelected.Text, TextFolderName.Text) = True Then ‘ En caso de que la ruta seleccionada bajo donde se ha creado el ‘ directorio sea un disco, y por tanto acabe con el carácter “\”, ‘ entonces a esa ruta sólo habrá que añadirle el nombre del nuevo ‘ directorio creado. If Right(frmBrowser.TextPathSelected.Text, 1) = "\" Then frmBrowser.DirlistBox.path = frmBrowser.TextPathSelected.Text & TextFolderName.Text Unload Me ‘ Sin embargo si la ruta seleccionada bajo donde se ha creado el ‘ directorio es otra carpeta, a esta ruta habrá que añadirle el ‘ carácter “\” y luego el nombre del nuevo directorio creado. Else frmBrowser.DirlistBox.path = frmBrowser.TextPathSelected.Text & "\" & TextFolderName.Text Unload Me 135 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN End If Else ‘ En caso de error al crear el nuevo directorio muestra un mensaje ‘ de error. MsgBox "Unable to create folder, please check name", vbExclamation, "Error" End If End Sub ‘ Por último, el botón “Cancel” descarga este formulario. Private Sub CmdCancelButton_Click() Unload Me End Sub 9.1.1.11 frmExeFiles (Instalación modo Servidor). ‘ Especificamos declaraciones explicitas. Option Explicit ‘ El siguiente procedimiento Sub se ejecuta al cargarse el formulario ‘ y se encarga de las etiquetas identificativas de que las ‘ aplicaciones están instaladas. Para ello chequea el registro en ‘ busca de la entrada correspondiente que indicaría una instalación ‘ anterior y en caso de que la encuentre hace visible la etiqueta. ‘ Para ello hace uso de la función ReadRegistryValue definida en el ‘ módulo EditRegistry y que por tanto se explicará posteriormente, y ‘ de variables ‘ boEXEGPRS, booleanas boEXEFTPCLIENT, globales (boEXECONFIGURATIONINSTALLED, boEXEGSMMODEM)que nos sirven para ‘ activarlas. Private Sub Form_Load() If ReadRegistryValue("EXEConfiguration") = 1 Then boEXECONFIGURATIONINSTALLED = True If ReadRegistryValue("EXEWavecomModem") = 1 Then boEXEGSMMODEM = 136 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN True If ReadRegistryValue("EXESatcomGPRS") = 1 Then boEXEGPRS = True If ReadRegistryValue("EXEFTPClient") = 1 Then boEXEFTPCLIENT = True Me.lblSatConfInstalled.Visible = boEXECONFIGURATIONINSTALLED Me.lblSAtGSMInstalled.Visible = boEXEGSMMODEM Me.lblSatFTPInstalled.Visible = boEXEFTPCLIENT Me.lblSatGPRS.Visible = boEXEGPRS End Sub ‘ Con el siguiente código se controla el botón “Back” que simplemente ‘ devuelve la aplicación al formulario central de la instalación en ‘ modo Servidor, frmselection. Private Sub cmdBack_Click() Unload Me Load frmSelection frmSelection.Show End Sub ‘ ahora cuando el cliente pulsa sobre el botón “install” se ejecuta el ‘ siguiente código, que primero se asegurará de que el cliente haya ‘ escogido al menos una opción, luego aumenta su tamaño para mostrar ‘ la barra de progreso y se deshabilita para evitar que se puedan ‘ pulsar más botones durante la instalación. Tras lo que procede con ‘ la instalación de las aplicaciones, copiándolas al directorio ‘ “Program Files\satcom Discovery” y creando un acceso directo de ‘ todas ellas menos la de configuración en la carpeta de inicio para ‘ que se ejecuten al iniciarse el sistema operativo. Private Sub cmdInstall_Click() Me.Enabled = False Me.MousePointer = 11 ProgressBar.Min = 0 ProgressBar.Max = 5 ProgressBar.Value = 0 Dim objAux As FileSystemObject Set objAux = New FileSystemObject If chkGSMModem.Value = 0 And chkGPRS.Value = 0 And chkFTP.Value = 0 Then MsgBox "You must select one item before continuing", 137 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN vbExclamation, "Error" Me.Enabled = True Me.Height = 5160 Me.MousePointer = 0 ‘ En caso de que ya se haya seleccionado alguna aplicación, se ‘ continua con la instalación. Además se crea un acceso directo en ‘ el escritorio. Else Me.Height = 6045 ProgressBar.Value = ProgressBar.Value + 1 ‘ Se instala la aplicación Satcom Configuration. Si ya existe se ‘ borra y luego se copia de nuevo. If objAux.FileExists(strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe") Then objAux.DeleteFile strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe", True objAux.CopyFile strINSTALLPATH & "\EXEFILES\SatcomConfiguration.exe", strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe", True CreateShortCut strMasterDrive & "\Documents and Settings\All Users\escritorio\SatcomConfiguration.lnk", strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe", strMasterDrive & "\Program Files\Satcom Discovery\SatcomConfiguration.exe" ‘ Se edita el registro para marcar que se ha instalado la ‘ aplicación Satcom Configuration. SetRegistryValue "EXEConfiguration", 1 ProgressBar.Value = ProgressBar.Value + 1 ‘ Ahora se instala la aplicación Satcom GSM Modem si procede, ‘ además de su acceso directo en la carpeta de inicio (Para lo ‘ que se usa el procedimiento CreateShorcut que se explicará en ‘ el módulo principal). Por último se edita una entrada en el ‘ registro para marcar que se ha instalado. 138 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN If chkGSMModem.Value = 1 Then If objAux.FileExists(strMasterDrive & "\Program Files\Satcom Discovery\SatcomWavecomModem.exe") Then objAux.DeleteFile strMasterDrive & "\Program Files\Satcom Discovery\SatcomWavecomModem.exe", True objAux.CopyFile strINSTALLPATH & "\EXEFILES\SatcomWavecomModem.exe", strMasterDrive & "\Program Files\Satcom Discovery\SatcomWavecomModem.exe", True CreateShortCut strMasterDrive & "\Documents and Settings\All Users\Menú Inicio\programas\inicio\SatcomWavecomModem.lnk", strMasterDrive & "\Program Files\Satcom Discovery\SatcomWavecomModem.exe", strMasterDrive & "\Program Files\Satcom Discovery\SatcomWavecomModem.exe" SetRegistryValue "EXEWavecomModem", 1 End If ‘ Ahora se instala la aplicación Satcom GPRS si procede, ‘ además de su acceso directo en la carpeta de inicio (Para lo ‘ que se usa el procedimiento CreateShorcut que se explicará en ‘ el módulo principal). Por último se edita una entrada en el ‘ registro para marcar que se ha instalado. If chkGPRS.Value = 1 Then If objAux.FileExists(strMasterDrive & "\Program Files\Satcom Discovery\SatcomGPRS.exe") Then objAux.DeleteFile strMasterDrive & "\Program Files\Satcom Discovery\SatcomGPRS.exe", True objAux.CopyFile strINSTALLPATH & "\EXEFILES\SatcomGPRS.exe", strMasterDrive & "\Program Files\Satcom Discovery\SatcomGPRS.exe", True CreateShortCut strMasterDrive & "\Documents and Settings\All Users\Menú Inicio\programas\inicio\SatcomGPRS.lnk", strMasterDrive & "\Program Files\Satcom Discovery\SatcomGPRS.exe", strMasterDrive & "\Program Files\Satcom Discovery\SatcomGPRS.exe" SetRegistryValue "EXESatcomGPRS", 1 139 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN End If ‘ Ahora se instala la aplicación Satcom Trakm8 FTP Client si ‘ procede, además de su acceso directo en la carpeta de inicio ‘ (Para lo que se usa el procedimiento CreateShorcut que se ‘ explicará en el módulo principal). Por último se edita una ‘ entrada en el registro para marcar que se ha instalado. If chkFTP.Value = 1 Then If objAux.FileExists(strMasterDrive & "\Program Files\Satcom Discovery\Satcom TrakM8 FTP Client.exe") Then objAux.DeleteFile strMasterDrive & "\Program Files\Satcom Discovery\Satcom TrakM8 FTP Client.exe", True objAux.CopyFile strINSTALLPATH & "\EXEFILES\Satcom TrakM8 FTP Client.exe", strMasterDrive & "\Program Files\Satcom Discovery\Satcom TrakM8 FTP Client.exe", True CreateShortCut strMasterDrive & "\Documents and Settings\All Users\Menú Inicio\programas\inicio\Satcom TrakM8 FTP Client.lnk", strMasterDrive & "\Program Files\Satcom Discovery\Satcom TrakM8 FTP Client.exe", strMasterDrive & "\Program Files\Satcom Discovery\Satcom TrakM8 FTP Client.exe" SetRegistryValue "EXEFTPClient", 1 End If ‘ Se termina activando la variable globlal boAnyInstalled, ‘ devolviendo el formulario a su tamaño habitual y regresando al ‘ formulario central de la instalación en modo Servidor ‘ frmSelection. ProgressBar.Value = 5 boAnyInstalled = True Me.Enabled = True Me.Height = 5160 Me.MousePointer = 0 Unload Me Load frmSelection frmSelection.Show End If 140 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN End Sub 9.1.1.12 frmClientInstallation (Instalación modo Cliente). ‘ Se especifica declaración explícita Option Explicit ‘ En caso de que el cliente pulse sobre el botón “Cancel” se cierra la ‘ aplicación de instalación. Private Sub cmdCancel_Click() Unload Me End Sub ‘ Cuando el usuario accede a proseguir con la instalación en modo ‘ Cliente se ejecuta el siguiente código. Se cambia la configuración ‘ de seguridad de la Intranet, luego la de los Sitios de Confianza y ‘ por último se instalan y registran las Dll y OCX necesarias para su ‘ correcto funcionamiento. Durante todo este proceso se inhabilita el ‘ formulario para evitar que se pueda pulsar otro botón. Private Sub cmdInstall_Click() Dim lngAux As Long Dim ret Dim lngValue As Long, lngvalue2 As Long Me.Enabled = False ‘ Las siguientes dos variables contienen los valores para cambiar ‘ la configuración de seguridad de Intranet que queremos. lngValue ‘ será el que active la opción “Inicializar y activar la secuencia ‘ de comandos de los controles ActiveX no marcados como seguros”, ‘ mientras que la variable lngvalue2 será la encargada de activar ‘ la casilla de “Pedir datos” en la opción de “Descargar los ‘ controles no firmados para ActiveX”. Los valore asignados (0 y 1 ‘ respectivamente) son los adecuados para estos cambios. lngValue = 0 lngvalue2 = 1 ‘ Se abre la clave en cuestión utilizando la API RegOpenKeyEx lngAux = RegOpenKeyEx(HKEY_CURRENT_USER, 141 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1", 0&, KEY_ALL_ACCESS, ret) '/////////////////////////////////////////////////////////// ‘ Esto es para depurar posibles errores cuando ocurran. El ‘ procedimiento Sub RegDebugError esta definido en el módulo ‘ EditRegistry. 'RegDebugError (lngAux) '/////////////////////////////////////////////////////////// ‘ Se procede a la activación de “Iniciar y activar la secuencia de ‘ comandos de los controles ActiveX no marcados como seguros”, para ‘ lo que hace uso de la API RegSetValueEx definida en el módulo ‘ EditRegistry. lngAux = RegSetValueEx(ret, "1201", 0, REG_DWORD, lngValue, LenB(lngValue)) '/////////////////////////////////////////////////////////// 'RegDebugError (lngAux) '/////////////////////////////////////////////////////////// ‘ Se procede a marcar la casilla de “Pedir datos” bajo la opción ‘ “Descargar los controles no firmados para ActiveX” en la ‘ configuración de seguridad de Intranet de Internet Explorer. lngAux = RegSetValueEx(ret, "1004", 0, REG_DWORD, lngvalue2, LenB(lngvalue2)) '/////////////////////////////////////////////////////////// 'RegDebugError (lngAux) '/////////////////////////////////////////////////////////// ‘ Se cierra la clave del registro. RegCloseKey ret ‘ Ahora se cambia la configuración de seguridad de los Sitios de ‘ Confianza de Internet Explorer, para lo que utilizamos las mismas ‘ variables de antes. Ahora los valores que tomarán éstas será en ‘ ambos casos el valor 0, ya que ahora queremos activar las dos ‘ opciones. lngValue = 0 142 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN lngvalue2 = 0 ‘ Se abre la clave del registro. lngAux = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2", 0&, KEY_ALL_ACCESS, ret) '/////////////////////////////////////////////////////////// 'RegDebugError (lngAux) '/////////////////////////////////////////////////////////// ‘ Se procede a la activación de “Iniciar y activar la secuencia de ‘ comandos de los controles ActiveX no marcados como seguros”, para ‘ lo que hace uso de la API RegSetValueEx definida en el módulo ‘ EditRegistry. lngAux = RegSetValueEx(ret, "1201", 0, REG_DWORD, lngValue, LenB(lngValue)) '/////////////////////////////////////////////////////////// 'RegDebugError (lngAux) '/////////////////////////////////////////////////////////// ‘ Se procede a activar la opción “Descargar los controles no ‘ firmados para ActiveX” en la configuración de seguridad de ‘ Sitios de Confianza de Internet Explorer. lngAux = RegSetValueEx(ret, "1004", 0, REG_DWORD, lngvalue2, LenB(lngvalue2)) '/////////////////////////////////////////////////////////// 'RegDebugError (lngAux) '/////////////////////////////////////////////////////////// ‘ Se cierra la clave del registro de Windows. RegCloseKey ret ‘ Se instalan y registran los ficheros Dll y OCX necesarios para el ‘ correcto funcionamiento de la instalación en modo Cliente. Para ‘ ello se utiliza el procedimiento Sub InstallClientDlls definido ‘ en el módulo principal y que por tanto se explicará ‘ posteriormente. 143 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN installClientDlls ‘ Se habilita de nuevo el formulario, se activa la variable ‘ boAnyInstalled y se pasa al formulario frmClientInstallation2 que ‘ continuará con la instalación en modo Cliente. Me.Enabled = True boAnyInstalled = True Unload Me Load frmClientInstallation2 frmClientInstallation2.Show End Sub 9.1.1.13 frmClientInstallation2 (Instalación modo Cliente). ‘ Se especifica declaración explicita. Option Explicit ‘ En caso de que el cliente pulse sobre el botón “Skip” se ejecuta el ‘ siguiente código, que pasa al siguiente paso de la instalación en ‘ modo cliente, el formulario frmIISServerName. Private Sub cmdSkip_Click() Unload Me Load frmIISServerName frmIISServerName.Show End Sub ‘ Con el siguiente código se instala los componentes necesarios de ‘ Infomap, tras lo que se pasa a un formulario intermedio ‘ (frmPJSoftLicenseFiles) donde se realizarán las acciones pertinentes ‘ con los ficheros de licencia de Infomap. Private Sub cmdNext_Click() Me.Enabled = False ‘ Ahora se ejecuta el fichero de Infomap para instalarlo, para lo ‘ que se usa la función ShellandWait definida en el módulo ‘ principal. ShellandWait (strINSTALLPATH & "\EXEFILES\InfoMap Components 3.0 EN.exe") 144 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Se activa la variable booleana boAnyInstalled y se rehabilita el ‘ formulario. boAnyInstalled = True Me.Enabled = True ‘ Se cierra el presente formulario y se pasa a uno intermedio para ‘ tratar con los ficheros de licencia. Unload Me Load frmPJSoftLicenseFiles frmPJSoftLicenseFiles.Show End Sub 9.1.1.14 frmPJSoftLicenseFiles (Instalación modo Cliente). ‘ Se especifica declaración explícita. Option Explicit ‘ Cuando se pulsa el botón “Next” se ejecuta el siguiente código para ‘ instalar los ficheros de licencia. Private Sub cmdNext_Click() ‘ Se declara una instancia de tipo FileSystemObject para tratar con ‘ las funciones típicas del manejo de ficheros y directorios. Dim objAux As FileSystemObject Set objAux = New FileSystemObject ‘ Se comprueba si se ha seleccionado la ruta correcta, en caso ‘ contrario se muestra un mensaje de error. If Not (objAux.FolderExists(txtPathName.Text & "\ActiveX")) Then MsgBox "Incorrect folder", vbCritical, "Folder Error" ‘ En caso de que no haya error se procede a instalación de los ‘ ficheros de licencia. Else ‘ Se instalan los ficheros de licencia en la carpeta “ActiveX” ‘ dentro de la ruta dada por el cliente en el text box. 145 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN If Not (objAux.FileExists(txtPathName.Text & "\ActiveX\pjactrl.lic")) Then objAux.CopyFile strINSTALLPATH & "\PJSoft License\pjactrl.lic", txtPathName.Text & "\ActiveX\pjactrl.lic", True If Not (objAux.FileExists(txtPathName.Text & "\ActiveX\pjqctrl.lic")) Then objAux.CopyFile strINSTALLPATH & "\PJSoft License\pjqctrl.lic", txtPathName.Text & "\ActiveX\pjqctrl.lic", True If Not (objAux.FileExists(txtPathName.Text & "\ActiveX\ictrl.lic")) Then objAux.CopyFile strINSTALLPATH & "\PJSoft License\ictrl.lic", txtPathName.Text & "\ActiveX\ictrl.lic", True ‘ Ahora se instalan los ficheros de licencia en la carpeta de ‘ sistema “System32”. If Not (objAux.FileExists(strWindowsFolder & "\pjactrl.lic")) Then objAux.CopyFile strINSTALLPATH & "\PJSoft License\pjactrl.lic", strWindowsFolder & "\pjactrl.lic", True If Not (objAux.FileExists(strWindowsFolder & "\pjqctrl.lic")) Then objAux.CopyFile strINSTALLPATH & "\PJSoft License\pjqctrl.lic", strWindowsFolder & "\pjqctrl.lic", True If Not (objAux.FileExists(strWindowsFolder & "\ictrl.lic")) Then objAux.CopyFile strINSTALLPATH & "\PJSoft License\ictrl.lic", strWindowsFolder & "\ictrl.lic", True ‘ Finalmente se descarga el formulario y se pasa al siguiente ‘ (frmIISServerName). Unload Me Load frmIISServerName frmIISServerName.Show End If End Sub ‘ Cuando el cliente pulsa sobre el botón “Browse” se carga el ‘ formulario frmPJSOftBrowser. Private Sub cmdBrowse_Click() 146 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Load frmPJSOftBrowser frmPJSOftBrowser.Show End Sub 9.1.1.15 frmPJSOftBrowser (Instalación modo Cliente). ‘ Se especifica declaración explícita. Option Explicit ‘ Este código controla el cambio de la selección de directorios. Private Sub DirlistBox_Change() TextPathSelected.Text = DirlistBox.path End Sub ‘ Este código controla el cambio de la selección de discos. Private Sub DriveListBox_Change() ‘ En caso de que se seleccione la unidad de floppy disk se muestra ‘ un mensaje de error. If DriveListBox = "a:" Then MsgBox "The a: unit is not a correct unit", vbExclamation, "Error" Else DirlistBox.path = DriveListBox End If End Sub ‘ Cuando se pulsa el botón “Cancel” se descarga el formulario, dejando ‘ sólo activo al formulario frmPJSoftLicenseFiles. Private Sub CmdCancelButton_Click() Unload frmPJSOftBrowser End Sub ‘ El botón “Ok” descarga el formulario copiando previamente la ruta en ‘ el text box dado para ello en el formulario frmPJSoftLicenseFiles. Private Sub CmdOkButton_Click() frmPJSoftLicenseFiles.txtPathName.Text = DirlistBox.path Unload frmPJSOftBrowser 147 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN End Sub 9.1.1.16 frmIISServerName (Instalación modo Cliente). ‘ Especificamos declaración explícita. Option Explicit ‘ El siguiente código se ejecuta al cargarse el formulario, y lleva a ‘ cabo la función de auto-rellenar el text box con el nombre del ‘ ordenador, o en el caso de que haya habido una instalación previa, ‘ con el nombre utilizado entónces. Para obtener el nombre del ‘ ordenador utiliza la API GetComputerName declarada en el módulo ‘ principal. Private Sub Form_Load() Dim strComputerName As String * 32, lngSize As Long, strServerName As String lngSize = 32 ‘ Se utiliza la API GetComputerName para obtener el nombre del ‘ equipo. GetComputerName strComputerName, lngSize strComputerName = Left(strComputerName, lngSize) strServerName = RTrim(strComputerName) ‘ Se rellena el text box con el nombre del equipo. Me.txtIISServerName.Text = strServerName ‘ Se chequea el registro para ver si habido una instalación previa, ‘ en cuyo caso se rellena el text box con el nombre utilizado ‘ entonces. If RegCheckValueExists("IIS Server Name") Then Me.txtIISServerName.Text = RegReadStringValue("IIS Server Name") End Sub Private Sub cmdNext_Click() 148 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Dim strServerName As String Dim strWebRoot As String Dim lngSize As Long Dim lngAux As Long, lngValue As Long Dim ret ‘ La máxima longitud que podrá tener el nombre del ordenador será ‘ de 32. Dim strComputerName As String * 32 Dim objAux As FileSystemObject ‘ Se deshabilita el formulario mientras se produce la instalación. Me.Enabled = False ‘ Se obtiene el nombre del equipo y se almacena en la variable ‘ strWebRoot. lngSize = 32 GetComputerName strComputerName, lngSize strComputerName = Left(strComputerName, lngSize) strWebRoot = RTrim(strComputerName) ‘ Si el usuario borra el text box y pulsa el botón “Next” se tomará ‘ el nombre del equipo por defecto. De otro modo se tomará el ‘ nombre dado por el usuario. If txtIISServerName.Text = "" Then strServerName = strWebRoot Else strServerName = txtIISServerName.Text End If ‘ Ahora se copia el icono de la aplicación Discovery en el ‘ directorio “\Archivos de Programa\Satcom Discovery”, siempre y ‘ cuando éste no haya sido ya copiado anteriormente. Set objAux = New FileSystemObject If Not (objAux.FileExists(strMasterDrive & "\Program Files\Satcom Discovery\CARS.ico")) Then objAux.CopyFile strINSTALLPATH & "\Icons\CARS.ico", strMasterDrive & "\Program Files\Satcom Discovery\CARS.ico", True ‘ En el caso de que se utilice el nombre del equipo, podemos usar ‘ la dirección “localhost” para dirigirnos a la aplicación. Para lo ‘ que creamos una acceso directo en el escritorio que enlace con la 149 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ aplición usando como icono el anteriormente instalado. If strServerName = strWebRoot Then CreateShortCut strMasterDrive & "\Documents and Settings\All Users\escritorio\SATCOM.lnk", "http://localhost/SATCOM", strMasterDrive & "\Program Files\Satcom Discovery\CARS.ico" ‘ Ahora se introduce la dirección de la aplicación en los sitios ‘ de confianza de Internet Explorer, para lo que primero chequea ‘ si ya pertenecía a ese grupo. If Not (RegKeyExists("CurrentUser", "Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\localhost")) Then lngAux = RegCreateKey(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\localhost", ret) ‘ Se introduce el siguiente valor en el registro para añadir la ‘ aplicación Web en los sitios de confianza. lngValue = 2 'Value to be set in "localhost\http" lngAux = RegSetValueEx(ret, "http", 0, REG_DWORD, lngValue, LenB(lngValue)) ‘ Cerramos la clave del registro. RegCloseKey ret End If ‘ En caso de que el cliente escoja otro nombre distinto al del ‘ equipo. Else ‘ Se crea el acceso directo con el nombre dado. CreateShortCut strMasterDrive & "\Documents and Settings\All Users\escritorio\SATCOM.lnk", "http://" & strServerName & "/SATCOM", strMasterDrive & "\Program Files\Satcom Discovery\CARS.ico" ‘ Se incluye Discovery entre los sitios de confianza del Internet ‘ Explorer. Previamente se chequea si ya estaba incluido en ese ‘ grupo. If Not (RegKeyExists("CurrentUser", "Software\Microsoft\Windows\CurrentVersion\Internet 150 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Settings\ZoneMap\Domains\" & strServerName)) Then lngAux = RegCreateKey(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\" & strServerName, ret) ‘ Se introduce el siguiente valor en el registro para añadir la ‘ aplicación Web en los sitios de confianza. lngValue = 2 lngAux = RegSetValueEx(ret, "http", 0, REG_DWORD, lngValue, LenB(lngValue)) ‘ Se cierra la clave del registro. RegCloseKey ret End If End If ‘ Ahora se crea una entrada en el registro de Windows donde se ‘ almacenará el nombre del servidor seleccionado para así ‘ utilizarlo en posteriores instalaciones. SetRegistryStringValue "IIS Server Name", txtIISServerName.Text boAnyInstalled = True ‘ Se vuelve a habilitar el formulario, se cierra y se pasa al ‘ formulario frmFinish que finalizará la aplicación. Me.Enabled = True Unload Me Load frmFinish frmFinish.Show End Sub 9.1.1.17 frmFinish. ‘ Se especifica declaración explícita. Option Explicit ‘ El siguiente procedimiento se ejecuta al cargarse el formulario y se ‘ encarga de informar al cliente del código del producto y del código 151 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ de desbloqueo. Además, copia estos en un fichero de texto en la ‘ carpeta “Program Files\Satcom Discovery”. Private Sub Form_Load() Dim objF As FileSystemObject Dim intFileNumber As Integer ‘ Se copian los códigos desde sus respectivas variables globales ‘ donde fueron almacenados en formularios anteriores. Me.lblProductSerialNumber.Caption = strProductSerialNumber Me.lblUnlockKey.Caption = strUnlockKey ‘ Se borra el fichero de texto que almacena los códigos si este ya ‘ existía, con el propósito de crear uno nuevo. Set objF = New FileSystemObject If objF.FileExists(strMasterDrive & "\Program Files\Satcom Discovery\Satcom Product Key.txt") Then objF.DeleteFile strMasterDrive & "\Program Files\Satcom Discovery\Satcom Product Key.txt", True End If ‘ Ahora se crea un nuevo fichero de texto en la carpeta de “Program ‘ Files\Satcom Discovery” donde se almacenarán los códigos. intFileNumber = FreeFile Open strMasterDrive & "\Program Files\Satcom Discovery\Satcom Product Key.txt" For Output As #intFileNumber Print #intFileNumber, "Product Key : " & strProductSerialNumber Print #intFileNumber, "Unlock Key : " & strUnlockKey Close #intFileNumber End Sub ‘ Cuando el cliente pulse sobre “Finish without restarting” ‘ simplemente se descargará el presente formulario, que por ser el ‘ único activo en ese momento, dará fin a la aplicación de instalación. Private Sub cdmFinish_Click() 152 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Unload Me End Sub ‘ Cuando el cliente opta por pulsar sobre el botón “Restart and ‘ Finish” se procede al reinicio del equipo, para lo que se hace uso ‘ del procedimiento Sub “RebootNT” definido en el módulo Reboot. Private Sub cmdRestart_Click() RebootNT True Unload Me End Sub 9.1.1.18 frmFinishWithoutInstall. ‘ Se especifica declaración explícita. Option Explicit ‘ Cuando el cliente pulsa sobre el botón “Finish”, se descargará el ‘ formulario, que al ser el único activo en ese momento finalizará con ‘ la aplicación de instalación. Private Sub cmdFinish_Click() Unload Me End Sub 153 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN 9.1.2 Módulos. 9.1.2.1 Módulo principal (MainModule). ‘ Primero se declaran las variables globales. ‘ Esta variable contendrá la ruta del directorio de Windows Public strWindowsFolder As String ‘ Esta variable contendrá el nombre del disco donde está instalado ‘ Windows. Public strMasterDrive As String ‘ Está variable contendrá el código de producto. Public strProductSerialNumber As String ‘ Esta variable contendrá el código de desbloqueo. Public strUnlockKey As String ‘ Esta variable booleana la utilizamos para saber si se ha instalado ‘ algo hasta el momento o no. Public boAnyInstalled As Bolean ‘ La siguiente variable se utiliza en el frmBrowser para identificar ‘ el text box que debe rellenar. Public strOrigin As String ‘ Con la siguiente variable gestionamos la bifurcación entre la ‘ instalación en modo Servidor o en modo Cliente. Public strWhoCall As String ‘ Esta varible nos identificará la ruta donde se está ejecutando la ‘ aplicación de instalación. Generalmente será la ruta del ejecutable ‘ situado en el CD de instalación. Public strINSTALLPATH As String ‘ Esta variable almacenará si el cliente quiere instalar la base de ‘ datos utilizando SQL Server o MSDE 2000. Public strDatabaseFlag As String ‘ Las siguientes variables son variables boleanas que nos marcarán ‘ cuando la aplicación COM+, directorio virtual en IIS, base de datos, ‘ o ficheros ejecutables respectivamente han sido instalados. Public boCOMPLUSINSTALLED As Boolean Public boIISFOLDERINSTALLED As Boolean Public boDATABASEINSTALLED As Boolean Public boEXECONFIGURATIONINSTALLED As Boolean Public boEXEGSMMODEM As Boolean 154 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Public boEXEGPRS As Boolean Public boEXEFTPCLIENT As Boolean ‘ A continuación vienen las declaraciones de las APIs utilizadas. ‘ La siguiente API nos permite reiniciar el sistema. Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long ‘ Esta API no se utiliza directamente en la aplicación, sino que es ‘ usada para depurarla. Public Declare Function GetLastError Lib "kernel32" () As Long ‘ Esta API es utilizada en la función ShellandWait y nos permite abrir ‘ un proceso en el ordenador del cliente. Private Declare dwDesiredAccess Function As Long, OpenProcess ByVal Lib "kernel32" bInheritHandle As Long, (ByVal ByVal dwProcessId As Long) As Long ‘ La siguiente API devuelve el estado final de un determinado proceso. ‘ Es utilizada en la función ShellandWait. Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long ‘ La siguiente API devuelve el nombre del equipo en la que se ejecuta. ‘ Este nombre es establecido al inicio del sistema, cuando es ‘ inicializado desde el registro de Windows. Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long ‘ Esta API devuelve la ruta del directorio de sistema de Windows. ‘ Dicho directorio contiene ficheros esenciales como son librerias de ‘ Windows y drivers. Public Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long ‘ Para el correcto funcionamiento de algunas de las APIs anteriores, ‘ se necesitan ciertas constantes que éstas usan como argumento en los 155 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ casos que nos incumben. A estos valores se les suele asociar unas ‘ constantes globales para que así no haya que recordarlos. Son los ‘ siguientes. Public Const EWX_REBOOT = &H2 Public Const EWX_FORCE = 4 Private Const STATUS_PENDING = &H103& Private Const PROCESS_QUERY_INFORMATION = &H400 ‘ Ahora veremos cada una de las funciones y procedimientos Sub que se ‘ alojan en este módulo. ‘ La siguiente función crea una nueva carpeta en la ruta que se le ‘ pasa como argumento. Public Function CreateFolder(ByVal PathName As String, ByVal FolderName As String) As Boolean ‘ Se especifica que en caso de error se pase a la siguiente orden. On Error Resume Next Dim path As String Dim FolderPath As String FolderPath = PathName & "\" & FolderName ‘ Se crea el directorio en la ruta dada. Dim objfolder As FileSystemObject Set objfolder = New FileSystemObject Objfolder.CreateFolder FolderPath ‘ Si no ha habido error se devuelve TRUE, en caso contrario FALSE. If Err <> 0 Then MsgBox Error CreateFolder = False Else CreateFolder = True End If Set objfolder = Nothing End Function 156 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Esta función no se utiliza directamente en la aplicación. Fue creada ‘ para ser usada mientras la depuración de la aplicación. Chequea si ‘ el directorio virtual dado como parametro ya existe en IIS. Public Function VirtualWebExists(strWebName As String) As Boolean ‘ En caso de error va a ERROR_HANDLER. On Error GoTo ERROR_HANDLER Dim objApp As Object ‘ Si se hace la siguiente llamada sin errores es señal de que el ‘ directorio virtual existe. Entonces la función devuelve TRUE. Set objApp = GetObject("IIS://LocalHost/w3svc/1/ROOT/" & strWebName) VirtualWebExists = True ‘ En CLEANUP liberamos la instancia al objeto objApp. GoTo CLEANUP ‘ En caso de error se ejecuta lo siguiente. Según el número del ‘ error tendremos una causa u otra. ERROR_HANDLER: Select Case Err ‘ en caso de que no haya IIS. Case 462, 432, 424 ‘ En caso de que no se haya encontrado la ruta. Case -2147024893 End Select Resume CLEANUP ‘ Para liberar la instancia al objeto. CLEANUP: If Not (objApp Is Nothing) Then Set objApp = Nothing End Function ‘ La siguiente función desempeña un papel muy importante en la ‘ aplicación. Se encarga de que la aplicación permanezca en espera ‘ mientras se esté instalando algún tipo de fichero ejecutable, tras ‘ lo que la aplicación continuará desde donde se quedó. Así pues, la 157 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ usamos cada vez que empleamos un ejecutable en la aplicación. Como ‘ parámetros se le pasan la ruta del fichero ejecutable y un valor de ‘ timeout para asegurarnos de que no se sobrepasa un tiempo especifico. ‘ Este último parámetro es opcional. Public Function ShellandWait(ByVal ExeFullPath As String, _ Optional TimeOutValue As Long = 0) As Boolean Dim longInst As Long Dim longStart As Long Dim longTimeToQuit As Long Dim strExeName As String Dim longProcessId As Long Dim longExitCode As Long Dim bPastMidnight As Boolean On Error GoTo ErrorHandler longStart = CLng(Timer) strExeName = ExeFullPath ‘ Se gestiona el TimeOut,si es que se ha pasado como parámetro. If TimeOutValue > 0 Then If longStart + TimeOutValue < 86400 Then longTimeToQuit = longStart + TimeOutValue Else longTimeToQuit = (longStart - 86400) + TimeOutValue bPastMidnight = True End If End If longInst = Shell(strExeName, vbMinimizedNoFocus) longProcessId = OpenProcess(PROCESS_QUERY_INFORMATION, False, longInst) Do Call GetExitCodeProcess(longProcessId, longExitCode) DoEvents If TimeOutValue And Timer > longTimeToQuit Then If bPastMidnight Then If Timer < longStart Then Exit Do 158 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Else Exit Do End If End If Loop While longExitCode = STATUS_PENDING ShellandWait = True ErrorHandler: ShellandWait = False Exit Function End Function ‘ El siguiente procedimiento instala y registra los archivos Dll y ‘ OCX´s necesarios para la instalación en modo Servidor. Para ello, ‘ primero instala y registra los ficheros que se encuentren en la ‘ carpeta del CD de instalación “\DLL & OCX’s\DLLNoVersion”,ya que ‘ estos no tienen ninguna versión que nos permita comparar con los ya ‘ instalados en el ordenador del cliente. Posteriormente se copian el ‘ resto de los archivos Dll y OCX´s necesarios de la carpeta “\DLL & ‘ OCX´s\Server DLL´s” del CD de instalación, aunque en este caso ‘ primero se comprueba que estos ficheros no los tiene ya instalados ‘ el cliente o si los tiene, que su versión sea más antigua que la que ‘ la aplicación va a instalar. En caso contrario no se instalarán. ‘ Para comparar las versiones entre dos ficheros se llama a la función ‘ CheckVersion que se explicará más adelante en este módulo. Public Sub InstallDLL() Dim objD As Scripting.FileSystemObject, File As Variant, objF As Variant Dim strFileName As String, objAux As FileSystemObject, intX As Integer, dblX As Double ‘ Se apunta a la carpeta donde están los ficheros a instalar, en ‘ este caso los que no tienen versión. Set objD = New Scripting.FileSystemObject Set objF = objD.GetFolder(strINSTALLPATH & "\DLL's & OCX's\DLLNoVersion") 159 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Set objAux = New FileSystemObject ‘ Ahora se hace un bucle que vaya cogiendo cada uno de los ficheros ‘ que se encuentren en ese directorio. Se mira si ya existen en la ‘ máquina del cliente y si es así se desregistran, se borran y se ‘ instalan y registran los nuevos. For Each File In objF.Files strFileName = objAux.GetFileName(File) If objAux.FileExists(strWindowsFolder & "\" & strFileName) Then ‘ Se desregistra el fichero. dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & "/u /s", vbHide) ‘ Se borra el fichero. objAux.DeleteFile strWindowsFolder & "\" & strFileName, True ‘ Se copia el nuevo fichero. objAux.CopyFile strINSTALLPATH & "\DLL's & OCX's\DLLNoVersion\" & strFileName, strWindowsFolder & "\" & strFileName, True ‘ Se registra el nuevo fichero. dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & " /s", vbHide) ‘ En caso de que no exista el fichero se copia y se registra el ‘ nuevo. Else objAux.CopyFile strINSTALLPATH & "\DLL's & OCX's\DLLNoVersion\" & strFileName, strWindowsFolder & "\" & strFileName, True dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & " /s", vbHide) End If Next ‘ Ahora se pasa a instalar los fichero con versión ubicados en el ‘ CD de instalación, para lo que primero se apunta a la carpeta que ‘ los aloja. Set objF = objD.GetFolder(strINSTALLPATH & "\DLL's & OCX's\Server 160 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN DLL's") ‘ Una vez obtenida la carpeta, se hace un bucle que irá cogiendo ‘ uno por uno todos los ficheros contenidos en dicha carpeta, que ‘ serán los que queremos instalar. For Each File In objF.Files strFileName = objAux.GetFileName(File) ‘ Si el fichero ya existe en la máquina del cliente se compara su ‘ versión y en caso de que sea más antigua que el del que se ‘ quiere instalar se borra y se instala el nuevo. If objAux.FileExists(strWindowsFolder & "\" & strFileName) Then ‘ La función CheckVersion devuelve TRUE si el fichero a ‘ instalar tiene una versión más actulizada. If CheckVersion(File, strWindowsFolder & "\" & strFileName) Then ‘ Se desregistra el antiguo. dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & "/u /s", vbHide) ‘ Se borra el antiguo. objAux.DeleteFile strWindowsFolder & "\" & strFileName, True ‘ Se copia el nuevo. objAux.CopyFile strINSTALLPATH & "\DLL's & OCX's\Server DLL's\" & strFileName, strWindowsFolder & "\" & strFileName, True ‘ Se registra el nuevo. dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & " /s", vbHide) End If ‘ Si no existe el fichero se instala directamente. Else objAux.CopyFile strINSTALLPATH & "\DLL's & OCX's\Server DLL's\" & strFileName, strWindowsFolder & "\" & strFileName, True 161 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & " /s", vbHide) End If Next ‘ Se liberan las instalacias empleadas. Set objD = Nothing Set objF = Nothing Set objAux = Nothing End Sub ‘ El siguiente procedimiento instala y registra los archivos Dll y ‘ OCX´s necesarios para la instalación en modo Cliente. Para ello se ‘ copian los archivos Dll y OCX´s necesarios de la carpeta “\DLL & ‘ OCX´s\CLientDll´s” del CD de instalación, aunque primero se ‘ comprueba que estos ficheros no los tiene ya instalados el cliente o ‘ si los tiene, que su versión sea más antigua que la que la ‘ aplicación va a instalar. En caso contrario no se instalarán. Para ‘ comparar las versiones entre dos ficheros se llama a la función ‘ CheckVersion que se explicará más adelante en este módulo. Public Sub installClientDlls() Dim objD As Scripting.FileSystemObject, File As Variant, objF As Variant Dim strFileName As String, objAux As FileSystemObject, intX As Integer, dblX As Double ‘ Se apunta a la carpeta del CD de instalación que contiene los ‘ ficheros a instalar. Set objD = New Scripting.FileSystemObject Set objF = objD.GetFolder(strINSTALLPATH & "\DLL's & OCX's\CLientDll's") Set objAux = New FileSystemObject ‘ Se hace un bucle que irá cogiendo uno a uno cada uno de los ‘ ficheros contenidos en la carpeta. For Each File In objF.Files strFileName = objAux.GetFileName(File) 162 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Si el fichero ya existe en la máquina del cliente se compara su ‘ versión y en caso de que sea más antigua que el del que se ‘ quiere instalar se borra y se instala el nuevo. If objAux.FileExists(strWindowsFolder & "\" & strFileName) Then ‘ La función CheckVersion devuelve TRUE si el fichero a ‘ instalar tiene una versión más actulizada. If CheckVersion(File, strWindowsFolder & "\" & strFileName) Then ‘ Se desregistra el antiguo. dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & "/u /s", vbHide) ‘ Se borra el antiguo. objAux.DeleteFile strWindowsFolder & "\" & strFileName, True ‘ Se copia el nuevo fichero. objAux.CopyFile strINSTALLPATH & "\DLL's & OCX's\CLientDll's\" & strFileName, strWindowsFolder & "\" & strFileName, True ' Se registra el nuevo fichero. dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & " /s", vbHide) End If ‘ Si no existe el fichero se instala directamente. Else objAux.CopyFile strINSTALLPATH & "\DLL's & OCX's\CLientDll's\" & strFileName, strWindowsFolder & "\" & strFileName, True dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & " /s", vbHide) End If Next ‘ Se liberan las instancias. Set objD = Nothing Set objF = Nothing 163 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Set objAux = Nothing End Sub ‘ El siguiente procedimiento instala (copia y registra) el fichero Dll ‘ o OCX dado por parámetro en el caso de que éste no esté instalado ya ‘ o sea una versión más reciente. En caso contrario no se instalará. ‘ Para comparar la versión del fichero se utiliza la función ‘ CheckVersion explicada más adelante en este módulo. Public Sub InstallOneDll(ByVal strDllPath As String) Dim strFileName As String, objAux As FileSystemObject Set objAux = New FileSystemObject strFileName = objAux.GetFileName(strDllPath) ‘ En el caso de que exista se mira si su versión es más antigua que ‘ la queremos instalar, sólo en ese caso se instalará el nuevo ‘ fichero. If objAux.FileExists(strWindowsFolder & "\" & strFileName) Then ‘ La función CheckVersion devuelve TRUE si el fichero a ‘ instalar tiene una versión más actulizada. If CheckVersion(strDllPath, strWindowsFolder & "\" & strFileName) Then ' Se desregistra el antiguo fichero. dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & "/u /s", vbHide) ' Se borra el viejo fichero. objAux.DeleteFile strWindowsFolder & "\" & strFileName, True ' Se copia el nuevo fichero. objAux.CopyFile strDllPath, strWindowsFolder & "\" & strFileName, True ' Se registra el nuevo fichero. dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & " /s", vbHide) End If 164 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Si no existe el fichero se instala directamente. Else objAux.CopyFile strDllPath, strWindowsFolder & "\" & strFileName, True dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & " /s", vbHide) End If End Sub ‘ El siguiente procedimiento Sub se encarga de instalar los ficheros ‘ necesarios para el correcto funcionamiento de la aplicación de ‘ instalación. Dichos ficheros irán en el CD de instalación dentro de ‘ la carpeta “DLL´s & OCX´s\installation OCX´s”. Actualmente sólo hay ‘ un fichero en dicha carpeta, que nos permite incluir la barra de ‘ progreso en la aplicación. Si un futuro se necesitan más ficheros ‘ tan sólo habrá que añadirlos a esta carpeta. Public Sub InstallSetUPOCX() Dim objD As Scripting.FileSystemObject, File As Variant, objF As Variant Dim strFileName As String, objAux As FileSystemObject, intX As Integer, dblX As Double ' Se apunta a la carpeta donde están los ficheros. Set objD = New Scripting.FileSystemObject Set objF = objD.GetFolder(strINSTALLPATH & "\DLL's & OCX's\installation OCX's") Set objAux = New FileSystemObject ‘ Se hace un bucle que irá cogiendo uno a uno cada uno de los ‘ ficheros contenidos en la carpeta. For Each File In objF.Files strFileName = objAux.GetFileName(File) ‘ Si el fichero ya existe en la máquina del cliente se compara su ‘ versión y en caso de que sea más antigua que el del que se ‘ quiere instalar se borra y se instala el nuevo. If objAux.FileExists(strWindowsFolder & "\" & strFileName) Then 165 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ La función CheckVersion devuelve TRUE si el fichero a ‘ instalar tiene una versión más actulizada. If CheckVersion(File, strWindowsFolder & "\" & strFileName) Then ‘ Se desregistra el antiguo fichero. dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & "/u /s", vbHide) ' Se borra el antiguo fichero. objAux.DeleteFile strWindowsFolder & "\" & strFileName, True ‘ Se copia el nuevo fichero. objAux.CopyFile strINSTALLPATH & "\DLL's & OCX's\installation OCX's\" & strFileName, strWindowsFolder & "\" & strFileName, True ' Se registra el nuevo fichero. dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & " /s", vbHide) End If ‘ Si no existe el fichero se instala directamente. Else objAux.CopyFile strINSTALLPATH & "\DLL's & OCX's\installation OCX's\" & strFileName, strWindowsFolder & "\" & strFileName, True dblX = Shell(strWindowsFolder & "\regsvr32.exe " & strWindowsFolder & "\" & strFileName & " /s", vbHide) End If Next ‘ Se liberan las instancias utilizadas. Set objD = Nothing Set objF = Nothing Set objAux = Nothing End Sub 166 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ La siguiente función compara la versión de los dos ficheros cuyas ‘ rutas se pasan como parámetro. Devolverá TRUE cuando la versión del ‘ primer parámetro (que será la versión del fichero que la aplicación ‘ está tratando de instalar) sea más actualizada. Para una mejor ‘ comprensión de la función se añade una explicación más detallada así ‘ como un ejemplo de funcionamiento en los anexos (Anexo 9.6) Public Function CheckVersion(ByVal strSetUpFile As String, ByVal strUserFile As String) As Boolean Dim intLength As Integer Dim intX As Integer Dim intFieldLength As Integer ‘ Con las iniciales NOF nos referimos a Number Of Fields, es decir ‘ al número de campos de la versión, por ejemplo 1.21.22 tendrá 3 ‘ campos y 1.2.232.4.6 tendrá 6. Dim intNOFUser As Integer Dim intNOFSetUp As Integer Dim intNOF As Integer Dim strUserField As String Dim strSetUpField As String Dim strUserVersion As String, strSetUpVersion As String Dim objF As FileSystemObject Set objF = New FileSystemObject ‘ Se coje la versión de los ficheros y se les añade un punto. strUserVersion = objF.GetFileVersion(strUserFile) & "." strSetUpVersion = objF.GetFileVersion(strSetUpFile) & "." ‘ Para obtener el número de campos de casa versión se utiliza la ‘ función NumberOfFields que se describirá posteriormente en el ‘ módulo VersionModify. intNOFUser = NumberOfFields(strUserVersion) intNOFSetUp = NumberOfFields(strSetUpVersion) ‘ Se hacen ambas versiones con el mismo número de campos, para lo ‘ que se utiliza la función IntroduceFields para introducir tantos ‘ campos de ceros como sean necesarios en la versión que menos ‘ tenga. Esta función será descrita posteriormente en el módulo 167 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ VersionVerify. If intNOFUser <> intNOFSetUp Then If intNOFUser < intNOFSetUp Then IntroduceFields strUserVersion, intNOFSetUp - intNOFUser intNOF = intNOFSetUp Else IntroduceFields strSetUpVersion, intNOFUser - intNOFSetUp intNOF = intNOFUser End If Else intNOF = intNOFUser End If ‘ Una vez que ambas versiones tienen la misma longitud, se comparan ‘ campo por campo hasta que se conozca cual es el más actualizado. For intX = 1 To intNOF ‘ Se toman ambos campos. strUserField = TakeField(strUserVersion, intX) strSetUpField = TakeField(strSetUpVersion, intX) ‘ Se rellena el pequeño con ceros a la izquierda. FillWithZeros strUserField, strSetUpField ‘ Se compara el número, y si hay diferencia se sale de la función ‘ diciendo si el de la aplicación es el más actualizado o no. If Val(strUserField) <> Val(strSetUpField) Then If Val(strUserField) > Val(strSetUpField) Then CheckVersion = False Exit Function Else CheckVersion = True Exit Function End If End If ‘ Se pasa al siguiente campo. Next ‘ Cuando no ha habido diferencias es que ambas versiones son 168 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ iguales, en tal caso se devuelve también FALSE como si la versión ‘ del fichero que tratamos de instalar fuera menos actualizada. CheckVersion = False End Function ‘ El procedimiento siguiente función crea la carpeta “Satcom ‘ Discovery” para lo que primero mira si ya existe, en cuyo caso ‘ primero la borra y luego instala una nueva. Public Sub InstallFolder() Dim objAux As FileSystemObject Set objAux = New FileSystemObject ‘ Chequea si ya existe la carpeta, en cuyo caso la borra. If objAux.FolderExists(strMasterDrive & "\Program Files\Satcom Discovery") Then objAux.DeleteFolder strMasterDrive & "\Program Files\Satcom Discovery", True ‘ Crea la carpeta “Satcom Discovery”. objAux.CreateFolder strMasterDrive & "\Program Files\Satcom Discovery" End Sub ‘ El siguiente procediento crea un acceso directo en la ubicación dada ‘ por strShortCutPath, ‘ strIconLocation y que usando enlaza el icono con la dado por aplicación la ruta dada por ‘ strTargetPath. Public Sub CreateShortCut(ByVal strShortCutPath, ByVal strTargetPath, ByVal strIconLocation) Dim myShell As IWshShell Dim myShortCut As IWshShortcut_Class Set myShell = New IWshShell_Class Set myShortCut = myShell.CreateShortCut(strShortCutPath) myShortCut.TargetPath = strTargetPath myShortCut.IconLocation = strIconLocation myShortCut.Save End Sub 169 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ La siguiente función devuelve la ruta del directorio de sistema de Windows. Public Function GetWindowsDirectory() As String Dim strDirectory As String, lngRet As Long ‘ Crea un buffer de 255 espacios strDirectory = Space(255) ‘ Se obtiene el directorio de Windows lngRet = GetSystemDirectory(strDirectory, 255) ‘ Se borran los caracteres innecesarios del buffer. strDirectory = Left$(strDirectory, lngRet) ‘ Se devuelve la ruta del directorio de sistema de Windows. GetWindowsDirectory = strDirectory End Function ‘ Esta función chequea si la aplicación dada por el parámetro ya ‘ existe en COM+, en cuyo caso devuelve TRUE, en caso contrario ‘ devolverá FALSE. Public Function ApplicationExists(ByVal AppName As String) As Boolean Dim cat As COMAdmin.COMAdminCatalog Set cat = New COMAdmin.COMAdminCatalog Dim apps As COMAdmin.COMAdminCatalogCollection Set apps = cat.GetCollection("Applications") apps.Populate ‘ Se enumeran las aplicaciones en busca de la que se pasa por ‘ parámetro. Dim app As COMAdmin.COMAdminCatalogObject For Each app In apps If app.Name = AppName Then ApplicationExists = True Exit Function End If Next app ApplicationExists = False End Function 170 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ El siguiente procedimiento Sub borra la aplicación dada por el ‘ parámetro de entre las aplicaciones de COM+. Public Sub DeleteApplication(ByVal AppName As String) Dim oAdmin As New COMAdmin.COMAdminCatalog Dim oApplications As COMAdmin.COMAdminCatalogCollection Dim oApplication As COMAdmin.COMAdminCatalogObject Set oApplications = oAdmin.GetCollection("Applications") oApplications.Populate Dim i As Integer While i < oApplications.Count If (oApplications.item(i).Name = AppName) Then oApplications.Remove (i) oApplications.SaveChanges Exit Sub End If i = i + 1 Wend End Sub 9.1.2.2 Módulo EditRegistry. ‘ Se especifica declaración explícita. Option Explicit ‘ Ahora se declaran las APIs empleadas para las tareas de edición del ‘ registro de Windows. ‘ La siguiente es una API que no se usa directamente, sino que es ‘ empleada cuando estamos depurando la aplicación en busca de algún ‘ posible error. Public Declare "FormatMessageA" Function (ByVal FormatMessage dwFlags As Long, Lib "kernel32" lpSource As Any, Alias ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long 171 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ La API siguiente nos permite establecer un valor en el registro. Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long ‘ Cada vez que queramos abrir una clave utilizaremos la siguiente API. ‘ Que tras abrir la clave nos devolverá en el parámetro phkResult el ‘ enlace para tratar con dicha clave y poder editarla. Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long ‘ Cada vez que una clave es creada o abierta, al finalizar con el ‘ trato que se quiera hacer con ella, se debe cerrar, para está tarea ‘ se utiliza la siguiente API. Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long ‘ Esta API crea una nueva clave en el registro. En el caso de que ésta ‘ ya exista, se limita a abrirla. Devuelve el enlace a dicha clave con ‘ el parámetro phkResult. Public Declare "RegCreateKeyA" Function (ByVal RegCreateKey hKey As Long, Lib ByVal "advapi32.dll" lpSubKey As Alias String, phkResult As Long) As Long ‘ La siguiente es la API que la aplicación utiliza cuando está ‘ intentando leer un valor del registro. Para ello se debe utilizar ‘ dos veces, en la primera devuelve el tipo del valor y su tamaño, y ‘ en la segunda devuelve el valor pedido. Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long ‘ La siguiente API es usada sólo en tareas de depuración y sirve para ‘ establecer el último número de error ocurrido. Public Declare Sub SetLastError Lib "kernel32" (ByVal dwErrCode As Long) 172 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Para el correcto funcionamiento de algunas de las APIs anteriores, ‘ se necesitan ciertas constantes que éstas usan como argumento en los ‘ casos que nos incumben. A estos valores se les suele asociar unas ‘ constantes globales para que así no haya que recordarlos. Son los ‘ siguientes. Public Const HKEY_CURRENT_USER = &H80000001 Public Const HKEY_LOCAL_MACHINE = &H80000002 Public Const REG_MULTI_SZ = 7 Public Const REG_SZ = 1 Public Const REG_BINARY = 3 Public Const REG_DWORD As Long = 4 Public Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000 Public Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100 Public Const LANG_NEUTRAL = &H0 Public Const SUBLANG_DEFAULT = &H1 Public Const ERROR_BAD_USERNAME = 2202& Public Const STANDARD_RIGHTS_ALL = &H1F0000 Public Const KEY_QUERY_VALUE = &H1 Public Const KEY_SET_VALUE = &H2 Public Const KEY_CREATE_SUB_KEY = &H4 Public Const KEY_ENUMERATE_SUB_KEYS = &H8 Public Const KEY_NOTIFY = &H10 Public Const KEY_CREATE_LINK = &H20 Public Const SYNCHRONIZE = &H100000 Public Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE)) ‘ Ahora vemos cada uno de los procedimientos y funciones que se alojan ‘ en este módulo. ‘ El siguiente procedimiento sólo se utiliza en tareas de depuración. ‘ Muestra en pantalla el error que tuvo lugar tratando de editar el ‘ registro. Public Sub RegDebugError(ByVal lngErrorNumber As Long) Dim Buffer As String ‘ Se crea un buffer donde irá la descripción del error. Buffer = Space(200) 173 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Se establece el último número de error. SetLastError ERROR_BAD_USERNAME ‘ Se obtiene la descripción del error. FormatMessage FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, lngErrorNumber, LANG_NEUTRAL, Buffer, 200, ByVal 0& ‘ Se muestra el error por pantalla. MsgBox Buffer End Sub ‘ El siguiente procedimiento establece un valor tipo REG_DWORD en el ‘ registro, concretamente dentro de la clave de Satcom. Se utiliza ‘ para marcar como instalados a los componentes y así poder ‘ notificarlo al usuario en la aplicación de instalación. Para ello ‘ se le pasa como parámetro el valor a almacenar y su nombre. Public Sub SetRegistryValue(ByVal strValueName As String, ByVal lngValue As Long) Dim lngAux As Long Dim ret ‘ Primero crea/abre la clave del registro. lngAux = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Satcom", ret) ‘ Ahora establece el valor. lngAux = RegSetValueEx(ret, strValueName, 0, REG_DWORD, lngValue, LenB(lngValue)) ‘ Finalmente, cierra la clave. RegCloseKey ret End Sub ‘ La siguiente función lee el contenido del valor de tipo REG_DWORD ‘ dado por parámetro en la clave de Satcom. De esta manera chequeamos ‘ si un determinado componente está instalado. Public Function ReadRegistryValue(ByVal strValueName) As Long Dim lngAux As Long, lngValueType As Long, lngSize As Long, lngValue As Long 174 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Dim lngData As Long Dim ret ‘ Se abre la clave de Satcom. lngAux = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Satcom", 0&, KEY_ALL_ACCESS, ret) ‘ si no hay error lngAux = 0. Entonces continuamos, utilzando la ‘ API RegQueryValue que como ya se comentó se debe utilizar dos ‘ veces. If lngAux = 0 Then lngAux = RegQueryValueEx(ret, strValueName, 0, lngValueType, ByVal 0, lngSize) ‘ Si no hay error lngAux = 0. Entonces se continua. If lngAux = 0 Then lngAux = RegQueryValueEx(ret, strValueName, 0, 0, lngData, lngSize) ‘ Si no hay error lngAux = 0. Se continua. If lngAux = 0 Then ‘ Se devuelve el valor pedido. ReadRegistryValue = lngData Else ‘ En caso de error se depura. RegDebugError (lngAux) End If Else ‘ En este caso el valor pedido no existe, así que se devuelve ‘ lngAux que valdrá 2. ReadRegistryValue = lngAux End If Else ‘ Se depura el error. RegDebugError (lngAux) End If 175 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Finalmente se cierra la clave. RegCloseKey ret End Function ‘ La siguiente función comprueba si la clave dada por el parámetro ‘ strKey existe o no, devolviendo TRUE en caso afirmativo. La clave se ‘ buscará o bien en la clave alta “Current User” o en “LocalMachine”, ‘ para especificar en cual de las dos buscar se utiliza el parámetro ‘ strhKey. Public Function RegKeyExists(ByVal strhKey As String, ByVal strKey As String) As Boolean Dim ret As Long, lngAux As Long ‘ Primero vemos el caso en que se quiera buscar en “LocalMachine”. If strhKey = "LocalMachine" Then ‘ Se intenta abrir la clave dada. lngAux = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strKey, 0, KEY_ALL_ACCESS, ret) ‘ Si clave no existe ret = 0. If ret = 0 Then ‘ Se cierra la clave y se devuelve FALSE. RegCloseKey ret RegKeyExists = False Else ‘ Se cierra la clave y se devuelve TRUE. RegCloseKey ret RegKeyExists = True End If ‘ Ahora procedemos igual para el caso en que se quiera buscar el ‘ “Current User”. ElseIf strhKey = "CurrentUser" Then ‘ Se intenta abrir la clave dada. lngAux = RegOpenKeyEx(HKEY_CURRENT_USER, strKey, 0, KEY_ALL_ACCESS, ret) 176 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Si la clave no existe ret = 0. If ret = 0 Then ‘ Se cierra la clave y se devuelve FALSE. RegCloseKey ret RegKeyExists = False Else ‘ Se cierra la clave y se devuelve TRUE. RegCloseKey ret RegKeyExists = True End If End If End Function ‘ Esta función comprueba si el valor dado por parámetro existe en el ‘ registro en la clave de Satcom. En caso afirmativo devuelve TRUE, ‘ sino FALSE. Se usa para chequear si se ha instalado previamente ‘ algún componente con el propósito de auto-rellenaar algunos text ‘ boxes. Public Function RegCheckValueExists(ByVal strValueName As String) As Boolean Dim lngAux As Long, lngValueType As Long, lngSize As Long Dim ret ‘ Primero se abre la clave de Satcom. lngAux = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Satcom", 0&, KEY_ALL_ACCESS, ret) ‘ Ahora se comprueba si el valor existe en la clave de Satcom. lngAux = RegQueryValueEx(ret, strValueName, 0, lngValueType, ByVal 0, lngSize) If lngAux <> 0 Then RegCheckValueExists = False Else RegCheckValueExists = True End If ‘ Finalmente se cierra la clave. RegCloseKey ret End Function 177 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Esta función devuelve en un tipo string el contenido de un valor ‘ tipo REG_SZ situado en la clave de Satcom. Es utilizada ‘ fundamentalmente para auto-rellenar text boxes con información de ‘ instalaciones previas. Public Function RegReadStringValue(ByVal strValueName As String) As String Dim lngAux As Long, lngValueType As Long, lngSize As Long, lngValue As Long Dim lngData As Long Dim strBuf As String, lngBufferSize As Long Dim ret ‘ Primero se abre la clave de Satcom. lngAux = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Satcom", 0&, KEY_ALL_ACCESS, ret) ‘ Si no hay error lngAux = 0. If lngAux = 0 Then lngAux = RegQueryValueEx(ret, strValueName, 0, lngValueType, ByVal 0, lngSize) If lngAux = 0 Then ‘ Ahora se crea un buffer con el tamaño dado por la API ‘ anterior. strBuf = String(lngSize, Chr$(0)) ‘ Se obtiene el valor. lngAux = RegQueryValueEx(ret, strValueName, 0, 0, ByVal strBuf, lngSize) If lngAux = 0 Then ‘ Se devuelve el valor. RegReadStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1) Else ‘ Se depura el error. RegDebugError (lngAux) End If Else ‘ En este caso no existe el valor pedido, por lo que se develve 178 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ lngAux que valdrá 2. RegReadStringValue = lngAux End If Else ‘ Se depura el error. RegDebugError (lngAux) End If ‘ Finalmente, se cierra la clave. RegCloseKey ret End Function ‘ El siguiente procedimiento Sub introduce un valor tipo REG_SZ ( que ‘ nos permite almacenar un dato tipo string)en la clave de Satcom. Se ‘ utiliza para almacenar información dada por el usuario de la ‘ aplicación para que se auto-rellene en lo sucesivo. Public Sub SetRegistryStringValue(ByVal strValueName As String, ByVal strValue As String) Dim lngAux As Long Dim ret ‘ Primero se crea/abre la clave de Satcom. lngAux = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Satcom", ret) ‘ Se almacena el valor. lngAux = RegSetValueEx(ret, strValueName, 0, REG_SZ, ByVal strValue, Len(strValue)) ‘ Se cierra la clave. RegCloseKey ret End Sub 9.1.2.3 Módulo EncrypFile. ‘ Se especifica declaración explícita. Option Explicit 179 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ El siguiente procedimiento Sub desencripta el fichero cuya ruta ‘ ‘ marca el desencriptada parámetro en el EncrypFile fichero y deposita marcado por la la información ruta dada por el ‘ parámetro Finalfile. Para llevar a cabo el desencriptado, se utiliza ‘ una clave dada por el parámetro strKey. Sub Unencryp_File(ByVal EncrypFile As String, ByVal FinalFile As String, ByVal strKey As String) Dim EncrypFileNumber As Integer Dim FinalFileNumber As Integer, counter As Integer Dim Line As String, Line_Enc As String, strTemp As String Dim strRubbish As String, strC As String * 1 Dim c As String * 1, test As Long Dim EndLine As Boolean, flag As Boolean ‘ Primero se abre el fichero encriptado. EncrypFileNumber = FreeFile Open EncrypFile For Random As #EncrypFileNumber Len = 1 ‘ Ahora se abre el fichero donde se pondrá la información ‘ desencriptada. FinalFileNumber = FreeFile Open FinalFile For Binary As #FinalFileNumber Len = 1 ‘ Empieza el desencriptado del fichero, para lo que se recorre cada ‘ uno de los caracteres que lo componen y se “traducen” utilizando ‘ la función UnEncrypter. While Not EOF(EncrypFileNumber) Get #EncrypFileNumber, , strC If Not (EOF(EncrypFileNumber)) Then Put #FinalFileNumber, , UnEncrypter(strC, strKey) Wend ‘ Finalmente se cierran ambos ficheros. Close #FinalFileNumber Close #EncrypFileNumber End Sub 180 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ La siguiente función desencripta el dato tipo string dado en el ‘ parámetro strC usando la clave dada por el parámetro strKey. Aunque ‘ se usa haciendo una transcripción carácter a carácter. Public Function UnEncrypter(ByVal strC As String, ByVal strKey As String) As String Dim intX As Integer Dim strCharacter As String ‘ Se lleva a cabo el encriptado. For intX = 1 To Len(strKey) strCharacter = Chr(Asc(strC) Xor Asc(Mid(strKey, (intX Mod Len(strKey) + 1))) Xor (intX Mod 256)) Next ‘ Se devuelve el valor desencriptado. UnEncrypter = strCharacter End Function 9.1.2.4 Módulo Reboot. ‘ Se especifica declaración explicita. Option Explicit ‘ Se decraran las constantes necesarias para el uso de las APIs. Private Const EWX_LOGOFF = 0 Private Const EWX_SHUTDOWN = 1 Private Const EWX_REBOOT = 2 Private Const EWX_FORCE = 4 Private Const TOKEN_ADJUST_PRIVILEGES = &H20 Private Const TOKEN_QUERY = &H8 Private Const SE_PRIVILEGE_ENABLED = &H2 Private Const ANYSIZE_ARRAY = 1 Private Const VER_PLATFORM_WIN32_NT = 2 ‘ Se crean las estructuras de datos necesarias. Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long 181 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Type LUID LowPart As Long HighPart As Long End Type Type LUID_AND_ATTRIBUTES pLuid As LUID Attributes As Long End Type Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES End Type ‘ Se declaran las APIs. ‘ Devuelve un enlace (handle) al proceso. Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long ‘ La siguiente API devuelve el identificador LUID que representa al ‘ privilegio en cuestión. Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long ‘ La siguiente API habilita o deshabilita el privilegio dado por el ‘ parámetro TokenHandle. Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long ‘ La siguiente API permite reiniciar el equipo. 182 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long ‘ La siguiente API obtiene información sobre el sistema. Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long ‘ La siguiente función detecta si el sistema funciona bajo Windows NT. Public Function IsWinNT() As Boolean Dim myOS As OSVERSIONINFO myOS.dwOSVersionInfoSize = Len(myOS) GetVersionEx myOS IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT) End Function ‘ Establece el privilegio de reinicio para la aplicación de ‘ instalación. Private Sub EnableShutDown() Dim hProc As Long Dim hToken As Long Dim mLUID As LUID Dim mPriv As TOKEN_PRIVILEGES Dim mNewPriv As TOKEN_PRIVILEGES hProc = GetCurrentProcess() OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID mPriv.PrivilegeCount = 1 mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED mPriv.Privileges(0).pLuid = fluid ‘ Se habilita el privilegio de reinicio para la actual aplicación. AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount) End Sub ‘ El siguiente procedimiento reinicia el sistema. Public Sub RebootNT(Force As Boolean) Dim ret As Long 183 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Dim Flags As Long Flags = EWX_REBOOT If Force Then Flags = Flags + EWX_FORCE If IsWinNT Then EnableShutDown ExitWindowsEx Flags, 0 End Sub 9.1.2.5 Módulo SerialNumber. ‘ Se especifica declaración explítica. Option Explicit ‘ Se declara la siguiente variable global que nos almacenará el número ‘ de veces que el cliente ha intentado teclear un código de desbloqueo ‘ correcto. Public intCounter As Integer ‘ La siguiente ‘ hexadecimal constante que será global usada a nos la especifica hora de crear una clave en un código de ‘ desbloqueo. Public Const strSatcomKey = "12345678909876543210" ‘ Ahora se declara la API que devuelve un número único, en concreto el ‘ número de formateo del master drive. Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _ ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, _ ByVal nFileSystemNameSize As Long) As Long ‘ La siguiente función devuelve el número de formato del disco dado ‘ por parámetro. Para ello usa la API GetVolumeInformation. Public Function DriveSerialNumber(ByVal strDrive As String) As Long Dim LongSerialNumber As Long, strCad1 As String, strCad2 As String strCad1 = String(255, vbNullChar) strCad2 = String(255, vbNullChar) GetVolumeInformation strDrive, strCad1, Len(strCad1), 184 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN LongSerialNumber, 0, 0, strCad2, Len(strCad2) DriveSerialNumber = LongSerialNumber End Function ‘ La siguiente función genera un número aleatorio hexadecimal encriptado con el último carácter del número de formato. Public Function RandomHex(ByVal strSerial) As String Dim intX As Integer intX = Int((15 * Rnd) + 1) RandomHex = Hex(intX Xor CInt(Val("&H" & Right(strSerial, 1)))) End Function ‘ La siguiente función genera el código del producto a partir del ‘ número de formato del master drive. El código creado tendrá una ‘ longitud de 44 caracteres y se generará dividiendo esa longitud en ‘ varios bloques funcionales. Public Function GetPreKey(ByVal strDrivePath As String) As String Dim strHexSerialNumber As String, strDisplaySN As String Dim LongSerialNumber As Long, intPadding As Integer, intX As Integer Dim strTemp As String, strRandomXOR As String, intReverseIndex As Integer ‘ Primero obtenemos el número de serie del formato del master drive. LongSerialNumber = DriveSerialNumber(strDrivePath) strHexSerialNumber = Hex(LongSerialNumber) intPadding = 20 - Len(strHexSerialNumber) ‘ La variable strDisplaySN será donde iremos colocando el código de ‘ producto. strDisplaySN = "" strRandomXOR = RandomHex(strHexSerialNumber) ‘ Se crea la cadena strTemp aleatoriamente a partir de ‘ strHexSerialNumber. For intX = 1 To Len(strHexSerialNumber) strTemp = strTemp & Hex(CInt(Val("&H" & Mid(strHexSerialNumber, intX, 1))) Xor CInt(Val("&H" & strRandomXOR))) 185 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Next ‘ A partir de ahora se va construyendo el código de producto ‘ (strDisplaySN). ‘ Primer trozo, primera parte (4 caracteres) strDisplaySN = strDisplaySN & RandomHex(strHexSerialNumber) & RandomHex(strHexSerialNumber) & strRandomXOR & RandomHex(strHexSerialNumber) ‘ Longitud de la mitad de la cadena más uno y más uno si la ‘ longitud es impar. intReverseIndex = ((Int(Len(strTemp) / 2)) + (Len(strTemp) Mod 2)) + 1 ‘ Se le añade al código la cadena strTemp del revés. For intX = 1 To (intReverseIndex - 1) strDisplaySN = strDisplaySN & Mid(strTemp, intReverseIndex - intX, 1) Next ‘ Primer trozo, segunda parte. Se rellena el trozo hasta alcanzar ‘ los 20 caracteres. For intX = 1 To intPadding strDisplaySN = strDisplaySN & RandomHex(strHexSerialNumber) Next ‘ Primer trozo, tercera parte.(24 caractereres) intReverseIndex = Len(strTemp) - ((Int(Len(strTemp) / 2))) (Len(strTemp) Mod 2) For intX = 1 To intReverseIndex strDisplaySN = strDisplaySN & Mid(strTemp, Len(strTemp) + 1 intX, 1) Next ‘ Segundo trozo. ‘ Ahora se añaden 15 caracteres sin importancia y uno con la XORKey, ‘ este último en la posición dada por el tercer carácter de ‘ strDisplaySN. 186 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN For intX = 1 To 16 If intX = CInt(Val("&H" & Mid(strDisplaySN, 3, 1))) Then strDisplaySN = strDisplaySN & strRandomXOR Else strDisplaySN = strDisplaySN & RandomHex(strHexSerialNumber) End If Next ‘ tercer trozo. ‘ Ahora un carácter sin importancia, y luego la longitud del número ‘ de serie encriptado con un XOR a strRandomXOR. Tras lo que se ‘ añaden 2 caracteres más sin importancia. strDisplaySN = strDisplaySN & RandomHex(strHexSerialNumber) & Hex(Len(strTemp) Xor CInt(Val("&H" & strRandomXOR))) strDisplaySN = strDisplaySN & RandomHex(strHexSerialNumber) & RandomHex(strHexSerialNumber) ‘ Se devuelve el código de producto (44 caracteres) GetPreKey = strDisplaySN End Function ‘ Esta función genera el código de desbloqueo, para lo que hace un XOR ‘ entre el código de producto dado por el parámetro strPreKey y sus ‘ caracteres número 2 y 41. Luego hace un XOR con la clave de Satcom ‘ dada por el parámetro strHexSatcomKey. Public Function GetProductKey(ByVal strPrekey As String, ByVal strHexSatcomKey As String) As String Dim strAux As String Dim strProductKey1 As String, intX As Integer Dim strProductKey2 As String, strProductKey As String Dim intY As Integer Dim strProductKey3 As String strProductKey1 = "" strProductKey2 = "" strProductKey = "" 187 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN strAux = "" ‘ Se hace el XOR con el carácter número 41. For intX = 1 To 44 strProductKey1 = strProductKey1 & Hex(CInt(Val("&H" & Mid(strPrekey, intX, 1))) Xor CInt(Val("&H" & Mid(strPrekey, 41, 1)))) Next ‘ Para evitar un XOR entre dos caracteres iguales. If Mid(strPrekey, 41, 1) = Mid(strPrekey, 2, 1) Then If Mid(strPrekey, 41, 1) <> "B" Then strAux = "B" Else strAux = "C" End If Else strAux = Mid(strPrekey, 2, 1) End If ‘ Se hace el XOR con el carácter número 2. For intX = 1 To 44 strProductKey2 = strProductKey2 & Hex(CInt(Val("&H" & Mid(strProductKey1, intX, 1))) Xor CInt(Val("&H" & strAux))) Next ‘ Ahora se hace el XOR con la clave de Satcom For intY = 1 To 44 strProductKey3 = strProductKey3 & Hex(CInt(Val("&H" & Mid(strProductKey2, intY, 1))) Xor CInt(Val("&H" & Mid(strHexSatcomKey, intX, 1)))) Next strProductKey = strProductKey3 strProductKey3 = "" ‘ Ahora el resto. For intX = 1 To Len(strHexSatcomKey) For intY = 1 To 44 188 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN strProductKey3 = strProductKey3 & Hex(CInt(Val("&H" & Mid(strProductKey, intY, 1))) Xor CInt(Val("&H" & Mid(strHexSatcomKey, intX, 1)))) Next strProductKey = strProductKey3 strProductKey3 = "" Next ‘ Se devuelve el código de desbloqueo. GetProductKey = strProductKey End Function 9.1.2.6 Módulo VersionVerify. ‘ Se especifica declaración explícita. Option Explicit ‘ La siguiente función devuelve el número de campos que tiene la ‘ versión dada por parámetro. Public Function NumberOfFields(ByVal strString As String) As Integer Dim intX As Integer Dim intCounter As Integer ‘ La siguiente variable almacenará el número de campos. intCounter = 0 For intX = 1 To Len(strString) If Mid(strString, intX, 1) = "." Then intCounter = intCounter + 1 Next NumberOfFields = intCounter End Function ‘ La siguiente función devuelve el campo dado por el número ‘ intFieldNumber de la versión dada por el parámetro strString. 189 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Public Function TakeField(ByVal strString As String, ByVal intFieldNumber As Integer) As String Dim intX As Integer Dim intCounter As Integer Dim strTemp As String strTemp = "" intX = 1 intCounter = 1 ‘ Nos situamos al principio del campo pedido. While (intCounter < intFieldNumber) If Mid(strString, intX, 1) = "." Then intCounter = intCounter + 1 intX = intX + 1 Wend ‘ Ahora se obtiene el campo pedido. While Mid(strString, intX, 1) <> "." strTemp = strTemp & Mid(strString, intX, 1) intX = intX + 1 Wend ‘ Se devuelve el campo pedido. TakeField = strTemp End Function ‘ El siguiente procedimiento obtiene dos campos a través de sus ‘ parámetros, tras lo que iguala sus longitudes rellenando con ceros a ‘ la izquierda el más corto. Estos campos son pasados como parámetros, ‘ pero por referencia, por lo que estos se verán modificados por las ‘ acciones del procedimiento. Public Sub FillWithZeros(ByRef strOne As String, ByRef strTwo As String) Dim intX As Integer, intDiff As Integer Dim intLen1 As Integer, intLen2 As Integer Dim strTemp As String strTemp = "" intLen1 = Len(strOne) 190 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN intLen2 = Len(strTwo) intDiff = Abs(intLen1 - intLen2) If intLen1 <> intLen2 Then If intLen1 < intLen2 Then For intX = 1 To intDiff strTemp = strTemp & "0" Next strTemp = strTemp & strOne strOne = strTemp Else For intX = 1 To intDiff strTemp = strTemp & "0" Next strTemp = strTemp & strTwo strTwo = strTemp End If End If End Sub ‘ El siguiente procedimiento Sub introduce tantos campos extras en la ‘ versión dada por el parámetro strVersion como indica el otro ‘ parámetro intNumberOfFields). La versión se pasa por referencia, por ‘ lo que el cambio acometido en este procedimiento se verá reflejado ‘ en la versión al terminar el procedimiento. Public Sub IntroduceFields(ByRef strVersion, ByVal intNumberOfFields) Dim intX As Integer For intX = 1 To intNumberOfFields strVersion = strVersion & "0." Next End Sub 9.1.2.7 Módulo de Clase IISVirtualDirectory. ‘ Se especifica declaración explícita. 191 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Option Explicit ‘ Se declaran las variablesglobales que se utilizan. Private mstrVirtualDirectoryName As String Private mstrPhysicalDirectoryName As String Private mstrApplicationOwner As String Private mstrLastError As String Private mboolAllowScriptsToRun As Boolean Private mboolRunApplicationInProcess As Boolean ‘ Se declaran las constantes globales. Private Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10 Private Const INVALID_HANDLE_VALUE = -1 Private Const MAX_PATH = 260 ‘ Se declaran las estructuras utilizadas. Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Private Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14 End Type Private Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type ‘ Declaramos las APIs. 192 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Private Declare Function "CreateDirectoryA" CreateDirectory (ByVal Lib lpPathName "kernel32" As Alias String, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long Private Declare Function CopyFile Lib "kernel32"Alias "CopyFileA" (ByVal lpExistingFileName As String,ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long Private Declare "FindFirstFileA" Function (ByVal FindFirstFile lpFileName As Lib "kernel32" Alias String,lpFindFileData As WIN32_FIND_DATA) As Long Private Declare "FindNextFileA" Function (ByVal FindNextFile hFindFile As Lib "kernel32" Alias Long,lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String,nSize As Long) As Long Private Declare Function lstrlenW Lib "kernel32"(ByVal lpString As Long) As Long ‘ Se declara la constante necesaria para las APIs. Private Const MAX_COMPUTERNAME As Long = 15 ‘ Se declaran las propiedades del objeto. Public Property Get RunApplicationInProcess() As Boolean RunApplicationInProcess = mboolRunApplicationInProcess End Property Public Property Let RunApplicationInProcess(ByVal boolRunApplicationInProcess As Boolean) mboolRunApplicationInProcess = boolRunApplicationInProcess End Property Public Property Get AllowScriptsToRun() As Boolean AllowScriptsToRun = mboolAllowScriptsToRun End Property 193 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Public Property Let AllowScriptsToRun(ByVal boolAllowScriptsToRun As Boolean) mboolAllowScriptsToRun = boolAllowScriptsToRun End Property Public Property Get LastError() As String LastError = mstrLastError End Property Public Property Let LastError(ByVal strLastError As String) mstrLastError = strLastError End Property Public Property Get ApplicationOwner() As String ApplicationOwner = mstrApplicationOwner End Property Public Property Let ApplicationOwner(ByVal strOwner As String) mstrApplicationOwner = strOwner End Property Public Property Get PhysicalDirectoryName() As String PhysicalDirectoryName = mstrPhysicalDirectoryName End Property Public Property Let PhysicalDirectoryName(ByVal strPhysicalDirectoryName As String) mstrPhysicalDirectoryName = strPhysicalDirectoryName End Property Public Property Get VirtualDirectoryName() As String VirtualDirectoryName = mstrVirtualDirectoryName End Property Public Property Let VirtualDirectoryName(ByVal strVirtualDirectoryName As String) mstrVirtualDirectoryName = strVirtualDirectoryName End Property ‘ Se declaran las funciones y procedimientos. 194 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Crea directorios anidados en el disco. Private Function CreateNestedFoldersByPath(ByVal completeDirectory As String) As Integer Dim r As Long Dim SA As SECURITY_ATTRIBUTES Dim drivePart As String Dim newDirectory As String Dim item As String Dim sfolders() As String Dim pos As Integer Dim x As Integer ‘ Debe tener un carácter “\” para la siguiente rutina. If Right$(completeDirectory, 1) <> "\" Then completeDirectory = completeDirectory & "\" End If pos = InStr(completeDirectory, ":") If pos Then drivePart = GetPart(completeDirectory, "\") Else: drivePart = "" End If Do Until completeDirectory = "" item = GetPart(completeDirectory, "\") ReDim Preserve sfolders(0 To x) As String If x = 0 Then item = drivePart & item sfolders(x) = item x = x + 1 Loop ‘ Ahora crea los directorios. x = -1 Do x = x + 1 SA.nLength = LenB(SA) Call CreateDirectory(newDirectory, SA) Loop Until x = UBound(sfolders) 195 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN CreateNestedFoldersByPath = x + 1 End Function ‘ Esta función separa un string por el parámetro delimiter, aisla una ‘ parte y acórta la cadena para que la siguiente parte este preparada ‘ para borrarse. Private Function GetPart(startStrg As String, delimiter As String) As String Dim c As Integer Dim item As String c = 1 Do If Mid$(startStrg, c, 1) = delimiter Then item = Mid$(startStrg, 1, c) startStrg = Mid$(startStrg, c + 1, Len(startStrg)) GetPart = item Exit Function End If c = c + 1 Loop End Function ‘ Esta es la función principal del módulo y en donde se introducen los ‘ cambios necesarios para establecer nuestra configuración. Public Function Create() As Boolean Dim objIIS As Object Dim objVirtualDirectory As Object Dim strACLCommand As String On Error GoTo errHandle On Error Resume Next Set objIIS = GetObject("IIS://localhost/W3SVC/1/Root/" & mstrVirtualDirectoryName) If Err.Number = 0 Then mstrLastError = "An application with this name already exists" 196 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Aquí introducimos que si el directorio virtual ya existe, que ‘ se borre. Set objIIS = GetObject("IIS://localhost/W3SVC/1/Root") Set objVirtualDirectory = objIIS.Delete("IISWebVirtualDir", mstrVirtualDirectoryName) End If Set objIIS = Nothing On Error GoTo 0 ‘ Se crea la aplicación IIS. Set objIIS = GetObject("IIS://localhost/W3SVC/1/Root") ‘ Se testea para ver si la carpeta existe en el sistema de ficheros, ‘ sino se crea. If Not FolderExists(mstrPhysicalDirectoryName) Then CreateNestedFoldersByPath mstrPhysicalDirectoryName End If ‘ Crea la carpeta en el sistema de archivos. Set objVirtualDirectory = objIIS.Create("IISWebVirtualDir", mstrVirtualDirectoryName) objVirtualDirectory.AccessScript = IIf(mboolAllowScriptsToRun, "True", "False") 'bolScriptPermissions objVirtualDirectory.path = mstrPhysicalDirectoryName ‘ Aquí introducimos nuestros requisitos de configuración. objVirtualDirectory.AspScriptTimeout = 900 objVirtualDirectory.AspSessionTimeout = 10080 objVirtualDirectory.SetInfo objVirtualDirectory.AppCreate mboolRunApplicationInProcess strACLCommand = "cmd /c echo y| CACLS " strACLCommand = strACLCommand & mstrPhysicalDirectoryName strACLCommand = strACLCommand & " /E /G " & mstrApplicationOwner & ":C" 197 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN Shell strACLCommand, vbHide Create = True exitPoint: Set objVirtualDirectory = Nothing Exit Function errHandle: mstrLastError = "Unexpected error occured in CreateVirtualDirectory" & vbCrLf & GetVBError() GoTo exitPoint End Function ‘ Ahora se declaran otras funciones de las que hace uso la función ‘ Create tanto directa como indirectamente. Private Function GetVBError() As String Dim szMsg As String szMsg = "Error # : " & Err.Number szMsg = szMsg & vbTab & "Description : " & Err.Description szMsg = szMsg & vbTab & "Source : " & Err.Source If Err.LastDllError <> 0 Then szMsg = szMsg & vbTab & "DLL Error : " & Err.LastDllError End If GetVBError = szMsg End Function ‘ Esta función comprueba si la carpeta existe. Private Function FolderExists(ByVal sFolder As String) As Boolean Dim hFile As Long Dim WFD As WIN32_FIND_DATA ‘ Borra el carácter “\”. sFolder = UnQualifyPath(sFolder) ‘ Llama a la API pasandole la carpeta. hFile = FindFirstFile(sFolder, WFD) 198 ANEXO: CÓDIGO DE LA APLICACIÓN DE INSTALACIÓN ‘ Se mira si la carpeta existe. FolderExists = (hFile <> INVALID_HANDLE_VALUE) And _ (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) Call FindClose(hFile) End Function Private Function UnQualifyPath(ByVal sFolder As String) As String sFolder = Trim$(sFolder) If Right$(sFolder, 1) = "\" Then UnQualifyPath = Left$(sFolder, Len(sFolder) - 1) Else: UnQualifyPath = sFolder End If End Function Private Sub Class_Initialize() mboolRunApplicationInProcess = True mboolAllowScriptsToRun = True mstrApplicationOwner = "IUSR_" & GetLocalComputerName() End Sub ‘ La siguiente función devuelve el nombre del ordenador. Private Function GetLocalComputerName() As String Dim tmp As String ‘ Devuelve el nombre del ordenador. tmp = Space$(MAX_COMPUTERNAME) If GetComputerName(tmp, Len(tmp)) <> 0 Then GetLocalComputerName = TrimNull(tmp) End If End Function ‘ Recorta la cadena Private Function TrimNull(startstr As String) As String TrimNull = Left$(startstr, lstrlenW(StrPtr(startstr))) End Function 199 ANEXO: CÓDIGO DE LA APLICACIÓN DE ENCRIPTACIÓN 9.2 Código de la Aplicación de Encriptación. En este anexo se incluirá todo el código desarrollado en la Aplicación de Encriptación, la cual consta de un formulario y de un módulo. Este código esta debidamente comentado para que su lectura y su seguimiento pueda ser entendida sin mucha dificultad. Para lo que los comentarios se han introducido siguiendo la nomenclatura particular de Visual Basic. Esto es, se considera un comentario todo aquello que vaya precedido en su línea por el carácter “ ‘ “. Aun así, para que no haya posibilidad de confusión, los comentarios aparecerán con letra cursiva. 9.2.1 Formulario frmEncrypt. ‘ Se especifica declaración explícita. Option Explicit ‘ El siguiente código gestiona el botón “Encryp”, y lo que hace es ‘ llamar al procedimiento Enc_File para que encripte el fichero ‘ elegido por el usuario y que el resultado lo ponga en la ruta pasada ‘ como segundo parámetro (también elegida por el usuario). Por último, ‘ se le pasa como tercer parámetro la clave utilizada para la ‘ encriptación. Private Sub cmdEncryp_Click() ‘ Llama al procedimiento para que encripte el fichero. Call Enc_File(Text1.Text, Text2.Text, "aaaaaaaaaaaaaaaaa") ‘ Muestra el mensaje indicando que se ha realizado la encriptación. MsgBox "DONE!!!!!" End Sub ‘ El siguiente procedimiento Sub se ejecuta cuando el usuario pulsa ‘ sobre el botón “Unencryp”. Entonces, llama al procedimiento ‘ Unencryp_File (definido en el módulo) y le pasa como parámetros la 200 ANEXO: CÓDIGO DE LA APLICACIÓN DE ENCRIPTACIÓN ‘ ruta del fichero encriptado, la ruta donde se quieren el ‘ desencriptado y la clave utilizada en la encriptación. Private Sub cmdUnencryp_Click() ‘ Se llama al procedimiento para desencriptar. Call Unencryp_File(Text2.Text, Text3.Text, "aaaaaaaaaaaaaaaaa") ‘ Se muestra el mensaje indicando que la desencriptación ha ‘ terminado. MsgBox "DONE!!!!!" End Sub 9.2.2 Módulo EncrypModule. ‘ Se especifica declaración explícita. Option Explicit ‘ El siguiente procedimiento Sub encripta el fichero dado por el ‘ primer parámetro y lo guarda en la ruta dada por el segundo ‘ parámetro. Para ello utiliza la clave dada por el tercer parámetro. ‘ Para realizar la encriptación, hará uso de la función Encryp, que se ‘ estudiará posteriormente. Sub Enc_File(ByVal OriginFile As String, ByVal DestinationFile As String, ByVal Key As String) Dim FileOriginNumber As Integer, FileDestinationNumber As Integer Dim strC As String * 1, intx As Long ‘ Se abren los ficheros. FileOriginNumber = FreeFile Open OriginFile For Binary As #FileOriginNumber Len = 1 FileDestinationNumber = FreeFile Open DestinationFile For Binary As #FileDestinationNumber Len = 1 ‘ Se realiza la encriptación. While Not EOF(FileOriginNumber) Get #FileOriginNumber, , strC If Not (EOF(FileOriginNumber)) Then Put #FileDestinationNumber, , 201 ANEXO: CÓDIGO DE LA APLICACIÓN DE ENCRIPTACIÓN Encrypter(Key, strC) Wend ‘ Se cierran los ficheros. Close #FileOriginNumber Close #FileDestinationNumber End Sub ‘ La siguiente función encripta la cadena dada por el segundo ‘ parámetro utilizando para ello la clave dada por el primero. Public Function Encrypter(ByVal strKey As String, ByVal strC As String) As String Dim intx As Integer, strCharacterAux As String, strCharacter As String Dim strAux As String ‘ Se realiaza la encriptación. For intx = 1 To Len(strKey) strCharacter = Chr(Asc(strC) Xor Asc(Mid(strKey, (intx Mod Len(strKey) + 1))) Xor (intx Mod 256)) Next ‘ Se devuelve el carácter encriptado. Encrypter = strCharacter End Function ‘ El siguiente ‘ desencriptación procedimiento del fichero Sub se dado por encarga el de primer liderar la parámetro y ‘ almacenarlo en el fichero dado por el segundo parámetro. Para ello ‘ utiliza la clave dada por el tercer parámetro. Hace uso de la ‘ función Unencrip, que se describirá posteriormente. Sub Unencryp_File(ByVal EncrypFile As String, ByVal FinalFile As String, ByVal strKey As String) Dim EncrypFileNumber As Integer Dim FinalFileNumber As Integer, counter As Integer Dim Line As String, Line_Enc As String, strTemp As String Dim strRubbish As String, strC As String * 1 Dim c As String * 1, test As Long Dim EndLine As Boolean, flag As Boolean 202 ANEXO: CÓDIGO DE LA APLICACIÓN DE ENCRIPTACIÓN ‘ Se abre el fichero encriptado. EncrypFileNumber = FreeFile Open EncrypFile For Random As #EncrypFileNumber Len = 1 ‘ Se abre el fichero destino (desencriptado). FinalFileNumber = FreeFile Open FinalFile For Binary As #FinalFileNumber Len = 1 ‘ Ahora se comienza con la desencriptación. While Not EOF(EncrypFileNumber) Get #EncrypFileNumber, , strC If Not (EOF(EncrypFileNumber)) Then Put #FinalFileNumber, , UnEncrypter(strC, strKey) Wend ‘ Se cierran los ficheros. Close #FinalFileNumber Close #EncrypFileNumber End Sub ‘ Esta función devuelve el desencriptado de la cadena dada por el ‘ primer parámetro utilizando la clave dada por el segundo parámetro. Public Function UnEncrypter(ByVal strC As String, ByVal strKey As String) As String Dim intx As Integer Dim strCharacter As String For intx = 1 To Len(strKey) strCharacter = Chr(Asc(strC) Xor Asc(Mid(strKey, (intx Mod Len(strKey) + 1))) Xor (intx Mod 256)) Next ‘ Se devuelve el carácter desencriptado. UnEncrypter = strCharacter End Function 203 ANEXO: CÓDIGO DE LA APLICACIÓN DEL CÓDIGO DE DESBLOQUEO 9.3 Código de la Aplicación del Código de Desbloqueo. En este anexo se incluirá todo el código desarrollado en la Aplicación del Código de Desbloqueo, la cual consta de un formulario y de un módulo. En este caso el módulo no difiere del ya explicado en el módulo Serial Number, visto en el anexo 9.1.2.5, por lo que no se volverá a mostrar. Este código esta debidamente comentado para que su lectura y su seguimiento pueda ser entendida sin mucha dificultad. Para lo que los comentarios se han introducido siguiendo la nomenclatura particular de Visual Basic. Esto es, se considera un comentario todo aquello que vaya precedido en su línea por el carácter “ ‘ “. Aun así, para que no haya posibilidad de confusión, los comentarios aparecerán con letra cursiva. 9.3.1 Formulario frmProductKeyMaker. ‘ Se especifica declaración explícita. Option Explicit ‘ El procedimiento Sub siguiente gestiona el funcionamiento del botón ‘ para generar el código de desbloqueo. Para ello se utiliza la ‘ función GetProductKey ubicada en el módulo. Private Sub cmdGetProductKey_Click() txtProductKey.Text = GetProductKey(txtPrekey.Text, txtKey.Text) End Sub 204 ANEXO: TRANSACT-SQL Y OSQL/ISQL 9.4 TRANSACT-SQL y OSQL/ISQL. Microsoft SQL Server y su versión reducida MSDE, vienen dotados de un lenguaje de programación y de consulta propio a través del que se pueden crear funciones y procedimientos adecuados para el manejo de la información almacenada en la base de datos. Este lenguaje de programación es el Transact-SQL. SQL es un juego de comandos que nos permite especificar la información que queremos recuperar o modificar. Con Transact-SQL, podemos acceder a los datos y consultar, actualizar y administrar un sistema de base de datos relacional. Existen estándares para SQL definidos por el Instituto Nacional Americano de Normalización (ANSI) y la Organización Internacional de Normalización (ISO) y el lenguaje Transact-SQL los soporta. La utilidad OSQL/ISQL nos permite ejecutar consultas o archivos de comandos Transact-SQL desde el símbolo del sistema. Para ello utiliza la conectividad abierta de bases de datos (ODBC) para comunicar con el servidor. La utilidad se inicia directamente desde el sistema operativo con la opción de distinguir mayúsculas de minúsculas. Después de iniciarse, OSQL/ISQL acepta comandos Transact-SQL y los envía interactivamente a SQL Server o MSDE. Los resultados de tales operaciones son formateados y mostrados por pantalla. La utilidad ISQL es similar a la OSQL pero más antigua, el motivo de su uso es que puede que el cliente disponga de un sistema de base de datos SQL antiguo. Aun así, en general es aconsejable el uso de OSQL en vez de ISQL, aunque para el uso que le damos en nuestra aplicación no presenta ninguna ventaja. La sintaxis de los comandos OSQL e ISQL es similar, con lo que se especificará en este anexo sólo la de OSQL, que es la siguiente: 205 ANEXO: TRANSACT-SQL Y OSQL/ISQL - Sintaxis: osql -U login_id [-e] [-E] [-p] [-n] [-d db_name] [-Q "query"] [-q "query"] [-c cmd_end] [-h [-t time_out] [-m [-H headers] server_name] [-i column_width] error_level] wksta_name] [-S [-w input_file] [-I] [-L] [-P [-o [-?] [-s col_separator] [-r {0 password] output_file] [-u] [-a | 1}] [-R] packet_size] [-b] [-O] [-l time_out] - Argumentos: -U login_id Es el identificador de usuario. Se distingue entre mayúsculas y minúsculas. -e Se activa el “eco”. -E Se usa una conexión de confianza en vez de requerir alguna contraseña. -p Se imprimen estadísticas del proceso. -n Se elimina la numeración y el prompt del sistema (>) de las líneas de entrada. -d db_name Se emite una sentencia db_nombre cuando osql es iniciado. -Q "query" Ejecuta una consulta e inmediatamente después sale de osql. -q "query" Ejecuta una consulta cuando se inicia osql pero no se sale cuando ésta termina. -c cmd_end Especifica el comando terminador. Por defecto, los comandos son terminados y mandados al servidor SQL introduciendo la palabra GO. -h headers Especifica el número de filas a imprimir entre las cabeceras de las columnas. 206 ANEXO: TRANSACT-SQL Y OSQL/ISQL -w column_width Permite al usuario fijar el ancho de pantalla para la salida. Por defecto son 80 caracteres. -s col_separator Especifica el carácter separador de columnas. Por defecto es un espacio en blanco. -t time_out Especifica el número de segundos tras el que un comando expira. -m error_level Este parámetro sirve para personalizar los mensajes de error. -I Fija la opción de conexión QUOTED_IDENTIFIER a activa. -L Lista los servidores localmente configurados y los nombres de los servidores que actúan en la red. -? Muestra un sumario de la sintaxis de osql. -r {0 | 1} Redirecciona la salida de los mensajes a la pantalla (stderr). Si no se especifica un parámetro, o si se especifica 0, entonces sólo los mensajes de error con un nivel superior a 17 o mayores serán redireccionados. Si se especifica 1, todos los mensajes de salida (incluyendo “print”) serán redireccionados. -H wksta_name Es el nombre de la estación de trabajo. Éste es almacenado en sysprocesses.hostname y es mostrado por pantalla por sp_who. Si no se especifica, se supone que es el nombre del ordenador. -P password Es una contraseña de usuario. Si no se usa la opción –P se preguntará por una. -R Especifica que el driver ODBC del servidor SQL usa la configuración del cliente cuando tenga que convertir monedas, fechas y horas a información de carácter. 207 ANEXO: TRANSACT-SQL Y OSQL/ISQL -S server_name Especifica el nombre del servidor SQL al que conectarse. Este nombre es el nombre del ordenador en la red. Esta opción es necesaria si se está ejecutando osql desde un ordenador remoto en la red. -i input_file Identifica el fichero que contiene un conjunto de declaraciones SQL o procedimientos almacenados. -o output_file Identifica al fichero que recibe la salida de osql. -u Especifica que el fichero de salida anterior es guardado en un formato Unicode, sin tener en cuenta el formato del fichero de entrada. -a packet_size Permite solicitar un paquete de diferente tamaño. Este tamaño podrá ocupar desde 512 a 65535. -b Especifica que se salga de osql y se vuelva a un valor DOS ERRORLEVEL cuando ocurra un error. El valor devuelto a la variable DOS ERRORLEVEL es 1 cuando el mensaje de error del servidor SQL tiene un rango de 10 o mayor; de otro modo el valor devuelto es 0. -O Especifica que se desactiven caracteristicas de osql para poder adecuar el comportamiento al de versiones anteriores de isql. -l time_out Especifica el número de segundos antes de que una entrada osql expire. Si no se especifica ningún valor, el comando permanece activo indefinidamente. El valor por defecto para hacer un login a osql es de 15 segundos. 208 ANEXO: VISOR DE API´s Y DECLARACIÓN DE API´s EN VISUAL BASIC 9.5 Visor de API´s y declaración de API´s en VisualBasic. En el desarrollo de este proyecto se ha empleado el lenguaje de programación Visual Basic 6.0, que viene englobado en el paquete integrado de desarrollo Microsoft Visual Studio 6.0. Con la instalación de esté sistema, se facilita una herramienta de gran utilidad a la hora de integrar en las aplicaciones las capacidades del sistema operativo utilizando el Interfaz de Programación de Usuario (API). Para poder usar estas funciones, necesitamos saber en que librería dinámica (Dll) se encuentran y cual es la lista de parámetros que manejan. Para poder llamar a una función exterior (API) desde Visual Basic es preciso escribir una sentencia de declaración, en la cual se indica la librería y el nombre de la función, así como la lista de sus parámetros. Con el fin de simplificar esta tarea, ya que la declaración de algunas funciones es realmente compleja, Visual Studio cuenta con una herramienta externa conocida como Visor de texto API. Con ella es fácil encontrar la función deseada, copiar la declaración al portapapeles y pegarlo en el editor de código de Visual Basic. 209 ANEXO: VISOR DE API´s Y DECLARACIÓN DE API´s EN VISUAL BASIC Figura 9.5. Visor de texto API. Disponiendo de la declaración de la función, utilizar una API de Windows será como usar cualquier otra función propia de la aplicación que estamos desarrollando. 210 ANEXO: EJEMPLO DE FUNCIONAMIENTO DE LA FUNCIÓN CHECKVERSION 9.6 Ejemplo de funcionamiento de la función CheckVersion. La declaración de la función es la siguiente: CheckVersion(Byval strSetUpFile As string, Byval strUserFile as string). Y su cometido es comparar la versión de los dos ficheros dados como parámetro y devolver TRUE en el caso en que el primero de ellos, es decir el que está tratando de instalar la aplicación, es más actualizado. En caso contrario devolverá el valor booleano FALSE. Para hacer la comparación, primero la función obtiene la versión de los dos ficheros que se le pasan por parámetro, tras lo que comprueba que ambos tienen versiones con el mismo número de campos. En caso de que no lo tengan, incluye en la versión del fichero que tenga menos tantos campos rellenos de ceros como sean necesarios para igualar el número de campos y así poder comparar ambas versiones. Por ejemplo, si una versión es 2.31.12.03 y la otra 1.2.3, entonces la función toma ambas, las guarda en unas variables locales para tratarlas y luego añade a la segunda tantos campos de ceros como sean necesarios, en este caso uno, quedando la segunda versión 1.2.3.0. Una vez que ambas versiones son comparables, se hace un bucle que mira campo tras campo. El proceso llevado en el bucle es coger el campo de las dos versiones marcado por el índice del bucle y compararlos. En el caso de que los campos tengan distinta longitud, se rellena con ceros a la izquierda el que sea menor hasta que ambos sean comparables y luego se comparan. En el momento en el que dos campos difieran se detectará cual es más actual y se saldrá de la función. En nuestro ejemplo el bucle haría lo siguiente: 211 ANEXO: EJEMPLO DE FUNCIONAMIENTO DE LA FUNCIÓN CHECKVERSION Versión del fichero de Índice del Bucle la Aplicación (2.31.12.03) 1. Tomando el campo 1. Comparando Versión Actual del Usuario (1.2.3.0) 2 1 Más actualizado. Menos actualizado. La función devuelve TRUE Veámoslo ahora con otro ejemplo: Versión del fichero de Índice del Bucle la aplicación (2.31.12.03) 1. Tomando el campo Versión Actual del Usuario (2.2.12.03) 2 2 Iguales Iguales 31 2 31 02 Más actualizado. Menos actualizado 1. Como ambos tienen el mismo tamaño, no es necesario el rellenado de ceros. 1. Comparando 2. Tomando el campo 2. Rellenando con ceros 2. Comparando La función devuelve TRUE Cuando se da el caso que ambas versiones son exactamente iguales, la función devolverá FALSE, respetándose así la configuración del usuario y no instalándose el fichero procedente de la Aplicación de Instalación. 212 BIBLIOGRAFÍA 10. Bibliografía. Para la realización de este proyecto fue necesario un intenso período de investigación, donde se consultaron tanto libros como páginas Web y canales de charla (Chats) especializados. - Libros y manuales: [1] Microsoft Corporation, “Mastering Enterprise Development Using Visual Basic 6”, Microsoft eLearning. [2] Microsoft Corporation, “Programming a Microsoft® SQL Server™ 2000 Database”, Microsoft Corporation. [3] Microsoft Corporation, “Microsoft® Visual Basic® 6.0, Guía de herramientas y componentes”, McGraw-Hill. [4] Microsoft Corporation, “Microsoft® Visual Basic® 6.0, referencia de controles”, McGraw-Hill. [5] Christian Wenz,Christian Trennhaus,Andreas Kordwig, “ASP, Active Server Pages”, Marcombo Boixareu Editores. - Páginas Web consultadas: [1] www.programacion.com [2] www.visualbasicforum.com [3] www.mentalis.org [4] support.microsoft.com 213