| |
REDESII | | |
Los Servicios de MTS
Una vez que incluimos nuestros componentes COM bajo el ámbito de Microsoft Transaction Server obtenemos
los
siguientes servicios:
Administración de objetos COM. MTS ofrece un sistema de información sobre las llamadas y el estado de
nuestros
componentes. Si llamamos a un Componente COM que no está incluido dentro de MTS no tenemos forma de
saber
cuantos objetos están instanciados o cual es el estado de nuestros objetos. MTS captura todas la llamadas
COM/DCOM a
nuestro componente y de esta forma nos permite gestionarlo y monitorizarlo de forma mucho más fácil.
Seguridad. Por medio de MTS podemos definir de forma sencilla que usuarios o grupos de usuarios pueden
llamar a nuestro
Componente COM. MTS permite que nuestro componente, independientemente del usuario que esté invocando
al objeto,
se ejecute en el contexto de seguridad de un usuario que nosotros hemos definido.
Gestión de recursos. MTS gestionará por nosotros algunos recursos como son la creación de threads, las
conexiones
ODBC o OLE/DB a base de datos o la instanciación de objetos. De esta forma se realiza una mejor y más
optima utilización
de estos recursos.
Gestión de Transacciones. Si estamos desarrollando un sistema con accesos a un gestor de base de datos
podemos utilizar
MTS para gestionar por nosotros las transacciones. MTS soporte la gestión de transacciones desde componentes
COM a
SQL Server y a bases de datos que sigan el protocolo XA y que tengan un Driver ODBC o un OLE/DB Provider
que
soporten esta especificación, por ejemplo Oracle. Desgraciadamente Visual FoxPro no soporta esta especificación
y las
transacciones de base de datos deberán ser manejadas desde nuestro código, ya que MTS no lo hará por
nosotros.
Distribución de Componentes COM. Una de las facilidades que ofrece MTS es la de crear una pequeñas instalaciones
para
instalar nuestros componentes COM en otros servidores MTS de forma sencilla y, lo que para mi es más
importante, para
configurar las estaciones clientes para llamar a nuestros objetos en el servidor por medio de DCOM.
Aplicaciones Web
A la hora de desarrollar aplicaciones para el entorno Web es donde mejor se ve la necesidad de un desarrollo
en tres
niveles. Si utilizamos un servidor Web como Internet Information Server podemos hacer uso de la tecnología
de las Active
Server Pages para llamar a nuestros componentes COM:
Cliente. Un browser Internet para interpretar formularios HTML y lenguajes de Script. Puede ser
Netscape Navigator o
Microsoft Internet Explorer, si bien existen importantes diferencias entre ellos.
Conexión Cliente / Servidor de Lógica. Protocolo HTTP sobre TCP/IP. Si el cliente es Internet
Explorer se puede
utilizar RDS para realizar conexiones DCOM sobre HTTP y acceder a Recordset de ADO desde el browser.
Servidor de Lógica. Windows NT con MTS y componentes COM desarrollados en Visual FoxPro.
Conexión Servidor Lógica / Servidor Datos. ADO y OLE/DB Provider para SQL Server.
Servidor de Datos. Windows NT con SQL Server que contiene los datos y procedimientos almacenados
para acceder a
los mismos.
VFP y los Componentes COM
Hasta aquí hemos realizado una introducción “muy teórica” de las posibilidades que nos ofrece el desarrollo
en tres niveles
siguiendo la arquitectura Windows DNA. Ahora haremos un repaso a la forma en la que Visual FoxPro puede
utilizar estas
tecnologías.
Un viejo amigo: CREATEOBJECT()
Desde la versión 3.0 de Visual FoxPro es posible llamar a componentes COM por medio de la orden CREATEOBJECT().
Esta función sirve para crear objetos a partir de clases desarrolladas en Visual FoxPro en ficheros
PRG o VCX y para crear
objetos a partir de componentes COM.
Existen algunas diferencias cuando llamamos a CREATEOBJECT() para crear un objeto a partir de una clase
de Visual
FoxPro y un componente COM: en las clases sólo utilizamos el nombre de la clase y en el caso de los
componentes COM
debemos utilizar un identificador del tipo CLSID o PROGID del componente COM con el formato
"NombreAplicacion.Clase". 2) Las clases de Visual FoxPro pueden recibir parámetros en el evento
INIT por medio de la
función CREATEOBJECT, pero los componentes COM no.
Un nuevo amigo: CREATEOBJECTEX()
En Visual FoxPro 6.0 ha aparecido una nueva función para llamar a un componente COM de forma remota
especificando el
servidor en el que este reside: CREATEOBEJECTEX().
Esta función tiene una sintaxis similar a esta: CREATEOBJECTEX(cCLSID | cPROGID, cNombreEquipo). Por
medio de
DCOM se realizará una conexión a este servidor y, si este lo permite, se creará un objeto que se ejecutará
en el servidor
indicado.
En las versiones anteriores de Visual FoxPro se puede hacer uso de DCOM configurando de forma “estática”
definiendo en
que equipo en el que reside un componente por medio de la utilidad DCOMCNFG. En Visual FoxPro 6.0 podemos
elegir
de forma "dinámica" en servidor queremos instanciar nuestro objeto.
CREATEOBJECTEX() no se puede utilizar para crear instancias de clases de Visual FoxPro, sólo se utiliza
para
componentes llamados por DCOM.
Un amigo poco conocido: OLEPUBLIC
En Visual FoxPro 5.0 apareció una nueva opción dentro de la instrucción DEFINE CLASS que permite definir
una clase
como un componente COM, esta opción es OLEPUBLIC.
Ya sea definiendo una clase por medio del diseñador o en un fichero PRG se puede indicar que está será
accesible desde
otros programas como un componente COM. De esta forma podemos dotar a nuestras aplicaciones de la capacidad
necesaria para ser "manejadas" por otras aplicaciones, de forma similar a como ocurre con
Office, pero también podemos
empezar a adentrarnos en el desarrollo en tres niveles siguiendo la arquitectura Windows DNA.
Un primer ejemplo
Vamos a empezar a ver un poco de código. Vamos a crear un pequeño componente COM en Visual FoxPro y
lo vamos a
llamar desde un programa escrito en Visual Basic y otro programa escrito en Visual FoxPro. No tiene
mucha utilidad, sólo
muestra cómo funciona este sistema.
Definir la case. Esta sería una clase mínima y sin utilidad alguna:
DEFINE CLASS calculadora AS CUSTOM
FUNCTION Sumar
LPARAMETER n1, n2
RETURN n1 + n2
ENDFUNC
FUNCTION Restar
LPARAMETER n1, n2
RETURN n1 - n2
ENDFUNC
FUNCTION Multiplicar
LPARAMETER n1, n2
RETURN n1 * n2
ENDFUNC
FUNCTION Dividir
LPARAMETER n1, n2
RETURN n1 / n2
ENDFUNC
ENDDEFINE
Uso desde Visual FoxPro directamente. Para usar esta clase directamente desde Visual FoxPro sólo tenemos
que cargar el
fichero de la clase por medio de SET PROCEDURE TO o SET CLASSLIB:
SET PROCEDURE TO calculadora
Calc = CREATEOBJECT("Calculadora")
Calc.Sumar( 10, 10 )
Creación de un componente. La clase tal y como la tenemos no puede ejecutarse desde otro entorno que
no sea Visual
FoxPro. Para poder independizarla del lenguaje la convertiremos en un componente COM por medio de la
cláusula
OLEPUBLIC:
DEFINE CLASS calculadora ;
AS CUSTOM OLEPUBLIC
...
ENDDEFINE
Creamos un proyecto denominado Ejemplo1, incluimos el fichero CALCULADORA.PRG y compilamos este proyecto
como un ejecutable.
Uso del componente COM desde Visual FoxPro. Ahora sólo tenemos que modificar un poquito nuestro código
anterior
para poder ejecutar este código no como una clase de Visual FoxPro sino como un componente COM:
Calc = CREATEOBJECT("Ejemplo.Calculadora")
Calc.Sumar( 10, 10 )
Si mientras ejecutamos este programa nos dirigimos al administrador de tareas de Windows NT o utilizamos
un visor de
procesos en Windows 95/98 veremos que un programa llamado EJEMPLO1.EXE está en memoria mientras ejecutamos
estas líneas y desaparece en el momento que borramos la variable oCacl.
Uso del componente COM desde Visual Basic. En Visual Basic tenemos varias formas de hacer referencia
a un componente
COM, la más habitual en este entorno es agregar una referencia al componente en el proyecto (en nuestro
caso aparecerá
como ejemplo1 type library - podemos cambiar este texto dentro de las propiedades del proyecto) y crear
un objeto de este
tipo por medio de New.
Sub Main()
Dim Calc As New ejemplo1.calculadora
Debug.Print Calc.sumar(10, 10)
End Sub
En este caso estamos llamado a un código escrito en Visual FoxPro desde un programa escrito en Visual
Basic. Como
decíamos al principio: los componentes COM son independientes del lenguaje de programación con el que
son creados y
desde el que son utilizados.
Reglas de comunicación entre el cliente y el servidor
Hay bastante diferencia entre usar una clase de Visual FoxPro directamente o usarla como un componente
COM. Cuando
desde un programa Visual FoxPro hacemos uso de una clase, ambos, el programa y la clase, pueden configuraciones
de
funciones SET, compartir variables de memoria, cursores abierto, otros objetos referenciados, etc.
Cuando un programa Visual FoxPro llama a un componente COM, aun cuando este esté programado con Visual
FoxPro,
no comparte con el ninguna variable, configuración, gestión de errores, librerías, tablas o cursores
abiertos. Toda la
comunicación entre el programa y el componente se hace siguiendo las estrictas convenciones del COM
y por lo tanto no se
puede interactuar sobre elementos comunes.
Este suele ser uno de los mayores problemas a la hora de "convertir" nuestra forma de programar
por medio de clases a una
forma de programar orientada a componentes COM. Los componentes COM se puede llamar desde cualquier
entorno y
por lo tanto no pueden compartir "información privilegiada".
En el ejemplo anterior podemos observar que existe una comunicación COM entre dos ejecutables independientes,
EJEMPLO1.EXE y el entorno de desarrollo que usemos, VFP6.EXE, VB6.EXE, etc. Estos dos ejecutables no
comparten
variables, datos, o cualquier otro elemento, sino que se comunican a través del protocolo COM.
Para crear un paquete en MTS seguiremos estos pasos:
Seleccionamos la opción "paquetes instalados" y con el botón derecho del ratón seleccionamos
la opción "Nuevo" ->
"Paquete".
Aparece un cuadro de diálogo preguntando si queremos "Instalar paquete ya instalados" o "Crear
un paquete vacío",
seleccionamos esta última opción.
Nos pide un nombre para el paquete, en nuestro caso utilizaremos simplemente "Ejemplos".
El siguiente cuadro de diálogo nos permite cambiar el usuario con el que se ejecuta este paquete. De
momento dejamos esta
opción por defecto.
Una vez creado el paquete debemos Instalar el componente en el paquete. Para ello seguiremos estos pasos:
Seleccionamos la carpeta del paquete "Ejemplos" y en ella la carpeta "Componentes"
Con el botón derecho del ratón seleccionamos el menú "Nuevo" -> "Componente".
Aparece un cuadro de diálogo, seleccionaremos la opción "Instalar nuevos componentes".
Por medio del botón seleccionar archivos nos dirigimos a la directorio donde estamos desarrollando el
componente y
seleccionados dos ficheros:
EJEMPLO1.DLL
EJEMPLO1.TLB
Es muy importante no olvidarse del fichero TLB.
Una vez pulsado el botón "Finalizar" tendremos instalado nuestro componente en MTS.
Ya estamos preparados para volver a utilizar nuestro componente desde los clientes. Los programas anteriores
escritos en
Visual FoxPro o Visual Basic no tienen por que sufrir modificación alguna, MTS no modifica la forma
de llamar a un
componente COM.
Mientas tengamos un objeto creado de nuestro componente aparecerá un contador de uso del mismo dentro
del Microsoft
Transaction Explorer. De esta forma, aunque sea de forma sencilla, podemos empezar a apreciar los beneficios
de usar
MTS, ya podemos ver de forma sencilla el uso de nuestros componentes.
Si queremos cerrar todas las conexiones que tiene los programas clientes con nuestro componente COM,
por ejemplo para
recompilarlo, sólo tenemos que pulsar con el botón derecho del ratón sobre la carpeta del paquete y
seleccionar la opción
"Cerrar el sistema". Los cliente recibirán un error, pero hemos liberado nuestro componente,
hecho este que no podríamos
hacer si no fuera porque está dentro del MTS.
|