FoxPress – Junio 2002

 

Instalación de Clientes COM

 

http://www.fpress.com/                                                                                           registraCOM.ZIP

 

 

          Por Alberto Rodríguez

 

La instalación de clientes COM es una de las operaciones más frustrantes que existen pues no se sabe la razón por la que algo aparentemente tan fácil no funciona.

 

Los objetos COM que uno realiza funcionan perfectamente en la propia máquina en la que se crean, pero cuando uno lo lleva al Servidor y pone los módulos Cliente a las máquinas cliente uno ve con indignación que sencillamente ‘NO FUNCIONA’

 

En realidad sí funcionan, pero existe mucha casuistica con este tema. Todo esto hace que el desarrollador que se introduce en este proceloso mundo, abandone pronto esta técnica pues no acaba de ver claras las ventajas de usarla.

 

La forma más razonable de trabajar es crear una DLL e introducirla en un Servidor COM+ para que la administre. El Servidor COM+ tiene una opción de exportación que te permite llevar ‘un instalador’ a las máquinas cliente de forma que puedan ver al Servidor y ejecutar el COM.

 

 

Como es sabido los Servidores COM+ se encuentran en Win2000 (prof y Server) en su versión 1.0 y en el XP en su versión 1.5

Si tu Servidor es un Win2000 con el SP1 funcionará perfectamente, pero si tiene el SP2 entonces no funcionará. Deberás quitar el SP2 y dejar el SP1. Otra alternativa es esperar al SP3 que esperemos que funcione.

 

Pero si tu administrador de Sistemas no te deja desinstalar el SP2 (por otra parte un comportamiento muy prudente por su parte) deberás buscarte caminos alternativos. Esto es lo que me pasó a mi y tuve que investigar linea a linea del Registry para ver qué cambios hacía el modulo exportado desde el COM+.

 

Armado con un analizador de cambios del Registry fui expurgando las líneas de código hasta que me quedé con lo esencial que te lo pongo aquí.

 

Si tu clase OLE PUBLIC se llama ‘main’ y reside en una dll llamada ‘proy1’ y su ID es:

 

{694B3DC9-6B23-4209-BB50-63D1DDCAFB35} y el Servidor en mi caso se llama ‘NUEVE’

 

Deberás escribir estas lineas en el Registry:

 

[HKEY_CLASSES_ROOT\CLSID\{694B3DC9-6B23-4209-BB50-63D1DDCAFB35}]

"AppID"="{152FD404-8088-4255-B10B-AD7FFD4A4D46}"

 

[HKEY_CLASSES_ROOT\CLSID\{694B3DC9-6B23-4209-BB50-63D1DDCAFB35}\ProgID]

@="proy1.main"

 

[HKEY_CLASSES_ROOT\CLSID\{694B3DC9-6B23-4209-BB50-63D1DDCAFB35}\InstalledVersion]

@="1,0,0,0"

 

[HKEY_CLASSES_ROOT\proy1.main]

 

[HKEY_CLASSES_ROOT\proy1.main\CLSID]

@="{694B3DC9-6B23-4209-BB50-63D1DDCAFB35}"

 

[HKEY_CLASSES_ROOT\AppID\{152FD404-8088-4255-B10B-AD7FFD4A4D46}]

"RemoteServerName"="NUEVE"

"RunAs"="Interactive User"

 

Fíjate que aquí tenemos dos ID, el de tu clase y otro más que se ha creado para poder vincularlo al objeto remoto.

 

Ese código lo puedes meter en un .REG y ejecutarlo para que lo cargue el registry y ya está.  No obstante, creo que te leo el pensamiento si estás pensando ¿Y, cómo me creo un ID como ese? Para eso te trascribo el truco que salió en esta revista el mes pasado y que hace eso precisamente:

 

DECLARE INTEGER CoCreateGuid ;
  IN Ole32.dll ;
  STRING @lcGUIDStruc
DECLARE INTEGER StringFromGUID2 ;
  IN Ole32.dll ;
  STRING cGUIDStruc, ;
  STRING @cGUID, ;
  LONG nSize
 
*** Ejecuta este código para obtener una *** clave única.
 
? getGUID()
 
PROCEDURE GetGUID
cStrucGUID=SPACE(16)
cGUID=SPACE(80)
nSize=40
IF CoCreateGuid(@cStrucGUID) # 0
   RETURN ""
ENDIF
IF StringFromGUID2(cStrucGUID,@cGuid,nSize) = 0
  RETURN ""
ENDIF
RETURN STRCONV(LEFT(cGUID,76),6)
ENDPROC

 

¿Y cómo se cual es el ID de mi COM? El COM al compilarlo se autoregistra en tu máquina de desarrollo con lo que podrás escribir en la ventana de órdenes lo siguiente y sabrás qué ID ha recibido:

 

MyServer = _VFP.ActiveProject.Servers("miclaseOLE_PUBLIC")

? "Mi ID es ", MyServer.CLSID     

 

Esto está bastante bien, pero puede ser que quieras algo un poco ‘más automático’ de todo esto para no tener que estar pensando y acordándote cada vez de todos los pasos que hay que hacer.

 

Cuando haces una instalación cliente, tienes que poner las librerias de la runtime de Fox con lo que tienes el Fox a tu disposición para lo que quieras y aquí es donde te propongo un programita que realice las operaciones de registro para ti.

 

Si nos fijamos en las claves verás que tienes dos:

 

{694B3DC9-6B23-4209-BB50-63D1DDCAFB35}

 

y

 

152FD404-8088-4255-B10B-AD7FFD4A4D46}]

 

la primera es la misma que tiene que tener el servidor y la segunda la utiliza para relacionar el registry local con la clave del registry remoto.

 

En el siguiente ejemplo hacemos eso:

 

 

 

 

Esta pequeña utilidad serviría para registrar en la máquina cliente el path de acceso al servidor.

 

En el  primer textBox se pone el nombre del ejecutable remoto con la clase que es OLE PUBLICA juntados por un punto.

 

En el segundo TextBox se pone el CLSID remoto. Al no estar registrado en la máquina cliente no podemos escribir el código anterior y tenemos que ponerlo a piñón.

 

El tercer TextBox es un GUI cualquiera que sirve para relacionar el cliente y el Servidor y he puesto el botón que te lo genera y te permite grabarlo.

 

El cuarto textoBox es el nombre de la máquina servidora. Aquí también valdría una dirección IP.

 

Y ya está...

 

Por supuesto, para que funcione tiene que tener instalado la runtime de Fox.

 

 

 

FoxPress – Junio de 2002

© 2002 FoxPress. All rights reserved