none
Como enviar una variable de C++ a Visual Basic RRS feed

  • Pregunta

  • Buenas tardes miembros.

    He encontrado la forma de usar las .dll para comunicar C++ con VB, el problema que me enfrento, es que estoy usando un programa que procesa información en C++, cuando el programa realiza el algoritmo debe mandar una dato int del 1 al 9, este dato debe ser enviado a Visual Basic, para poder tomar las decisiones del programa y finalizar el resultado que espero.

    No hayo la manera de hacerlo??? Ojala fueran tan amables de ayudarme.

    miércoles, 4 de marzo de 2015 22:13

Respuestas

  • Si ambos son programas para la gui, una forma sencilla de hacerlo es usando RegisterWindowMessage(). En el inicio de ambos programas, llamas a esta función pasándole como argumento la misma cadena (digamos, "WM_CUADRANTE"). Como pasas el mismo argumento, la función devolverá el mismo resultado en ambos programas. Vos guardás ese resultado, que es un identificador (un short/atom).

    Cuando tu programa detecta el objeto en el cuadrante, hace un broadcast del mensaje SendMessage(HWND_BROADCAST, idMensaje, 0, 8), donde idMensaje es el identificador que conservaste, y 8 el cuadrante detectado.

    Tu mensaje es enviado a todas las ventanas del sistema, pero sólo será reconocido y procesado por la ventana principal de tu programa VB. Haces un override del método WndProc, testeas si el Msg es idMessage, y extraes el lParam.

    Esta especie de DDE pelado, es la forma más primitiva de pasar datos entre ventanas. Y la más sencilla, dos líneas de código en uno y tres en otro.

    • Marcado como respuesta Tony Verccety jueves, 5 de marzo de 2015 23:42
    jueves, 5 de marzo de 2015 11:56

Todas las respuestas

  • Necesita proveer más información.  El Visual Basic que menciona, ¿es Visual Basic .Net, o es Visual Basic clásico versión 5 o 6?  Luego del lado de C++:  ¿Es un ejecutable (.exe), o es una bibliotec (.dll)?

    Usted menciona que encontró la forma de usar DLL's para comunicar ambos lenguajes (que de hecho no es correcto decirlo así porque los lenguajes ya fueron procesados y compilados a lenguaje de máquina).  ¿Podría usted mostrarnos a qué se refiere con eso?


    Jose R. MCP
    Code Samples

    jueves, 5 de marzo de 2015 5:31
  • Muchas gracias por responder, haber si puedo aclarar sus dudas, estoy utilizando Visual Studio 2012, realice un programa de reconocimiento de objetos con procesamiento de imágenes en tiempo real (visión artificial) con ayuda de las librerías de OpenCV, dividí la pantalla en 9 cuadrantes, y logro detectar mi objeto qeu quiero reconocer en que cuadrante se encuentra, lo que quiero es enviar un dato entero que vaya del 1 al 9 (haciendo referencia al cuadrante donde esta mi objeto de detección), todo esto lo hago desde Visual C++, ese dato lo quiero enviar a Visual Basic (no estoy seguro si es .net, pero lo trabajo en el mismo Visual Studio 2012), el propósito de enviarlo a VB es por que allí cuento con un modulo que hace una conexión USB.

    Mi programa en C++ es un ejecutable, lo que busco es la forma de exportar esa variable y que Visual pueda interpretarla y saber si esta recibiendo un numero entero del 1 al 9, digamos que en pocas palabras busco el mediador que me permita enviar datos de C++ a VB, cuando ambos programas se estén ejecutando.

    Ojala me haya dado a entender mejor, le agradecería su apoyo, por que no hallo la manera de hacerlo.


    jueves, 5 de marzo de 2015 6:17
  • Si ambos son programas para la gui, una forma sencilla de hacerlo es usando RegisterWindowMessage(). En el inicio de ambos programas, llamas a esta función pasándole como argumento la misma cadena (digamos, "WM_CUADRANTE"). Como pasas el mismo argumento, la función devolverá el mismo resultado en ambos programas. Vos guardás ese resultado, que es un identificador (un short/atom).

    Cuando tu programa detecta el objeto en el cuadrante, hace un broadcast del mensaje SendMessage(HWND_BROADCAST, idMensaje, 0, 8), donde idMensaje es el identificador que conservaste, y 8 el cuadrante detectado.

    Tu mensaje es enviado a todas las ventanas del sistema, pero sólo será reconocido y procesado por la ventana principal de tu programa VB. Haces un override del método WndProc, testeas si el Msg es idMessage, y extraes el lParam.

    Esta especie de DDE pelado, es la forma más primitiva de pasar datos entre ventanas. Y la más sencilla, dos líneas de código en uno y tres en otro.

    • Marcado como respuesta Tony Verccety jueves, 5 de marzo de 2015 23:42
    jueves, 5 de marzo de 2015 11:56
  • Gracias Tony, pero no me dijo si el proyecto en C++ era un ejecutable o una biblioteca.

    Lo que nos dice Walter es cierto:  RegisterWindowMessage() es una forma inteligente y fácil de pasar un dato entre aplicaciones que tienen ventanas.

    Sin embargo, yo recomendaría que su proyecto de C++ fuera un DLL.  Además usted nos dice que tiene una forma de ligar C++ y VB, que por cierto no me la mostró (era otra de mis preguntas).  Sospecho que estamos hablando aquí de P/Invoke.  Si es así y si su proyecto de C++ es una DLL entonces sería cuestión de ayudarle a exportar la función que devuelve el número y listo.


    Jose R. MCP
    Code Samples

    jueves, 5 de marzo de 2015 13:42
  • Muchas gracias, intentare con el RegisterWindowMessage(), no tenía conocimiento de esa función.

    La forma que logre solucionarlo hasta hace pocas horas fue por medio de  FileSystemWatcher, se me ocurrió almacenar la variable en un fichero .txt con el numero del cuadrante de mi programa en c++, en VB invoque FileSystemWatcher, para detectar cuando se realizaba una modificación en el fichero con el método "Change", si VB detecta un cambio lee el fichero, extrae la información (que en este caso es un numero del 1 al 9) y hago una conversión CInt para convertirlo en entero.

    Me funciono muy bien esta forma, aunque como no soy muy bueno en la programación orientada a objetos, fue la forma que se me ocurrió solucionarlo.

    Haré caso del consejo de emplear RegisterWindowMessage() para poder hacer un código más limpio y evitar la dependencia del ficheros.

    Muchas Gracias

    jueves, 5 de marzo de 2015 22:12
  • Walter, sería tan amable proporcionarme las 5 líneas de código que menciona, ando indagando del tema, pero no hay mucha información del RegisterWindowMessage().

    Agradecería su ayuda, para mejorar mi aplicación.

    jueves, 5 de marzo de 2015 23:38