Invocación a un componente COM desde Java

Os mostramos como invocar a un servidor de automatización OLE (COM) desde una aplicación Java, a través del producto gratuito JACOB

Invocación de Servidor DCOM desde Java

Hace ya unos pocos años que disponemos de la
tecnología de componentes de Microsoft, bien la llamemos COM, DCOM, ActiveX,
CDOM+ (ya que realmente poca gente sabe la diferencia entre estos términos) …

Hoy en día mal se concibe el desarrollo
Windows sin el uso intensivo de estos componentes (sobre todo en VBasic). 
Ya es de lo mas normal que una aplicación llame a Excel o Word o arranque el
Outlook para mandar un correo.

Es posible que también nos interese invocar
a estos componentes desde Java  lo cual veréis que no es tan complicado…
Para hacerlo, hasta ahora había utilizado Microsoft Visual J++ y su herramienta
JActiveX pero, hay que buscar más opciones por dos razones:

  • Incapacidad de encontrar nuevas
    referencias a integración Java en el Web de Microsoft (SDK for Java, máquina
    virtual, etc.)
  • Deseo de mucha gente de usar software
    gratuito

Hoy os voy a comentar como se puede hacer con una solución
llamada JACOB

http://danadler.com/jacob

Descarga


Nos vamos al Web y descargamos el producto: JAva COM Bridge

 


Nos interesan fundamentalmente dos ficheros (jacob.dll y jacob.jar) 


Vamos a
instalarlos como una extensión de java (

http://danadler.com/jacob/jacobfaq.html )

Verificamos que tenemos
una máquina virtual java instalada

 

 En el
directorio %java_home%/jre/bin copiamos la dll

  En
el directorio %java_home%/jre/lib/ext copiamos el jar

  Voy
a montar el ejemplo con jcreator (para variar un poco 😉 )

 El
código es bastante simple y vamos a atacar al
servidor de Automatización OLE del tutorial anterior, construido en Visual C++

import com.jacob.com.*;
import com.jacob.activeX.*;

public class LlamadaDcom {

static void depura(String cadena)
{
    System.out.println(«LlamadaDcom » + cadena);
}

public static void main(String[] args) {

   depura(«Arrancamos la aplicación»);

   ActiveXComponent sC = new
ActiveXComponent(«dcombasico.Application»);
   Dispatch sControl = (Dispatch)sC.getObject();

   Variant result = Dispatch.call(sControl, «retornaHora»);
   depura(«El resultado » + result.toString());

 }
}

 Y
simplemente compilando y ejecutando, ya lo tenemos

 Otras
soluciones a estudiar

Hay muchas otras opciones … cada una con sus ventajas e inconvenientes
(escribidme si conocéis alguna más)

BeanXporter

JCOM

jacoZoom

Java2COM


Bridge2Java

Weblogic COM

J-Integra


Microsoft Visual J++

Conclusiones

Siempre hay muchas opciones para hacer las cosas…. la gracia es buscar la
más adecuada en cada caso.

Como complemento os diré utilizando las nuevas capacidades de
anotaciones de Java 1.5 (o
también con Xdoclet),
podríamos ser capaces de construir clases envoltorio Java (Wrappers) de nuestros
componentes DCOM de un modo bastante sencillo

Cuando mucha gente me pregunta sorprendido que porque comparto todas estas
cosas … la respuesta es sencilla … que es más importante saber como se hace
algo puntualmente o la visión de saber cuando es apropiado su uso (que solo dan
los años de experiencia ;-). El conocimiento táctico dura meses, el estratégico
años ….

Enlace interesante de última hora: http://congreso.javahispano.org/files/doc/j2ee/WBEM.pdf

Comentarios

Un comentario

  1. TE FELICITO, PERO YO QUISIERA CARGAR zkempeer.dll en Java – jacob. porfavor dame una idea, para solucionarlo mi codigo es:

    import com.jacob.activeX.ActiveXComponent;

    import com.jacob.com.Dispatch;
    import com.jacob.com.DispatchEvents;
    import com.jacob.com.Variant;
    import org.apache.jcp.xml.dsig.internal.dom.Utils;
    import java.io.File;
    /**
    *
    * @author TORREALVA
    */
    public class ZkemSDK {
    // carga estáticamente zkemkeeper.dll, zkemkeeper.ZKEM.1 es el valor de ProgID en el registro

    private static ActiveXComponent zkem = new ActiveXComponent(«zkemkeeper.ZKEM.1″);

    String s =»»;
    String aqui = «»;

    public boolean connect(String address,int port)
    {
    boolean result = zkem.invoke(«Connect_Net», address, port).getBoolean();
    return result;
    }

    public void disConnect()
    {
    zkem.invoke(«Disconnect»);
    }

    public void regEvent(){
    Variant v0 = new Variant(1);
    Variant eventMask = new Variant(65535);
    boolean result2 = zkem.invoke(«RegEvent»,v0,eventMask).getBoolean();
    System.out.println(«regEvent()====»+result2);

    Dispatch ob =zkem.getObject();
    SensorEvents se = new SensorEvents(this,»192.168.0.201»);
    DispatchEvents de = new DispatchEvents(ob,se);

    System.out.println(«111»);

    try {
    EventThread es = new EventThread(de);
    Thread t1 = new Thread(es);
    t1.start();
    } catch (Exception e) {

    }

    System.out.println(«222»);
    }

    public void ruta()
    {
    s = ZkemSDK.class.getProtectionDomain().getCodeSource().getLocation().getFile();

    String separador = System.getProperty(«file.separator»);

    aqui = new File(«»).getAbsolutePath();

    aqui=aqui.concat(separador);

    aqui=aqui.concat(«zkemkeeper.dll»);
    String ruta=aqui;

    System.setProperty(«java.library.path»,aqui);

    System.load(ruta);

    aqui=Utils.class.getResource(«/jacobo/zkemkeeper.dll»).getPath();

    System.load(ruta);

    }
    public static void main(String args[]) {
    // ruta();

    //aqui=Utils.class.getResource(«/jacobo/jacob-1.18-x64.dll»).getPath();

    // File f = new File(getClass().getResource(«kernel321.dll»).getFile());

    System.out.println(System.getProperty(«java.library.path»));

    ZkemSDK sdk = new ZkemSDK();
    boolean connFlag = sdk.connect(«192.168.0.201», 4370);

    if(connFlag)
    {
    sdk.regEvent();
    sdk.connect(«192.168.0.201», 4370);
    }else
    {
    System.out.println(«333S»);
    }
    }

    }

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia S.L., Profesor asociado en IE Business School, inversor en StartUps y mentor de emprendedores. Ingeniero Técnico de Telecomunicaciones y Executive MBA por IE Business School 2007. Twitter: Follow @rcanalesmora Autor de los Libros: Planifica tu éxito: de aprendiz a empresario, Informática profesional, las reglas no escritas para triunfar en la empresa, Conceptos ágiles aplicados a distintas áreas de una empresa y Conversaciones con CEOs y CIOs sobre Transformación Digital y Metodologías Ágiles. ¡Descárgalos gratis aquí! Puedes consultar mi CV y alguna de mis primeras aplicaciones (de los 90) aquí.

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

Tutoriales
Un diagnóstico de arquitectura revela riesgos, optimiza sistemas y alinea la infraestructura tecnológica con el crecimiento y objetivos de negocio.
Tutoriales
Descubre qué es la deuda técnica, cómo identificarla, medirla, gestionarla y prevenirla para asegurar el éxito y la sostenibilidad de tus proyectos.
Tutoriales
Detecta emociones en tiempo real con visión artificial y machine learning usando MediaPipe, CVZone y scikit-learn en solo unos cientos de líneas de código.