DLL y Nexus, el encuentro.

“Una vez se te ha revelado la verdad, salvado los problemas e inconvenientes de la vida material, llega el momento del baile. De la unión infinita con el Nexus, pequeño saltamontes” dijo el maestro.

“Giro, maestro, ¡giro! Ya lo siento, ¡ya! Es como si transcurrieran todas las escupidera1estaciones en un momento, ¡sí!”, aullaba el novicio mientras se deslizaba sobre la tarima, con la gracia propia del grajo en una fría noche de invierno.

“Vigila los obsta…” <clonk> “Quizás, sí, será mejor que te dediques al VB6.” concluyó el maestro.

Solo nos queda un paso para que nuestra DLL reciba los eventos de Nexus. Y es registrarla. Puede parecer obvio, pero por mi experiencia… Sí, Nexus sabe muchas cosas, pero por si solo no conoce el vasto mundo de DLLs de terceros (¿Qué es una DLL de terceros? ¿Lo sabe el S.O.? Y de saberlo ¿podría ser enjuiciado?) y por lo tanto no puede cargarlas (detalle curioso, pero en el que no todo el mundo piensa).

Registrar y empresas en Nexus

Para que Nexus sepa que debe cargar tal o cual DLL (u objeto con contenido en ella o en cualquier aplicación que haga de contenedor de objetos com) y pueda llamar a las funciones que exporte, hay que introducir una entrada por DLL en la tabla “DLLS” de la empresa en la que queramos que actúe.

Repito, en la empresa. Esto significa que, si tenemos varias empresas y solo lo introducimos en una empresa, las demás no contarán con esa funcionalidad.

Recordemos que entre los eventos que se pueden escuchar de Nexus están las llamadas a opciones de menú de terceros. Para este, el registro de la DLL es igual que el caso que nos compete.

Registrando la DLL

El registrar nuestra DLL u objeto COM en la empresa de Nexus es tan fácil como:

insert into dlls(iddll, dll) values (1, 'MiMaravillosa.DLL');

Donde el campo “iddll” debe ser un valor numérico único. En “dll” deberemos rellenar:

a) Para una dll win32, el nombre de la DLL (si está se encuentra donde los binarios del Nexus, generalmente “c:\Archivos de Programa\SIE\Nexus”), o el nombre con la ruta de localización completa en caso contrario (por ejemplo: “c:\MiCarpeta\MiMaravillosa.dll”).

b) En el caso de un objeto COM, hay que indicar el Class ID (CLSID de la clase COM que recibirá los eventos. Para este caso, los programadores de .NET deberán recordar el nombre de la clase debe estar completamente cualificado, es decir, con su namespace completo.

Nota: Nexus distingue el caso a) del b) dependiendo de que el valor del campo “DLL” termine con “.dll” (es una dll) o no (es un objeto COM). Así que cuidadito con el nombre del objeto com.

Ejemplos

a) win32:

insert into dlls(iddll, dll) values (1, 'MiDllMaravillosa.dll');
insert into dlls(iddll, dll) values (1, 'c:\MiCarpeta\MiMaravillosa.dll');

b.1) COM (delphi, c++, etc…):

insert into dlls(iddll, dll) values (1, 'MiDllMaravillosa.MiObjetoEscuchador');

b.2) COM (desde .NET):

--C#
insert into dlls(iddll, dll) values (1, 'MiNamespace.MiObjetoEscuchador');
--VB.NET
insert into dlls(iddll, dll) values (1, 'MiDllMaravillosa.MiNamespace.MiObjetoEscuchador');

Como hemos comentado, la tabla “DLLS” se encuentra en cada empresa que creemos en nuestra instalación. Esto implica que, si queremos que el mismo comportamiento afecte a todas las empresas, habremos de realizar el registro (el insert en la tabla) en cada una. Por el contrario, puede ocurrir que solo lo queremos para un determinado número de ellas. Sólo tendremos que registrarlos en estas.

Diccionario y registro de la DLL

Una forma para registrarlas en todas, sin tener que acceder a generador de sentencias del MS-SQL Server, es incluir el registro entre las actualizaciones del diccionario. Así, si tenemos un diccionario de terceros junto con nuestro desarrollo (cosa muy habitual, por cierto), podremos incluir una o varias sentencias SQL en una actualización (ver el editor de diccionarios de tercero “diccionario.exe” que está a disposición de nuestros distribuidores en la zona de distribuidores, opción “Descarga de herramientas”).

Eso sí, como el diccionario puede aplicarse varias veces no está de más hacer una comprobación del estilo:

if not exists(select * from dlls where dll = 'MiMaravillosa.dll')
begin
  declare @id money
  select @id = coalesce(max(iddll), 0) + 1 from dlls
  insert into dlls(iddll, dll) values (@id, 'MiMaravillosa.dll')
end

Y ya de paso generamos el iddll.

Con esto, además, conseguiremos no olvidar el registro de la DLL si se produjera algún desastre (el departamento técnico puede contar muchas anécdotas) y hubiera que reinstalar la aplicación.

Finalmente solo queda entrar en Nexus, en la empresa que toque, para que nuestra DLL pueda comenzar a escuchar los eventos.

Nuestra DLL escuchará al Nexus (si hicimos a los artículos anteriores Cuando Nexus habla y Fusionándose con Nexus). ¿Pero, de verdad le entendemos? ¿Qué nos llega en los eventos? En el próximo lo veremos (si es que a estas alturas os quedan fuerzas)

“Maestro programador busca escupidera, preferiblemente de bronce, a buen precio. Intermediarios abstenerse”

Acerca de El monstruo de Caerbannog

Temible guardián de la gruta que esconde un temible y obscuro secreto...

Publicado el marzo 12, 2009 en Desarrolladores, Distribuidores, Implantaciones y etiquetado en , , , . Guarda el enlace permanente. Dejar un comentario.

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.

Únete a otros 103 seguidores