htm=articulo/plugvb.htm ok articulo/plugvb.htm

Plugins en un programa VB.

Se describe paso a paso el modo de soportar pulgins en un programa desarrollado en VB.


El problema.

Crear con VB un programa que controla un juego. Este programa recibe el nombre de Arbitro.

Cada juego enfrentará a dos jugadores. Participan en el juego un numero indeterminado de jugadores que se enfrentan uno contra uno por un sistema de eliminacion.

Cada jugador es un algoritmo desarrollado por un programador diferente. El número de algoritmos (jugadores) participantes no está determinado a la hora de desarrollar el programa Arbitro.

La solucion.

El programa Arbitro será un ejecutable que debe permitir enchufar distintos módulos software (los algoritmos-jugadores).

Los jugadores (algoritmos) se programarán en DLL's ActiveX, cada jugador debe implementar un interface definido en una librería de tipos. El Arbitro debe ser capaz de controlar a cualquier jugador que implemente este interface.

Primero: Declarar un interface IJugador.

Crear un proyecto del tipo Dll-ActiveX, en propiedades del proyecto ponerle de nombre Jugador, salvar el proyecto con este nombre. En el proyecto Jugador crear una clase de nombre IJugador e instanciable públicamente.

Añadir a la clase IJugador los métodos necesarios para hacer jugar al algoritmo. Por ejemplo, añadir un método Public Sub JugarAhora() Supongamos que este método es el único que se necesita para resolver una jugada, en un caso real habría más métodos, esto es solo un ejemplo.

Los métodos añadidos a IJugador son los métodos necesarios desde el punto de vista del programa Arbitro, es decir que el programa Arbitro usará estos métodos para comunicar al jugador el estado actual del juego y para obtener la jugada calculada por el jugador.

No es necesario escribir código en los métodos de la clase IJugador, esta clase sirve solo para declarar el interface (conjunto de métodos), no debe contener un algoritmo concreto para jugar.

Compilar la Dll-ActiveX (obteniendo JUGADOR.DLL) Si en algún momento se va a recompilar esta DLL, será necesario activar la compatibilidad binaria (en opciones del proyecto).

Segundo: Crear programa Arbitro.

Crear un programa del tipo exe y de nombre Arbitro. En la opcion del menú referencias, buscar la dll JUGADOR.DLL e incluirla en el proyecto.

De momento no se sabe cuales son los jugadores que participaran en el juego. Declarar dos referencias (variables que apuntan a un objeto) especificando el tipo IJugador:

Dim jugador1 As IJugador

Dim jugador2 As IJugador

Para crear cada uno de los jugadores se debe usar la funcion CreateObject, esta funcion permite crear un objeto del que solo se conoce el nombre.

En resumen, los jugadores se crean con una instruccion del siguiente tipo:

Set jugador1 = CreatObject("Unadll.Unaclase")

Set jugador2 = CreatObject("Otradll.Otraclase")

Un modo para saber los jugadores disponibles es mantener un fichero .ini donde cada jugador debe estar registrado. El modo más cómodo de registrar los jugadores es poner el nombre de la DLL-activex y el nombre de la clase separados por un punto, así este string es utilizable directamente por la funcion CreateObject.

El programa Arbitro puede ahora controlar el juego haciendo uso de los métodos del interface IJugador de los dos objetos: jugador1 y jugador2.

Tercero: Crear los jugadores.

Cada jugador será programado en un projecto del tipo Dll-ActiveX, crear un proyecto de este tipo y ponerle un nombre cualquiera.

En la opcion del menu referencias, seleccionar la DLL JUGADOR.DLL. Crear una clase con un nombre cualquiera y - importante - añadir en esta clase la sentencia:

Implements IJugador

Esta clase tiene ahora una serie de métodos privados que implementan el interface IJugador. Rellenar estos métodos con código a fin de realizar las jugadas que el programa Arbitro espera.

Compilar la DLL y registrar el jugador en el fichero .ini para que el program Arbitro lo reconozca. Si en algún momento se va a recompilar esta DLL, será necesario activar la compatibilidad binaria (en opciones del proyecto).

Notas adicionales:

Llegados a este punto, tenemos un programna que es capaz de conectar y desconectar módulos software siempre que estos módulos implementen un interface concreto.

Para que se pueda crear un objeto con CreateObject, las DLL-ActiveX deben estar registradas en el registro de Windows, esto es general para todas las DLL's de este tipo instaladas en Windows. Además, el programa Arbitro requiere que cada objeto se registre en un .ini (hay muchos objetos en Windows, solo unos pocos son jugadores).

La DLL-ActiveX JUGADOR.DLL no se usa realmente, esta DLL se ha creado con el único propósito de forzar a VB para que cree una librería de tipos con la definicion del interface IJugador. Existe un método alternativo para crear una librería de tipos, se puede escribir un fichero fuente en lenguaje odl/idl y compilarlo con MIDL.EXE para obtener un fichero .tlb.

Los lenguajes odl/idl usan una sintaxis parecida al C, no son lenguajes propiamente dichos ya que solo declaran, no impementan.

Si se desea ampliar la comunicacion entre el programa principal y los plugins, todos los interfaces involucrados en esta comunicacion deben estar definidos en la librería de tipos. (JUGADOR.DLL en el ejemplo).

Por ejemplo, si el objeto ventana de la aplicacion implementa un interface que permite manipular la visualizacion, los jugadores podrían pintar en esa ventana. Para ello sería necesario que cada objeto jugador recibiera una referencia al interface de la ventana.

Una aplicacion construida enteramente a base de objetos cuyos interfaces se declaran en una librería de tipos puede ser completamente manipulada desde un pluguin desarrollado posteriormente. El ejemplo descrito en este artículo trata de ilustrar la facilidad con que se realiza este trabajo con VB5.


© info3@maicas.net