jueves, 4 de octubre de 2012

Creando un Puente entre Java y ActiveX (Windows) :D.

Primero que todo, el realizar esto fue entrete, probe varias librerias, lo hice de forma nativa, este desarrollo lo hice para poder utilizar una impresora fiscal en Java :D, la comunidad Java, puede hacer TODOOOO jeje. Bueno, lo primero que me parece interesante mencionar es que las ultimas versiones de Netbeans permiten usar proyectos desde el Workspace de eclipse, es decir!!! en la carpeta de workspace, tendremos un proyecto compatible con netbeans y eclipse, en realidad no es tan Wauu el tema, pero es realmente útil, yo prefiero netbeans, salvo para SWT, de todas formas se puede usar SWT sin problemas en netbeans, pero... no he tenido tiempo para investigar más a fondo. primero que todo probe Jawin, esta libreria es realmente útil para uasr dll de forma nativa en Java (JNI). La recomiendo si esque tienen que usar DLL, sin ser necesario registrarla en Windows :D, sin embargo solo corre con librerias de 32 bits!!! cosa que en un tiempo más quedará obsolote (ESCUCHEN SEÑORES PRODUCTORES DE HARDWARE, HAGAN PLZ COMPATIBILIDAD CON 64 BITS, PARA USAR REALMENTE THREADS Y MULTITAREA). Para OCX recomiendo la que utilice jeje. Para no entrar más en detalle, les dejo el Link donde pueden ver el detalle de implementación de Jawin. esta explicado con manzanas jeje...Link acá -> Jawin.

Y pueden descargarla de acá -> Descargar Jawin

La herramienta que utilice se llama Jacob. En la implementación me lleve varios peros, como por ejemplo que mi SO era de 64 bits y al tener el JVM de 64 bits, no me permitía ejecutar la DLL. Pues claro si llama realmente usa 64 bits!!, bueno de tods formas en c-sharp también para lo mismo, entonces debemos tener instalado la maquina virtual de java de 64 y 32 y el eclipse hacerlo compilar con esa, no recimiendo cambiar el java_home, porque recordemos que debemos mirar hacia adelante y no atrás y lo que viene es 64 bits.. y para las excepciones configuramos o podemos a nuestro jar, decirle que lo compile con 32 bits. Esta libreria la podemos descargar de acá -> Descargar Jacob

Una de las ventajas es que podemos utilizarla con ocx y dll (hay que registrarlas) tanto de 32 y 64 bits :D

Bueno como yo supongo que la gente que lee el blog tiene ganas de aprender y no necesariamente tiene que saber las cosas!, voy a comenzar explicando como registrar las OCX y DLL. Primero abrimos la terminal de Windows, esto si no lo voy a explicar XD. Vamos a la carpeta Windows->System32, en caso de tener dll de 64 bits y en caso de querer correr una de 32 en un SO de 64, tendremos unas carpeta ques e llama SysWOW64 (Me recuerda a World of Warcraft xD). En esta carpeta vamos a crear nuestro registro


Como pueden ver estamos en SysWOW64 y el comando es regsvr32.exe, si queremos registrar en System32 nuestra dll tenemos que ejecutar reg32svr.exe (Notable la creatividad :D). Si la dll esta en la misma carpeta SysWOW64, no es necesario especificarle la ruta, solo el nombre de la dll.


Y Listo, nuestra OCX está registrada, ahora verifiquemos :D. Ahí mismo en la carpeta SysWoW64 existe un archivo llamado regedit, abrimos directamente esa o vamos a ejecutar y escribimos regedit y vemos que, MAGÍA, está nuestra DLL.


Ahora a lo que nos convoca, manos al código :D. Paso 1: Importamos la libreria jacob al proyecto

Paso 1: Importamos la libreria jacob al proyecto



Paso 2: Ponemos la DLL correspondiente, si usamos maquina virtual de 32, debe ir en la maquina virutal de 32 la dll. OJO QUE EN ECLIPSE DEBEN PONER LA LIBRERIA EN LA CARPETA JRE Y EN NETBEANS EN JDK :D

Para Jawin es exactamente los mismos pasos, bueno para todos los bridge COM son asi jeje

Ahora lo entretenido, antes pura parafernalia y configuraciones.
// Importamos librerias necesarias
import com.jacob.com.*;
import com.jacob.activeX.*;

ActiveXComponent epson = new ActiveXComponent("EpsonFPHostControlX.EpsonFPHostControl"); // Creamos un objeto ActiveX, en la imagen anterior se puede ver el nombre del Servicio registrado, usamos ese mismo (EpsonFPHostControlX.EpsonFPHostControl).
Dispatch sControl = (Dispatch)epson.getObject(); // Obtenemos los objetos y los almacenamos en sControl

Dispatch.put(sControl, "CommPort", 1); // Seteamos puerto impresora, en c# es diferente, porque hacemos uso del setter del método acá directamente le damos el valor al atributo. Cabe destacar que son valores por referencia, por eso debemos hacer esto.
Dispatch.put(sControl, "BaudRate", 9600); 
Variant a = Dispatch.call(sControl, "OpenPort"); // Llamamos al método OpenPort que esta seteado con los valores por referencia entregados en los 2 pasos anteriores
Variant b = Dispatch.call(sControl, "ClosePort"); //Método para cerrar puerto.

// Enjoy


Eso sería jeje, también podemos llamar a word, simplemente indicando ActiveXComponent("Word.Aplication");
Asi también cualquier servicio que exista en windows, outlook (Thunderbird UP), Excel, etc..

Espero les sea útil, ante cualquier duda me dicen y les ayudo, Saludos!

Volver a sección JAVA

22 comentarios:

  1. Hola amigo, tengo un problema, estoy implentando un sistema de Pin Pad, tengo el dispositivo con su respectivo dll y archivo configuracion.ini, este dll tiene 4 metodos para realizar las transacciones los cuales son:

    int CAJA_PINPAD_API fiClosePort();

    int CAJA_PINPAD_API fiOpenPort(String *filename);

    int CAJA_PINPAD_API fiGetStatus(char **Buffer, DWORD BufferSize );

    int CAJA_PINPAD_API fiStartOperation(char **Buffer, DWORD TimeOut, LPSTR *Response);

    No puedo tener acceso a dichas funciones, porfavor si me pudieras ayudar.

    Gracias.

    ResponderEliminar
    Respuestas
    1. ¿Cuál es el problema?. Intenta utilizar el software que puse ahí, el ejemplo es bastante claro. ¿aún sigues sin poder implementarlo?. Me avisas y podemos verlo por google+.

      Saludos Rudy.

      Eliminar
    2. Hola Rudy, me encuentro en el mismo problema que tu en este momento, me podrias indicar como lo solucionaste?

      Gracias.

      Saludos Victor

      Eliminar
  2. Hola, mi idea es hacer un programa facturador en java, usando impresora fiscal epson y/o hassar, mi pregunta es si esta librería Jacob es solo lo que necesito para comunicarme con estos dispositivos, saludos, muy buena explicación!!!

    ResponderEliminar
    Respuestas
    1. Si Edgardo, yo la utilice en la impresora Epson TM-88IV sin ningún problema. Si necesitas más ayuda me dices y podemos ver como lo solucionamos viendo el código por github, en google+ con hangouts. Saludos!

      Eliminar
    2. Hola Carlos buenos dias
      Estamos intentando implementar en java las jacob.
      Cuando intentamos hacer el regsvr32 jacob version 1.8 nos da un error no nos registra.
      Hemos leido diferentes foros pero nadie tiene este problema.
      El error que nos aparece es:
      "Se cargo el modulo jacob-1.18-m1-x86.dll pero no se encontro el punto de entrada Registerserver. Asegure que jacob.dll es un archivo DLL valido"

      Te agrecederiamos tu colaboracion.

      Eliminar
    3. Hola Carlos tanto tiempo, estoy testeando poder usar la libreria segui todos tus pasos y me tira esta Exception in thread "main" com.jacob.com.ComFailException: Can't co-create object
      Que estoy haciendo mal? saludos.-

      Eliminar
    4. la librería jacob esta desatendida desde el 2005, yo en mi caso personal sugiero que hay que arremangarse las manga aprender jni y lenguaje c++.

      Eliminar
  3. Exlente tu post queria hacerte un consulta y me orientes si puedo hacer lo siguiente Quiero usar el siguiente linia de codigo que encontre en internet
    Set objShell = CreateObject ("Shell.Application") para obtener propiedadesde un archivo con la siguiente linia = objFolder.GetDetailsOf(strFileName, 27) 'Length
    No se si con Jacob pueda hacer esto muchas gracias

    ResponderEliminar
    Respuestas
    1. Puedes utilizar todos los métodos que contenga el componente, es decir, si tienes encapsulado los objetos deberías :D

      Eliminar
  4. hola :)
    una pregunta, yo estoy trabajando con un programa que se llama AdminPAQ, este al instalarlo automáticamente carga en Archivos de Programa el SDK , el cual permite que aplicaciones externas se conecten al programa de adminpaq y a la base de datos de este, para poder estar extrayendo informacion y al mismo tiempo poder estarla actualizando, mi problema es que estoy usando netbeans y necesito hacer referencia a un archivo que llama MGW_SDK.DLL, esto con el fin de que se inicialice el SDK y que posteriormente me permita poder acceder a los datos de la BD de adminpaq, ya utilice jawin, pero me marca el siguiente error :
    org.jawin.COMException: 8007007e: No se puede encontrar el módulo especificado.

    cualquier ayuda proporcionada se los agradecería :)
    gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola,
      Yo estoy tratano de hacer lo mismo y segun lo que he leido, la MGW_SDK.DLL tiene dependencias ocultas lo que la hace dificil de cargar.
      ¿Has podido resolver este problema?

      Eliminar
  5. Buenos dias?? hice una app control de stock, implemente el modulo de facturacion y me encontre con que la DLL era paga! pero consegui gratis unos OCX de Hasar. me darias una mano con la implementacion?? sobre los comandos y demas?? mi correo es reichertvictor@gmail.com

    ResponderEliminar
  6. Hola que tal.
    Yo tambien estoy implementando un Sistema de Facturacion para un Bar y resulta que me dijeron que tengo que pagar para que no me salga 'DEMO' en los Tickets fiscales, usando el Driver de impresoras Hasar (en Java).
    Necesito que me ayudes como implementar esto que propones con el OCX que da Grupo Hasar oficial para solucionar mi problema, ya que me da ciertos errores por el momento...
    Mi correo es: geronimo.perez.salas@gmail.com
    Podrás darme una mano con esto? ES URGENTE! GRACIAS!

    ResponderEliminar
  7. Hola como estas, se que es mucho pedir pero habria alguna posibilidad que me pases la clase de la impresion del ticket? necesito hacer algo igual pero estoy muy perdido mi correo es emilioagimenez@gmail.com

    ResponderEliminar
    Respuestas
    1. tenes la impresora física ? que modelo es .. intentaría ayudarte.

      Eliminar
  8. Estoy implementando una interfaz para controladores Hasar, utilizando Jacob como puente Java-OCX fiscal.
    El Único problema que tengo es que no puedo utilizar los parámetros que son por referencia. Si bien las respuestas de la impresora se pueden leer con el comando "Recibir", sería útil poder usar las variables por referencia para recibir las respuestas.
    ¿Te has encontrado con esta dificultad en Jacob?

    En teoría, se podría hacer esto por ejemplo:
    Variant cantZ = new Variant((int)0, true);
    Dispatch.call(sControl, "CapacidadRestante", cantZ);
    System.out.println("Value : "+cantZ.getIntRef());

    El problema es que los métodos en el OCX utilizan variables de salida de tipo Variant por referencia (no int), y no encuentro que combinación usar para pasar un Variant por referencia y luego leerlo. Si le paso un int el OCX dá error, y si le paso un Variant, no dá error pero no puedo recuperar el valor que setea el método.

    ResponderEliminar
  9. Hola Carlos buenos dias
    Estamos intentando implementar en java las jacob.
    Cuando intentamos hacer el regsvr32 jacob version 1.8 nos da un error no nos registra.
    Hemos leido diferentes foros pero nadie tiene este problema.
    El error que nos aparece es:
    "Se cargo el modulo jacob-1.18-m1-x86.dll pero no se encontro el punto de entrada Registerserver. Asegure que jacob.dll es un archivo DLL valido"

    Te agrecederiamos tu colaboracion.

    ResponderEliminar
  10. Hola Carlos buenos dias
    Estamos intentando implementar en java las jacob.
    Cuando intentamos hacer el regsvr32 jacob version 1.8 nos da un error no nos registra.
    Hemos leido diferentes foros pero nadie tiene este problema.
    El error que nos aparece es:
    "Se cargo el modulo jacob-1.18-m1-x86.dll pero no se encontro el punto de entrada Registerserver. Asegure que jacob.dll es un archivo DLL valido"

    Te agrecederiamos tu colaboracion.

    ResponderEliminar
  11. Hola Carlos, he visto por un foro que has logrado implementar una comunicación efectiva con una Impresora fiscal TM-T88V usando Java. Podrías ayudarme con ese tema? Gracias de antemano. Acá te dejo mi correo. Salazarjosedaniel@gmail.com

    ResponderEliminar
  12. alguien de este blog me podría decir con exactitud que driver su versión exacta de impresora fiscal estas usando para empezar a probar...?

    ResponderEliminar
  13. acá dejo espero que a alguien le interese un vídeo
    con el codigo listo para bajarse y probar si alguien tiene una impresora física hasar me gustaría colaborar.
    https://www.youtube.com/watch?v=d9ytWYRZ6w0

    ResponderEliminar