¿Cómo llamar a una DLL desde programas externos?
Aplica a: a3ERP +1 - a3ASESOR | business 360
- a3ASESOR | business 360
- Proceso a seguir para llamar a una DLL desde programas externos
- ¿Y si mi DLL está hecha en .NET o es un ActiveX?
- Registro en a3ERP
Proceso a seguir para llamar a una DLL desde programas externos
A continuación, te explicamos el proceso para llamar a una DLL desde programas externos:
Aquí hay que tener en cuenta que en ningún momento indicamos el parámetro que se va a pasar a la DLL porque en realidad va implícito con el mantenimiento. Es decir, siempre se pasará un parámetro de tipo “String” que irá variando dependiendo de la tabla que se configure.
Cambios a partir de la versión 14.03:
Hasta la versión 14.03 en el recuadro rojo hay que indicar la ruta completa donde está la DLL a la que queremos llamar y no hace falta que esté registrada en la tabla de dlls.
A partir de la versión 14.03 es obligatorio registrar en la tabla DLL´s de a3ERP, las dlls que se quieran invocar.
Para + información sobre cómo se registran dlls en a3ERP consultar el apartado "Registro en a3ERP”.
Como a3ERP conoce las dlls registradas no es necesario indicar la ruta completa y es suficiente con informar el nombre de la dll.
La llamada a “Executables” funciona como siempre.
Veamos un ejemplo:
¿Y si mi DLL está hecha en .NET o es un ActiveX?
En el caso de querer llamar a una DLL de .net que se ha registrado con REGASM la manera de informar la DLL es distinta, ya que en programa o librería se debe informar una línea de la siguiente forma:
@NameSpace.ClassName@MethodToCall
Un ejemplo sería el siguiente:
@a3ERPExtension.a3ERPExtension@a3ERPExpedientes
Cambios a partir de la versión 14.03:
Hasta la versión 14.03 no hace falta que esté registrada en la tabla de dlls.
A partir de la versión 14.03 es obligatorio registrar en la tabla DLL´s de a3ERP, las dlls que se quieran invocar.
Para + información sobre cómo se registran dlls en a3ERP consultar el apartado "Registro en a3ERP”.
Registro en a3ERP
Para que a3ERP sepa que módulos debe cargar, se deberá registrar sus binarios en la tabla DLLS. Esto se puede hacer lanzando una sentencia SQL desde la opción “Vistas SQL”, desde el “Management Studio” de SQL Server o una herramienta parecida, o usando una actualización de un diccionario que forme parte del módulo.
if not exists(select IDDLL from DLLS where DLL = WK.ERP.Ejemplos.LoggerEventosERP)
begin
declare @id int
select @id = max(iddll) + 1 from dlls
insert into dlls(iddll, dll, fabricante, producto, ORDENDEEJECUCION)
values(@id, WK.ERP.Ejemplos.LoggerEventosERP, WK, a3ERP, 1)
end
En el caso de que se opte por la opción del diccionario, debemos recordar que las actualizaciones deben estar diseñadas para que se ejecuten una única vez, como ocurre en el ejemplo anterior. Si no fuese así, podríamos encontrarnos con el registro repetido en la tabla.
Los valores que habrá de indicarse en la tabla DLLS son los siguientes, según sea una dll nativa o COM (hecha en .NET o VB6, por ejemplo):
>> NATIVA
A tener en cuenta: En el caso de una DLL nativa, el nombre del fabricante y del producto debe corresponder con los directorios dentro de la carpeta extensiones de a3ERP en el que se ubica.
Por ejemplo, si el fabricante fuese WKE y el producto EJEMPLOSERP, el módulo se deberá encontrar en \Extensiones\WKE\EJEMPLOSERP\Binarios
Recordemos que la estructura para un módulo de extensión de a3ERP es:
<directorioDelMódulo>
\Binarios: Directorio de los binarios del módulo
\Diccionarios: Directorio que albergará los diccionarios del módulo
\Menús: Ubicación del menú del módulo
Por supuesto, estos directorios son opcionales (pero al menos uno deberá existir).
>> COM
Las librerías COM deberán estar registradas. Si es nativa conregsvr32 y si es .NET con regasm usando el modificador /CODEBASE.
A tener en cuenta: A diferencia del caso nativo, los campos FABRICANTE y PRODUCTO son libres (no tienen que coincidir con la ruta en la que se ubica, pero es recomendable seguir el mismo patrón).
En el caso del valor de DLL, clase COM a instanciar, en el caso de .NET coincide con el nombre completo de la clase (es decir, con namespaces). Generalmente el namespace principal de la biblioteca de clases coincide con el nombre de la DLL, con lo que suele quedar como “nombredllSinExtension.nombreDeLaClase”.
Pero no se debe olvidar que, si se cambia el namespace principal, cambiará el nombre de la clase a registrar.