Inicio > C/C++, Java, NetBeans > Jawin: Llamar metodos de una DLL con java

Jawin: Llamar metodos de una DLL con java


Jawin es una de las tantas librerias que se puede utilizar para poder trabajar los metodos de una DLL desde java. Lo mas comun era trabajar con JNI pero esto implicaba tener los fuentes de la DLL para poder realizar las modificaciones y volver a realizar la compilacion, algo tedioso en algunos casos.

Bueno una forma de utilizar esta libreria es creando una pequeña DLL en C con un metodo basico, por ejemplo el metodo “suma” que implica tener dos variables de entrada del tipo entero y retornar un valor entero. Para esto configuré NetBeans con el compilador gcc para poder desarrollar codigo en C/C++ siguiendo este manual, para luego crear un proyecto del tipo “C/C++ Dynamic Library”. Una vez creado este proyecto agrego un fuente al cual llamare “Suma.c” y dentro de este archivo creamos el metodo antes mencionado, quedando de la siguiente manera:

jawin_01

Como veran es algo simple y basico, ahora solo nos queda construir la DLL, para esto click derecho sobre el proyecto y elegimos “Build”, y listo ya tenemos generada nuestra DLL.

Ahora para poder utilizar el metodo de la DLL desde java, hacemos lo siguiente:

  • Primero agregamos la libreria jawin al proyecto (jawin.jar)
  • Luego segun nos indica la documentacion copiamos el archivo “jawin.dll” en el directorio “C:\windows\System32″.

Y listo ahora empezamos a escribir el codigo que llamaria al metodo, algo asi como esto:

jawin_02

Como podran ver el nombre de mi DLL es “LibSuma.dll”, tener en cuenta que el nombre de la dll lo da el nombre del proyecto(anteponiendose el sufijo “lib”, pero esto lo pueden variar en las propiedades del proyecto), y el metodo, en este caso “suma”; hago la invocacion dandole los parametros antes mencionados y en la variable “g” recepciono el resultado y listo. 

jawin_03

Cabe aclarar que yo puse solo el nombre de la libreria y no toda la ruta porque agregue la ruta de mi libreria a mi PATH. Otra forma seria colocar la libreria generada en “C:\Windows\System32″; o de lo contrario colocan toda la ruta de la libreria incluida el nombre.

Como veran para este caso es algo sencilo de trabajar y no tan tedioso, yo ahora estoy en un proyecto algo mas grande trabajando con esta libreria y la verdad me esta dando resultados.

About these ads
Categorías:C/C++, Java, NetBeans Etiquetas: , , , ,
  1. DANIEL
    febrero 16, 2009 en 6:22 pm | #1

    Gracias por la info, pero porfavor, me podrias aclarar mas al detalle la ultima parte de donde ubicas la libreria DLL y como haci lo ubicas en el classpath. medio q no la capto. gracias.

    • nachxs
      febrero 16, 2009 en 7:01 pm | #2

      Hola Daniel, claro, mira cuando tu creas una DLL cualquiera, si quieres ejecutar o llamarla desde cualquier aplicacion tienes 3 opciones:
      - La primera es colocar toda la ruta donde esta ubicada tu dll incluido el nombre en la invocacion en tu aplicacion
      - La segunda forma es que la coloques en el PATH (Click derecho MI PC –>Propiedades–>Opciones Avanzadas–>Variables Entorno–>Variables de Sistema) la ruta del directorio en donde tienes tu DLL (sin el nombre de la DLL) al final de todo el contenido, de esta forma cualquier aplicacion que haga la invocacion sabra donde encontrarla.
      - Y la tercera es colocar tu libreria dentro del directorio C:\Windows\system32, dado que esta carpeta ya esta en la path por defecto.

      en la 2 ultimas forma solo colocarias el nombre de la DLL en tu aplicacion de la manera como yo la hago. Espero me haya dejado entender.

      Saludos.

  2. DANIEL
    febrero 17, 2009 en 11:02 am | #3

    Gracias por la rapidez de respuesta y si quedo claro.

    Pero me sale este problemilla, explico:
    cree un dll en C con vb .net 2008 me genero: “Suma.dll” y lo ubique en C:\Windows\system32

    En la clase java puse todo esto:
    public static void main(String[] args) throws COMException {

    FuncPtr metodo = new FuncPtr(“LibSuma.dll”, “suma”);
    Integer g = metodo.invoke_I(10, 12, ReturnFlags.CHECK_HRESULT);
    System.out.println(“Resultado = ” + g);

    }

    Prove tmb quitandole el sufijo “Lib” para llamar al dll pero no levanta, me sale este mensaje por consola:

    Exception in thread “main” org.jawin.COMException: 8007007e: No se puede encontrar el módulo especificado.

    at org.jawin.Bootstrap.loadLibrary(Native Method)
    at org.jawin.FuncPtr.(FuncPtr.java:79)
    at javaapplication.Main.main(Main.java:23)
    Java Result: 1
    BUILD SUCCESSFUL (total time: 2 seconds)

    y me hace referencia a la linea donde declaro al dll y su metodo:

    >>>FuncPtr metodo = new FuncPtr(“LibSuma.dll”, “suma”);

    No se si es por la version del jar o no se q mas pensar q puede ser.
    te comento q me baje el jawin q viene en esta carpeta: jawin-2.0-alpha1
    no se enque estoy errando, haber si me puedes enviar el ejemplo a mi correo giancuse@hotmail.com.

    Saludos.

    • nachxs
      febrero 17, 2009 en 11:17 am | #4

      Hola Daniel, mira el problema esta en que tu no colocaste la libreria propia de Jawin (jawin.dll) en el C:\Windows\system32, si te dfijas en el paquete jawin que descargaste alli tienes un jar y una dll. La dll deberias colocarlo en C:\Windows\system32.
      Con eso ya no te deberia salir este error

      Saludos.

  3. DANIEL
    febrero 17, 2009 en 11:56 am | #5

    Bueno nachxs, te agradesco el tiempo q le das a responder a mi dudas. Se segui tu ejemplo puse el jawin.dll en C:\Windows\system32 pero sigue con el mismo mensaje.

    • nachxs
      febrero 17, 2009 en 12:43 pm | #6

      No te preocupes Daniel, dime una cosa que version de Windows usas??, porque a mi me sale ese error cuando no tengo la dll en el system32, o de lo contrario seteas en tu PATH (variables de entorno) el directorio del jawin (tu_directorio/jawin/bin).

      Me comentas.

  4. DANIEL
    febrero 17, 2009 en 1:03 pm | #7

    agregue la ruta “C:\jawin-2.0-alpha1\bin\” donde esta el jawin.dll pero sigue igual. Tengo el XP Professional SP3.

    Te comento que hice lo mismo con el eclipse y dan el mismo mensaje.

    mi dll se llama Suma.dll al momento de llamarlo en la clase java lo declaro como LibSuma.dll es asi como lo entendi, es correcto ese procedimiento.

    estoy penssando en probarlo en otro cpu.

    • nachxs
      febrero 17, 2009 en 1:15 pm | #8

      A ver vayamos por partes:

      1. A ver primero fijate como se llama la libreria que generaste, si se llama Suma.dll tienes que ponerle el mismo nombre cuando lo invocas desde java.
      2. Otra cosa es que tienes que agregar la libreria jawin.jar a tu proyecto (imagino que eso lo tenias, por eso no te pregunte antes).
      3. y al final agregas la libreria jawin.dll a “c:\windows\system32″ o seteas el path como te indique.

      Con esto deberia funcionarte, porque segun la documentacion eso es lo unico que se hace. Revisa eso y me comentas

      Saludos.

  5. DANIEL
    febrero 18, 2009 en 4:22 pm | #9

    Amigo nachxs hice todo como me explicaste inportando el jawin.jar todo eso. Pero por razones desconocidas no levanta y me sale el mismo error.

    • nachxs
      febrero 18, 2009 en 6:13 pm | #10

      MMMM, Daniel dentro de la dll tienes un metodo cierto?? como se llama el metodo?? se llama “suma”??, te lo pregunto porque quizas tu metodo tenga otro nombre.
      Ahora por otro motivo no sabria decirte exactamente a que deba el error, todo lo que te indique es lo que hice y no tube problemas.

  6. abril 6, 2009 en 10:17 am | #11

    Hola, para el paso de parametros que sean de entrada y salida, como se realiza?

    Es decir, yo tengo una funcion con esta cabecera

    int LeeIDFabricante (char * CadFabricante);

    y no se como hacerlo exactamente, yo había hecho:
    int Resultado = metodo1.invoke_I(CadenaFabricante, ReturnFlags.CHECK_HRESULTS);
    pero no me modifica el valor del String de entrada, como puedo realizarlo?

    • nachxs
      abril 7, 2009 en 5:22 pm | #12

      Hola Ignacito, no probe un metodo con puntero pero publica el metodo para poder plasmarlo y asi ver cual podrias ser el error.

      Saludos.

  7. Carlos Torres
    abril 7, 2009 en 4:51 pm | #13

    Hola nachxs, mucho gusto, yo tambien tengo el mismo problema que Daniel.

    • nachxs
      abril 7, 2009 en 5:54 pm | #14

      Hola Carlos, mira estoy probando la posibilidad de que el error se de por el Service Pack 3, yo cuando trabajaba con el Service Pack 2 no he tenido este problema, pero desde que actualize el 3 ahora me esta dando el mismo problema, vere si es por eso o buscare otra alternativa.

      Saludos.

  8. Carlos Torres
    abril 7, 2009 en 9:47 pm | #15

    Hola nachxs, gracias por la pronta respuesta, el problema mio es que estoy intentando leer un dll para manejo de lectores de tecnologia rfid. Lo que pasa es que ahorita no estoy en mi casa para darte mas informacion, o un correo tuyo para enviarte el dll. De verdad te agradezco la ayuda que me puedas dar. De verdad muchas gracias.

    • nachxs
      abril 8, 2009 en 9:46 am | #16

      Enviamelo a nachxs[arroba]gmail.com

      Saludos.

  9. Ignacito
    abril 8, 2009 en 10:04 am | #17

    Como el parámetro que le paso es un punto a un char en realidad, lo que he hecho es pasarle como entrada un array de bytes, a ver si así iba bien, pero no he conseguido que vaya… no me modifica el valor de entrada. El método en sí esta en asm, no se si servirá mucho

    metodo1 = new FuncPtr(“P2_Libreria.dll”, “LeeIDFabricante”);
    byte CadenaFabricante [] = new byte [13];
    int Resultado;
    Resultado = metodo1.invoke_I(CadenaFabricante, ReturnFlags.CHECK_HRESULT);

    La función en sí es:

    __declspec (dllexport) int LeeIDFabricante (char * CadResultado)
    {
    __asm
    {
    mov eax, 0
    cpuid
    mov eax, CadResultado
    mov [eax], ebx
    mov [eax + 4], edx
    mov [eax + 8], ecx
    mov [eax + 12], 0
    mov eax, 0
    cpuid
    }

    }

    Resultado si me devuelve lo que me tiene que devolver, pero CadenaFabricante no

  10. Ignacito
    abril 8, 2009 en 10:06 am | #18

    La salida debe ser del tipo “GENUINTEL” , o algo del estilo

  11. Jou
    abril 17, 2009 en 11:06 am | #19

    invoke_I es para devolver enteros, invoke_S es para devolver cadenas, pero, ¿como funciona? Puedes poner un ejemplo? Gracias

    • nachxs
      abril 20, 2009 en 4:33 pm | #20

      Funciona igual, la unica diferencia es que no tendras un entero como resultado, si no una variable del tipo byte[].
      byte[] out = metodo.invoke_S(20,30,ReturnFlags.CHECK_HRESULT);
      System.out.println(“result: ” + out.toString());

  12. Luis Alejandro
    mayo 5, 2009 en 5:48 pm | #21

    Hola nachxs, muy interesante este tema, esta genial,
    solo una pregunta…
    También funciona con dll’s echas en Visual Studio 2008 C++?
    ya ves que para que los programas corran se necesita el .NET Framework, entonces no se si sea lo mismo hacer un dll en cygwin y hacer un dll en c++ .net,
    muchas gracias por tu respuesta.

    Saludos…

  13. humber
    junio 23, 2009 en 9:57 am | #22

    Hola Nachxs, te felicito por esta pagina..
    1. Consulta, Jawin tiene soporte para Punteros C.??
    2. Tengo la siguiente función C, que requiero invocar:

    extern “C” __declspec(dllexport) long __cdecl Deencripcion (LPSTR cadena, LPSTR llave);

    Donde:
    cadena es texto pasado por referencia, con punteros.
    llave texto pasado por referencia, con puntero
    Retorna un long, como resultado.

    Cual es la mejor forma de invocar dicha funcion, con Jawin??

    3. Cual sería el procedimiento o instrucción de marshall del invoke?? como señala el link http://jawinproject.sourceforge.net/instruction_docs.html#

    Gracias y saludos.

  14. Manuel
    junio 25, 2009 en 10:57 am | #23

    Funciona tambien con una dll propia de windows? esa dll tu la hiciste en c, como podria llamar yo una dll propia de windows desde java?
    Habia leido que haciendo un puente con C++ es decir que C++ llamara la dll de windows y yo llamara la dll de C++? tienes alguna sugerencia, pues no se como invocar metodos de dll desde c++ y poder usar un puente.

    Saludos a todos.

    • nachxs
      junio 27, 2009 en 7:02 pm | #24

      Hola Manuel, la dll lo que cree con C y lo compile con gcc sobre windows, configurando Netbeans. Ahora para poder llamar a una dll propia de windows, jawin porporciona en la documentacion un ejemplo de una forma de hacerlo.

      Ahora, otra alternativa muy buena tambien es Jacob que es una libreria con la que puedes hacer lo mismo.

      Saludos.

  15. Alex
    julio 21, 2009 en 5:35 am | #25

    Hola, estoy probando jawin con un dll creada en vb6, pero la verdad que no he conseguido hacerlo funcionar. Existe alguna diferencia a la hora de la llamada si la dll está escrita en c ó en vb6?

    Muchas Gracias

    • Alex
      julio 21, 2009 en 5:43 am | #26

      Olvidé adjuntar la traza que saco:

      C:\JBuilder8\jdk1.4\bin\javaw -classpath “C:\Documents and Settings\alejandro.herrero\jbproject\jawin\classes;C:\JBuilder8\jdk1.4\jre\lib\rt.jar;C:\JBuilder8\jdk1.4\jre\lib\i18n.jar;C:\JBuilder8\jdk1.4\jre\lib\sunrsasign.jar;C:\JBuilder8\jdk1.4\jre\lib\jsse.jar;C:\JBuilder8\jdk1.4\jre\lib\jce.jar;C:\JBuilder8\jdk1.4\jre\lib\charsets.jar;C:\JBuilder8\jdk1.4\jre\classes;C:\JBuilder8\jdk1.4\lib\tools.jar” -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=ALB-EW0131:3655,suspend=y org.jawin.prueba
      java.lang.UnsatisfiedLinkError: no verificarFirma.dll in java.library.path

      at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1403)
      at java.lang.Runtime.loadLibrary0(Runtime.java:788)
      at java.lang.System.loadLibrary(System.java:832)
      at org.jawin.Bootstrap.(Bootstrap.java:43)
      at org.jawin.FuncPtr.(FuncPtr.java:79)
      at org.jawin.prueba.main(prueba.java:22)

      Exception in thread “main”

  16. David Perez Resendiz
    julio 24, 2009 en 1:00 pm | #27

    Hola, Quisiera ver si me puedes ayudar, al invocar metodos que no requieren parametros no tengo problemas, pero al querer pasarle un parametro al metodo que llamo, marca error.
    podrias explicar por favor como se hace.
    Gracias

    • nachxs
      julio 24, 2009 en 3:01 pm | #28

      Hola David, me podrias decir cual es el error que te manda???

      Saludos.

      • David Perez Resendiz
        julio 24, 2009 en 4:29 pm | #29

        Veras, el metodo es: fError(aNumError, aMensaje, aLen )
        el primer parametro es un numero, el segundo una cadena y el tercero otro numero, por lo tanto el codigo deveria quedar mas o menos asi:

        FuncPtr metodo = null;
        metodo = new FuncPtr(“MGW_SDK.dll”, “fError”);

        String error = metodo.invoke_I(error,” “, 230, ReturnFlags.CHECK_HRESULT);

        pero si esrcibo eso, netBeans me dice que la clase FuncPtr no tienen ningun metodo con ese constructor.

  17. nachxs
    julio 24, 2009 en 5:14 pm | #30

    Hola David, bueno veo en esta linea

    String error = metodo.invoke_I(error,””, 230, ReturnFlags.CHECK_HRESULT);

    Tu me dices que el primer parametro es un numero, entonces asumo que le envias una cadena para probar la funcion??. Si fuese asi ‘error’ deberia estar entre comillas o ‘error’ es una variable??

    • David Perez Resendiz
      julio 24, 2009 en 5:41 pm | #31

      Antes que nada, muchas gracias por tu pronta respuesta, se ve que estas muy atento a tu blog.
      Lo que pasa es que estoy intentando trabajar con el SDK de AdminPaq, deja pongo mi codigo completo:

      FuncPtr metodo = null;
      metodo = new FuncPtr(“MGW_SDK.dll”, “fInicializaSDK”);

      //primero inicio el SDK

      if (metodo.invoke_I(ReturnFlags.CHECK_HRESULT) == 0) {
      System.out.println(“Conectado SDK”);
      }

      //aqui quiero abrir mi empresa
      metodo = new FuncPtr(“MGW_SDK.dll”, “fAbreEmpresa”);

      //w: es el directorio en el que se encuentra
      int con= metodo.invoke_I(“w:”,ReturnFlags.CHECK_HRESULT);

      //cada ves que ejecuto un metodo me regresa un status, si //es 0 significa que se realizo correctamente, si no, me //regresa un codigo de error

      if (statusConexion == 0) {
      System.out.println(“Conectado a empresa”);
      } else {
      /*ese codigo de error lo quiero procesar con este otro metodo para ver lo que no se abrio la empresa
      “con” es la variable donde se guardo mi codigo de error, el string error, es donde el metodo me va a guardar el mensaje de error y 50 es la longitud del mensaje, si todo saliera bien me deveria de regresar un 0, pero no se como pasarle esos 3 parametros si el metodo invoke_I() no me deja
      */
      try{
      String error = “”;
      metodo = new FuncPtr(“MGW_SDK.dll”, “fError”);
      metodo.invoke_I(con, error,50,ReturnFlags.CHECK_HRESULT);
      }catch (COMException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
      }

      System.out.println(“Error al abrir empresa”);
      }

      metodo = new FuncPtr(“MGW_SDK.dll”, “fTerminaSDK”);
      if (metodo.invoke_I(ReturnFlags.CHECK_HRESULT) == 0) {
      System.out.println(“Finalizada SDK”);
      }

      } catch (COMException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
      }

      Te agradesco mucho por tu tiempo, quise intensar usar este SDK para evitar peliarme con la 40 tablas de la base de datos y sus 70 campos, pero creo que mejor lo voy a dejar por la paz y hare todo a manita : – (.

      nos vemos.

      • octubre 13, 2011 en 10:32 am | #32

        Hola, de antemano un saludo, lo has intentado primero directamente hacerlo desde VB o C#++, lo digo porque al menos yo le inverti un buen de tiempo y logre hacer la conexion de la empresa y poder cargar un documento en la empresa seleccionada, si gustas, y si el dueño del blog no le incomoda, visita mi pagina, y ahi colgare un exe de ejemplo para que puedas ver como si se puede realizar la conexion ya sea con adminpaq o Factura electronica, que ambos programas comparten la misma base de datos
        http://www.sacfi.com
        saludos

  18. Jose Miguel
    septiembre 23, 2009 en 7:01 pm | #33

    Estoy utilizando Netbeans en Windows 64 bit yal ejecutar mi proyecto me manda el siguiente error:

    Exception in thread “AWT-EventQueue-0″ java.lang.UnsatisfiedLinkError: C:\WINDOWS\system32\jawin.dll: Can’t load IA 32-bit .dll on a AMD 64-bit platform

    Me podrian informar si hay alguna forma de accesar a una DLL en netbeans con windows 64bits.

    Saludos

    • nachxs
      septiembre 23, 2009 en 7:05 pm | #34

      Hola Jose, creo que el error esta claro, la libreria jawin.dll esta compilado en una plataforma para 32 bits, yo tambien tube el mismo problema, busque en la pagina de jawin para ver si existia una version para 64 bits pero aparentemente no lo hay.

      • Jose Miguel
        octubre 1, 2009 en 9:40 am | #35

        Gracias por tu comentario nachxs.
        Tengo otra consulta para ver si me pueden ayudar.
        Si yo creo una aplicacion con jawin utilizando windows 32bits. Esto me puede dar problemas cuando trate de utilizar esta aplicacion en un servidor de 64bits.

        Saludos,

  19. soledad
    septiembre 30, 2009 en 7:33 pm | #36

    ola qisiera saber cómo ago para devolver el cálculo de un array a el método principal?? ya que le asigno ese cálculo a una variable y me sale el sigte error:

    ‘.class’ expected
    unexpected type
    required:value
    found:class

  20. Gabriel
    octubre 9, 2009 en 3:49 pm | #37

    hola, estoy siguiendo el ejemplo, pero al ejecutar me da el siguiente error:
    Que podra ser?

    c:\_KBases\PruebaDLL2\DATA002>”c:\archivos de programa\java\jdk1.6.0\bin\java.exe” HelloDllGeneric
    org.jawin.COMException: 8007007f: No se encontr¾ el proceso especificado.

    at org.jawin.Bootstrap.loadFunction(Native Method)
    at org.jawin.FuncPtr.(FuncPtr.java:80)
    at HelloDllGeneric.main(HelloDllGeneric.java:12)
    Exception in thread “main” org.jawin.COMException: 8007007f: No se encontr¾ el proceso especificado.

    at org.jawin.Bootstrap.loadFunction(Native Method)
    at org.jawin.FuncPtr.(FuncPtr.java:80)
    at HelloDllGeneric.main(HelloDllGeneric.java:12)

  21. noviembre 2, 2009 en 6:15 pm | #38

    Buenas, yo tambien estuve con sus mismos problemas, revise cada paso detalladamente
    hasta q me di cuenta, que no era el jawin sino la dll (que crean) propiamente dicha
    modifiquen su dll o la forma como lo crean, bueno en mi caso lo creo con codeblocks, y ingreso la cabecera en el main.h y el cuerpo de la funcion en el main.cpp
    compilo y sin problemas me corre.

    Saludos, y gracias por el tuto.

    PD. para salir de la duda usen este ejemplo:
    y si les funciona entonces es su dll, sino ya pueden seguir preguntando.
    saludos.

    FuncPtr msgBox = null;
    try {
    msgBox = new FuncPtr(“USER32.DLL”, “MessageBoxW”);
    msgBox.invoke_I(0, “Hello From a DLL”, “From Jawin”, 0, ReturnFlags.CHECK_FALSE);
    } catch (COMException e) {
    // handle exception
    } finally {
    if (msgBox != null) {
    try {
    msgBox.close();
    } catch (COMException e) {
    // handle fatal exception
    }
    }
    }
    http://jawinproject.sourceforge.net/jawinuserguide_dll.html

  22. antonio
    diciembre 15, 2009 en 2:21 pm | #39

    quiero saver la solucion de un error que me sale cuando inicio una ejecucion de un programa que me sale rum-time error -2147024769 (8007007)

  23. Ildemaro
    enero 22, 2010 en 12:34 am | #40

    Saludos…alguien me puede decir como le hago si quiero hacerlo pero desde Linux, es decir, esto va bien para Windows pero me gustaria saber si alguno tiene la experiencia desde Ubuntu u otra distribucion?…

  24. Lucia
    febrero 22, 2010 en 6:53 pm | #41

    ¿Cómo puedo invocar el siguiente método de una DLL usando jawin?

    long Copy(wchar_t *filename, wchar_t *remote_machine, wchar_t *resource, wchar_t *remote_filename)

  25. Laura
    marzo 12, 2010 en 7:21 am | #42

    Hola … sabéis si se puede usar jawin para usar una .dll creada desde visual basic. Necesito usar un metodo de un objeto de esa dll, pero no sé si es posible.
    Muchas gracias

    • nachxs
      marzo 12, 2010 en 10:53 pm | #43

      Hola Laura, fijate que probe hacerlo desde una libreria en visual basic y si me funciono. Seria cuestion que pruebes.

      Saludos.

      • Laura
        marzo 16, 2010 en 4:12 am | #44

        Hola nachxs! muchas gracias por tu respuesta, ya he conseguido obtener el acceso al FuncPtr de mi función creada en vb6 pero no sé como obtener el resultado de mi función. La función lo que hace es desencriptar un dato pasado como String que y te devuelve el dato desencriptado como un String también. ¿Cuál es la forma de llamarlo desde java a esa función?

        Saludos y muchas gracias.

  26. RFM
    junio 10, 2010 en 1:43 am | #45

    Buenos días,
    Tengo dudas acerca del uso de las funciones de una dll a través de jawin. La dll está construída en C++, y he comprobado que las funciones de la misma tienen el formato _nombre@número. No consigo hacer la llamada a ninguna función, actualmente me lanza una excepción:
    0: La operación se ha completado correctamente.
    ¿Hay algún problema con esa definición de funciones? ¿Puedo usar jawin para llamarlas?
    Pongo como ejemplo la cabecera de una de las funciones de forma esquemática:
    _Función@20(String, String, String, String) Long
    ¿Cómo se haría el invoke? Quizás tenga ahí el error.

    Gracias de antemano,
    Saludos

    • RFM
      junio 11, 2010 en 1:18 am | #46

      Olvidé indicar que a la función _Función@20(String, String, String, String) Long, habría que añadirle un parámetro pasado por referencia de tipo Long.

  27. Lollero
    agosto 12, 2010 en 2:04 am | #47

    Hola, es de mucha utilidad esta informacion, gracias. Pero tengo un problema, el metodo que tengo yo en la DLL lleva tres parametros, que son 3 strings, el ultimo de ellos es de salida, por ejemplo: AsignaPassword(String usuario, String password, String salida). Parece ser que mi llamada no encaja con ningun invoke de la clase FuncPtr INVOKE_XX(“USUARIO”, “PASSWORD”, “LOQUESEA”,returnflags.xx)
    Gracias de antemano

  28. Ana Jose
    agosto 22, 2010 en 8:25 pm | #48

    estoy tratando de implementar el ejemplo pero me sale este error
    org.jawin.COMException: 8007007e: No se puede encontrar el módulo especificado.
    he hecho lo que dicen los comentarios pero no he podido solucionarlo. ayúdenme por favor que ya llevo rato en esto

  29. eduardo
    octubre 19, 2010 en 12:55 pm | #49

    hola buen dia he leido sus preguntas y me parece que se acerca mucho alo que yonecesito ojala queme puedan ayudar mi problema es el sisguiente ya que neesito leer datos de un dispositivo el cual tiene en su memoria almacenados datos que yo requiero el prblema es que tengo que generar una aplicacion en java estoy utilizando netbeans 6.9 para la cual requiero agregar la libreria sdk123.dll ( ejemplo) para poder utilizar sus metodos que estan dentro de esta libreria mi duda es si la spuedo agregar de la misma forma como la tienen agregada en el primer ejemplo de suma o de que forma puedo agregar dicho dll o referenciarlo gracias por su atencion.

  30. Meylina
    febrero 7, 2011 en 8:48 am | #50

    Saludos, me pregunto si los parametros de entrada del Metodo del DLL por ejemplo en mi caso son 20 variable STRING y 1 de respuesta es String. Esto lo puedo hacer llamando la alguna de las funciones de jawin. Lo pregunto por que lo estaba probando y no vi un metodo que tenga esta cantidad de parametros. A ver si me pueden dar una ayuda. Muchas Gracias

  31. Joel
    abril 28, 2011 en 3:38 pm | #51

    Escribo para agradecerte éste aporte, es justo lo que andaba buscando. La DLL la creé usando Visual C++ pero me latió el tutorial que recomiendas para utilizar el compilador gcc en NetBeans, en un rato libre trataré de implementarlo.
    Saludos

  32. Jose Miguel
    octubre 19, 2011 en 7:40 pm | #52

    Buenas noches. nachxs mil gracias por la informacion.
    Tengo una consulta la dll puede estar desarrollada con VB .net?

    Saludos,

  33. marzo 18, 2012 en 12:53 pm | #53

    Saludos bachxs yo ya copie y pegue la librería jawin.dll al directorio system32 también agregue el jawin.jar a mi proyecto de netbans en propiedades add/jar… etc ect también hice la mi dll en dev c++ se llama c.dll y el método se llama suma y tengo el siguiente código en C
    #include
    #include
    #include

    int suma(int x,int y){
    return x+y;
    }

    y en java este código

    import org.jawin.COMException;
    import org.jawin.FuncPtr;
    import org.jawin.ReturnFlags;
    public class dll {

    public static void main(String[] args) throws COMException {
    FuncPtr metodo=null;
    metodo =new FuncPtr(“D:\\c.dll”,”suma”);
    Integer g=metodo.invoke_I(10,20,ReturnFlags.CHECK_HRESULT);
    System.out.println(g);
    }

    }
    pero me genera este Error, no se que este haciendo mal….

    Exception in thread “main” org.jawin.COMException: 8007007f: No se encontró el proceso especificado.

    at org.jawin.Bootstrap.loadFunction(Native Method)
    at org.jawin.FuncPtr.(FuncPtr.java:80)
    at dll.main(dll.java:10)
    Java Result: 1
    BUILD SUCCESSFUL (total time: 0 seconds)

    • victor garnica
      junio 8, 2012 en 1:39 pm | #54

      a mi me generaba ese error… y pues por lo que entendia era xq por ejemplo en tu caso en la linea metodo =new FuncPtr(“D:\\c.dll”,”suma”); la funcion que supuestamente esta dentro del c.dll….. no esta definida como tal….. ello es algo curioso xq pues veo q en el dll esta tal funcion y pues nada…. darle mil formas al asunto es lo q toca hacer….. y por no dejar…. ubica tambien el c.dll en system32 :D

  34. marzo 18, 2012 en 12:55 pm | #55

    las librerías si las tengo bien agregadas solo que al postearlo no se muestran pero si tengo bien agregadas estas librerías en c
    conio.h
    stdio.h
    stdlib.h

    si no no hubiera podido compilar

  35. victor garnica
    junio 8, 2012 en 1:22 pm | #56

    hola… he revisado su ejemplo y esta 1A, mas sin embargo… debo implementarlo con un DLL llamado TFHKAIF.DLL que sirve para controlas las impresorar fiscales (ej: BIXOLON SRP-270, comucacion por puerto “com”) y una de las funciones q posee el susodicho dll es SendCmd que en teoria deberia enviar la informacion que se imprime pero….. son varios parametros y segun printPuertoCom.invoke_ cualquiera d sus metodos recibe diferentes parametros pero el que necesito no estaria… 2 enteros y una cadena.
    alguna sugerencia u otra solucion para imprimer en este medio de impresora.
    gracais por su atencion

  36. fredy
    noviembre 29, 2012 en 11:47 am | #57

    PUEDES ENVIARME EL CODIGO FUENTE A MI CORREO?
    TE LO AGRADECERIA!!

  37. fredy
    noviembre 29, 2012 en 4:17 pm | #58

    Me aparece este error , tendras alguna idea de que pueda ser?

    org.jawin.COMException: 8007007f: No se encontró el proceso especificado.

  1. agosto 18, 2009 en 2:02 pm | #1

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 34 seguidores

%d personas les gusta esto: