![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Pasar cadenas, string, entre aplicaciones.
Hola a todos.
Necesito que dos aplicaciones hechas en Delphi se pasen entre sí una cadena de caracteres (string). He hecho algo parecido a esto con integers usando SendMessage y PostMessage. Entiendo que no se pueden pasar strings directamente, hay que usar PChar y he conseguido hacerlo así: Aplicación que envia el string: ForeginHandle es el handle de la aplicación que recibirá la cadena, eso lo obtengo con otro mensaje que no es parte del problema actual. GlobalAddAtom es una función de la API de Windows que crea un atom que es un puntero a la cadena que estoy intentando pasar, wParam es ese puntero. Tal como dice la documentación lo que esta función recibe es un string terminado en nulo, o sea un PChar, por eso casteo el string 'Cadena'. CM_MYSTR es un mensaje de Windows personalizado. Y Tam contiene el tamaño actual de la cadena que estoy enviando. Aplicación que recibe el string: El procedimiento responde con la llegada del mensaje personalizado CM_MYSTR. GlobalGetAtomName es una función de la API de Windows que toma la cadena apuntada por el puntero que se le pasa como primer parámetro, la pone en el segundo según el tamaño indicado en el tercer parámetro. El puntero es igual al que generé desde la aplicación que envía la cadena. GlobalDeleteAtom destruye el puntero y los recursos asociados. S es de tipo PChar pues GlobalGetAtomName requiere de un buffer para almacenar la cadena. Al tamaño de ese buffer le sumo uno más que el tamaño enviado desde la otra aplicación (variable Tam) porque así me funciona bien aunque no sé por qué ya que si la cadena original medía 20 caracteres (Length(Cadena) = 20) ¿por qué tendía que establecer un buffer de 21 caracteres?. Hay otro problema con el código receptor. Si lo compilo tal cual está Delphi se queja con un warning diciéndome que 'S' podría estar indefinido. Momentaneamente lo he solucionado encerrando este procedimiento entre {$WARNINGS OFF} y {$WARNINGS ON} ya que si intento asignar cualquier cosa a 'S' antes de usarla en GlobalGetAtomName recibo un access violation que supongo se debe a que 'S' ya está apuntando a otra cosa. Si bien el código tal como lo veo yo es simple y funciona bien, me da la impresión de que no es la mejor manera de hacer esto. ¿Alguien ve algo malo o se le ocurre una forma mejor de hacer esto?. Gracias por atenderme. Un saludo. |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
pasar un tipo de datos (array of record) entre aplicaciones | mauqu | Varios | 4 | 26-10-2007 20:04:31 |
Compatibilidad entre aplicaciones ASP.NET entre Delphi 8 .Net y Visual Studio.Net | kenyamg | .NET | 0 | 21-02-2007 07:30:33 |
Arreglo De Cadenas : String | victor2023 | OOP | 6 | 19-05-2006 22:41:44 |
Pasar parametros entre aplicaciones | Iceman | OOP | 2 | 14-06-2005 16:29:25 |
Pasar mensajes entre aplicaciones | snuffer | Varios | 4 | 21-11-2003 01:44:21 |
![]() |
|