Descargar - Biblioteca de Ingeniería

Anuncio
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
Descargar