REDESII

bullet1 EXPOSICIONES
bullet2 MTS

bullet3 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.


    Hosted by www.Geocities.ws

    1