Invocación a un componente COM desde Java

1
21767

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

1 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»);
    }
    }

    }

Dejar respuesta

Please enter your comment!
Please enter your name here