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