| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Vie 06 Feb, 2009 3:20 pm Asunto: Llamadas entre Aplicaciones por DDE |
|
|
Hola,
He estado buscando en el foro, algun ejemplillo de comunicaciones
entre aplicaciones mediante DDE, (no sobre el paso de mensajes).
y no encontre nada, funciones como DdeInitialize,DdeCreateStringHandle,
etc. pero nada.
¿ Alguna idea ? |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Lun 09 Feb, 2009 12:43 pm Asunto: |
|
|
Hola,
No se que pasa que no funciona, efectivamente tal y como indicas
en la pestaña de "System", existen 4 componentes para
manejar 'DDE' entre 2 Aplicaciones,
la primera aplicación la tipica "cliente" que utilizara los componentes DdeClientConv,DdeClientItem.
y otra la llamada "Servidor", que usa los componentes DdeServerConv1, y DdeServerItem1.
Bien, he intentado hacer la conexión con la parte servidora, y no funciona
o almenos no me devuelve nada,
Este codigo esta metido en un botton.
| Código: |
if( DdeClientConv1->SetLink( "Project1", "Form1" ) == false )
ShowMessage( "DDE Link Error !" );
DdeClientConv1->OpenLink();
// DdeClientItem1->DdeItem = "DdeClientItem1";
if( DdeClientConv1->PokeData( "DdeClientItem1", Edit1->Text.c_str() ) == false )
ShowMessage( "DDE Poke Data Error" );
|
|
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Lun 09 Feb, 2009 1:53 pm Asunto: |
|
|
Hola _Leo,
Existe una aplicación de una tercera persona que tengo que conectar via DDE, para ello este me dio los siguientes datos:
Parametros de llamada:
1. Nombre de la aplicación: VIADDE
2. Topic o instancia de la aplicación a la que se llama: DDEViaServer
con estos dos datos intento conectar e enviar algo. tal que así.
| Código: |
if( DdeClientConv1->SetLink( "VIADDE", "DDEViaServer" ) == false )
ShowMessage( "DDE Link Error !" );
DdeClientConv1->OpenLink();
if( DdeClientConv1->PokeData( NULL, Edit1->Text.c_str() ) == false )
ShowMessage( "DDE Poke Data Error" );
|
Uso el componente DdeClientItem1, al cual en propiedad "DdeConv", le asigno el valor de "DdeClientConv1"
| Cita: | | DdeClientItem1->DdeConv="DdeClientConv1"; |
Tambien le asigno el OnChange = "DdeClientItem1Change"
Pero no recibo ninguna dato, al enviar yo algo debera llegarme la respuesta,pero no entara nada por el evento de DdeClientItem1Change.
Alguna Idea ? |
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Mar 10 Feb, 2009 10:49 am Asunto: |
|
|
Despues de mirar y buscar en la web, no logro encontrar un ejemplo
claro de uso del DDE ( dynamic data exchange ) en c++ utilizando
los componentes DdeClientConv y DdeClientItem.
Hice un ejemplillo en Visual Basic 6, para ver si funciona, y logré que
funcionase.
El Ejemplo consiste en utilizar un Componente TextBox al cual
se le asigna una serie de propiedades.
| Código: |
' Cargando Formulario
Private Sub Form_Load()
Text1.LinkTopic = "VIADDE|DDEVIAServer"
Text1.LinkMode = vbLinkManual ' 'Modo Manual
End Sub
'Enviar datos
Private Sub Command1_Click()
Text1.LinkExecute ("Dato a Enviar")
End Sub
|
De tal forma que el programa enlazado devuelve atraves de Text1.Text
la respuesta de los datos enviados.
Si alguien me puede pasar algun ejemplillo en c++builder,
le estaria agradecido!! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 10 Feb, 2009 1:49 pm Asunto: |
|
|
Las instrucciones que he puesto en el enlace de arriba funcionan desde el C++Builder 1 al 2009.. revísalo con atención.
Y aquí va un pequeño ejemplo para que compruebes que funciona. Usando solo el componente "TDdeClientConv". Nos comunicamos con el "Internet Explorer" para abrir un enlace:
| Código: | if (DdeClientConv1->SetLink("Iexplore", "WWW_OpenURL"))
DdeClientConv1->RequestData("http://www.arrakis.es/~rporcar"); |
|
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Mie 11 Feb, 2009 3:55 pm Asunto: |
|
|
_Leo
Tal como indicas en los ejemplos.
| Cita: |
if (DdeClientConv1->SetLink("Iexplore", "WWW_OpenURL"))
DdeClientConv1->RequestData("http://www.arrakis.es/~rporcar");
|
Existen varias cosas que no entiendo.
1.
Conectar con el iExplore y le envia indicada,
pero entonces
DdeClientConv1->PokeData("http://www.arrakis.es/~rporcar", "prueba");
Realiza el mismo efecto, solo que no entiendo para que sirve el parametro
"prueba", ya que si lo quitas da error, y en teoria es ahi donde se deberia poner la ruta.
Que diferencia existe entre el uso de PokeData y RequestData ?
2.
De que forma recojo la información enviada por el servidor.
pq he probado varias cosas pero ninguna ha funcionado, tales como en el evento
| Código: |
TForm1::TForm1()
{
...
DdeClientItem1->DdeConv = DdeClientConv1; // se pone la siguiente linea
}
void __fastcall TForm1::DdeClientItem1Change(TObject *Sender)
{
Text2->Text= DdeClientItem1->Text;
}
|
pero no llega a saltar nunca, y cuando salta el valor de DdeClientItem1->Text es NULL |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 11 Feb, 2009 11:29 pm Asunto: |
|
|
La diferencia principal es que RequestData espera respuesta (otra cosa es que la uses o no) y PokeData no (en la ayuda esta mejor explicado y mas detalladamente):
char* respuesta = DdeClientConv1->RequestData("Item...");
// Utilizamos la cadena
// ...
StrDispose(respuesta); // Liberamos la memoria |
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Jue 12 Feb, 2009 8:33 pm Asunto: |
|
|
_Leo,
Como bien dices esta bien esperar y usar "ResquetData", solamente que
ha veces se necesita controlar el tiempo máximo de espera, por ello
estoy intentando activar con el evento de "DdeClientItemChange()"
pero no logro que salte este evento.
Alguna Idea de como hacerlo, he probado esto de
| Cita: |
TForm1::TForm1()
{
...
DdeClientItem1->DdeConv = DdeClientConv1; // se pone la siguiente linea
}
void __fastcall TForm1::DdeClientItem1Change(TObject *Sender)
{
Text2->Text= DdeClientItem1->Text;
}
|
Pero no pasa por este evento, y cuando lo hace el valor de
DdeClientItem1->Text es NULL.
Puedes indicarme como va ligado el componente DdeClientConv a DdeClientItem1 para recoger el Mensaje desde el evento.
Gracias por todo!! |
|
| Volver arriba |
|
 |
_Andrew Cdt

Registrado: 18 Ago 2008Mensajes: 19
|
Publicado: Mie 18 Feb, 2009 4:07 pm Asunto: |
|
|
Bueno, ....
Despues de multiples pruebas funciona las aplicaciones DDE, pero.
ClienteDDE en C++ ----------> ServidorDDE en C++ [ ok ]
ClienteDDE en VB ------------> ServidorDDE en C++ [ ok ]
ClienteDDE en VB ------------> ServidorDDE en VB [ ok ]
ClienteDDE en C++ ----------> ServidorDDE en VB [ Error ]
Lo que me sigue dando errores es un ClienteDDE en C++,
enlazarlo con un ServidorDDE en Visual Basic.
El Enlace lo hace de forma correcta, no da errores pero al hacer
el
| Código: |
// Solicitar el envío del elemento
char * Cadena = DDECliente->RequestData(cadElemento);
CElemento->Text = Cadena; // mostrarlo
StrDispose(Cadena); // y liberar la cadena
|
Siempre me devuelve NULO.
El codigo usado para enviar es
| Código: |
// Enviar el contenido actual del campo
DDECliente->PokeData(cadElemento, CElemento->Text.c_str());
|
Este mismo codigo pero enlazando con un ServidorDDE en C++
funciona correctamente.
Alguien me puede explicar el porque no funciona como Servidor en
Visual Basic ?
Precisamente, La aplicación servidor a la que tengo que enlazar esta realizada en Visual Basic y es de terceras personas.
¿ Alguna Sugerencia ? |
|
| Volver arriba |
|
 |
|