Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problema con comunicación entre aplicaciones

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema con comunicación entre aplicaciones Responder citando

Buenas,
mi problema es el siguiente: necesito pasar un par de datos de una aplicación a otra, pero estoy teniendo problemas.
La aplicación "receptora" del mensaje se llama Gestor Base Datos Equipos, y tiene una ventana inicial que contiene una serie de botones que abren otras ventanas. Una de esas ventanas se llama VentanaHardware (Unit4) y es la que se tiene que comunicar con la otra aplicación que se llama Cargador.

He utilizado el código que explica _Leo en https://cppbuilder.es/viewtopic.php?t=3318&highlight=aplicaciones
de la siguiente forma:

En la aplicación receptora, en Unit4.h:
Código:

void __fastcall OnDatosRecibidos(TWMCopyData& msg);

    BEGIN_MESSAGE_MAP

        MESSAGE_HANDLER(WM_COPYDATA, TWMCopyData, OnDatosRecibidos);

    END_MESSAGE_MAP(TForm)
/////////////////////////////////////////////////
    struct TCargaSoftware
    {
        char msVersion[6];
        char msCargado[2];

    } CargaSoftware;


En Unit4.cpp:
Código:

void __fastcall TVentanaHardware::OnDatosRecibidos(TWMCopyData& msg)

{
    ShowMessage("Llegó un mensaje");
    // Comprueba si el mensaje viene con el

    //   identificador numerico que ha usado el transmisor

    if ( msg.CopyDataStruct->dwData == 130 )

    {

        // Obtenemos el puntero que apunta a nuestros datos

        TCargaSoftware *CargaSoftware =

            reinterpret_cast<TCargaSoftware*>( msg.CopyDataStruct->lpData );
        // Añadimos al memo los datos recibidos

        if (CargaSoftware->msCargado=="1") {
            Carga_Software->Checked=true;
            Edit_Version_Soft->Text=CargaSoftware->msVersion;

        }
        /*
        Memo1->Lines->Add( nuestrosDatos->szNombre );

        Memo1->Lines->Add( nuestrosDatos->szTelefono );

        Memo1->Lines->Add( "-----" );*/

        // Aqui tenemos el handle desde donde se envio el mensaje

        //   podemos usarlo por ejemplo para enviar una respuesta

        // HWND hWnd = msg.From;

        msg.Result = true;  // Devolvemos true para indicar

                            // que hemos procesado el mensaje
        ShowMessage("Mensaje recibido");
    }

}


En la aplicación emisora del mensaje hay un botón para enviar el mensaje.
En dicha aplicación he puesto el siguiente código. En Unit1.h:
Código:

private:   // User declarations
    struct TCargaSoftware
    {
        char msVersion[6];
        char msCargado[2];

    } CargaSoftware;


Y en Unit1.cpp en el evento OnClick del botón:
Código:

void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
    AnsiString ProgramaReceptor="Gestor Base Datos Equipos";
    HWND hwnd;
    hwnd=FindWindow(NULL,ProgramaReceptor.c_str());

    if (hwnd) {
        lstrcpyn( CargaSoftware.msCargado, "1", 1 );
        lstrcpyn( CargaSoftware.msVersion, ExtractFileName(Edit1->Text).c_str(), 5 );

        COPYDATASTRUCT copydata;

        copydata.dwData = 130;  // Esto lo podemos usar como un identificador, para

                            //   que el receptor compruebe que es solo para el

        copydata.cbData = sizeof( CargaSoftware );  // Tamaño de nuestra estructura

        copydata.lpData = &CargaSoftware;           // Puntero a nuestra estructura

       
        SendMessage( hwnd, WM_COPYDATA,

        reinterpret_cast<LPARAM>(Handle),       // Handle del remitente

        reinterpret_cast<WPARAM>(&copydata) );
        //CargaSoftware.msCargado="1";
        //CargaSoftware.msVersion=ExtractFileName(Edit1->Text).c_str();
    }
    else
        ShowMessage("No se ha encontrado la ventana");

}


Parece que la parte emisora funciona bien, porque si la aplicación receptora no se está ejecutando salta el mensaje de que no ha encontrado la ventana y cuando sí se está ejecutando no ocurre nada.
Pero la aplicación receptora no entra nunca en el evento "OnDatosRecibidos", ¿puede que tenga algo que ver que lo que reciba los datos sea una ventana de esa aplicación, y no la aplicación en sí?, no sé si me explico bien. Quizás debería cambiar el nombre del HWND por el de la ventana o algo así.

Bueno, espero que me hayais entendido. Gracias por vuestra atención y un saludo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Arreglado.
Por si le sirve a alguien explico que en la instrucción FindWindow...., en lugar de poner el nombre de la aplicación hay que poner el nombre que aparece en la ventana "receptora" cuando ésta está abierta, es decir, el Caption de la ventana receptora.

Saludos!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: DDE Responder citando

Hay unos conponentes que se llaman DDE combinado con ( Server y Client) en alguna de esas pestañas.
Eso permite comunicar aplicaciones...Entre VBasic, VC++, Delphi y CppBuilder...

Hace dos añas que deje de utilizar Builder...
_________________
Please Response to:joseluisbz@bigfoot.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.