 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Mónica Cmdr

Registrado: 27 Sep 2002Mensajes: 136Ubicación: Pontevedra (España)
|
Publicado: Vie 26 Sep, 2003 8:50 am Asunto: Problema con comunicación entre aplicaciones |
|
|
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>(©data) );
//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 |
|
 |
Mónica Cmdr

Registrado: 27 Sep 2002Mensajes: 136Ubicación: Pontevedra (España)
|
Publicado: Vie 26 Sep, 2003 1:51 pm Asunto: |
|
|
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 |
|
 |
joseluisbz Lt Cmdr

Registrado: 31 Ene 2003Mensajes: 101Ubicación: Medellín - Colombia de Barranquilla
|
Publicado: Mie 08 Oct, 2003 11:52 pm Asunto: DDE |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|