Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-03-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Duda sobre WM_COPYDATA y C

Hola amigos, ya me ayudaron una vez para conseguir comunicar dos procesos con builder pero ahora me surge la duda de si eso es posible en C con procesos de consola o si no es posible en C pues c++ de consola.
La misma duda pero con sockets ya que estuve mirando pero nada de lo que veo me compila y da millones de errores y además no entiendo las cosas que hacen.
Algún tutorial donde lo explique bien y a ser posible en español me seria muy instructivo. Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 04-03-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El mensaje WM_COPYDATA sólo es posible recibirlo en app de ventanas, por lo que no funciona en una consola.

Sin embargo puedes hacer una app de ventanas sin usar la VCL de Builder, con su bucle de mensajes capaz de recibir el mensaje WM_COPYDATA y procesarlo. Esta APP puede tener una ventana invisible diseñada sólo para recibir los mensajes WM_COPYDATA. Esto es posible tanto en C como en C++.

Otra forma de comunicar dos procesos en con los archivos de memoria compartida, en este caso no hace falta un bucle de mensajes pero si un mecanismo que permita consultar dicha memoria en un bucle.

También puedes usar las Atom Tables.

Por último tienes la posibilidad de crear un sistema cliente/servidor con sockets a bajo nivel con lo que prescindes de la VCL. En este caso tampoco necesitas un bucle de mensajes Windows pero si un bucle para tratar los sockets. Este último sistema te servirá para comunicar aplicaciones entre el mismo o diferentes PCs


Saludos.

Última edición por escafandra fecha: 04-03-2017 a las 23:40:03.
Responder Con Cita
  #3  
Antiguo 04-03-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Para contestar a tu duda sobre WM_COPYDATA en "C" te muestro este ejemplo de una aplicación sin ventana visible que se manda a sí misma un mensaje WM_COPYDATA y lo responde. Está escrita en C

Código PHP:
#include <windows.h>
#pragma hdrstop

//---------------------------------------------------------------------------
LRESULT  __stdcall WindowProc(HWND hWndUINT uMsgWPARAM wParamLPARAM lParam)
{
  if(
uMsg == WM_COPYDATA){
    
PCOPYDATASTRUCT Data =  (PCOPYDATASTRUCT)lParam;
    
MessageBox(hWnd, (PCHAR)Data->lpData"Mensaje recibido"0);
  }

  return 
DefWindowProc(hWnduMsgwParamlParam);
}

char Name[] = "Hide";
#pragma argsused
WINAPI WinMain(HINSTANCE hInstanceHINSTANCE hPrevInstanceLPSTR lpCmdLineint nCmdShow)
{
  
HWND Handle;
  
MSG message;
  
WNDCLASS WinClass = {0,(WNDPROC)WindowProc,0,0,0,0,0,0,""Name};
  
COPYDATASTRUCT Data = {0};
  
char *MSG "Hola";
  
Data.lpData MSG;
  
Data.cbData strlen(MSG) + 1;

  
RegisterClass(&WinClass);
  
Handle CreateWindow(Name""0,0,0,0,0HWND_DESKTOP, (HMENU)00NULL);
  
SendMessage(HandleWM_COPYDATA0, (LPARAM)&Data);
  while(
GetMessage(&messageNULL00)){
    
TranslateMessage(&message);
    
DispatchMessage(&message);
  }

  return 
0;


Saludos.
Responder Con Cita
  #4  
Antiguo 05-03-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Muy interesante ¿y que hay que cambiar para que la ventana no sea invisible?
Otra cosa, si quisiera enviar el mensaje a otra ventana ¿solo necesito el handle de esa ventana?
Me interesa mucho lo que dices de sockets a bajo nivel ¿no tienes ningún texto donde se explique con ejemplos y cosas así?
Y sobre lo de la memoria compartida tengo mucha curiosidad de ver como se hace eso porque no tengo ni idea.
Responder Con Cita
  #5  
Antiguo 05-03-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
Muy interesante ¿y que hay que cambiar para que la ventana no sea invisible?
Estudia la API CreateWindow y los estilos: window styles.

Cita:
Empezado por aguml Ver Mensaje
Otra cosa, si quisiera enviar el mensaje a otra ventana ¿solo necesito el handle de esa ventana?
Si, y que la ventana receptora trate el mensaje WM_COPYDATA

Cita:
Empezado por aguml Ver Mensaje
Me interesa mucho lo que dices de sockets a bajo nivel ¿no tienes ningún texto donde se explique con ejemplos y cosas así?
Winsock Functions y recuerda este hilo donde te puse este ejemplo.

Cita:
Empezado por aguml Ver Mensaje
Y sobre lo de la memoria compartida tengo mucha curiosidad de ver como se hace eso porque no tengo ni idea.
En el hilo que mencioné antes ya te di un enlace sobre los archivos de memoria compartida, aunque en la actualidad está roto. Aquí lo tienes en C++.


Saludos.

Última edición por escafandra fecha: 05-03-2017 a las 12:00:22.
Responder Con Cita
  #6  
Antiguo 05-03-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Muchas gracias por toda la información. Sobre sockets en Windows encontré esto: http://www.programacionenc.net/index.php?option=com_content&view=article&id=73:sockets-en-windows&catid=37rogramacion-cc&Itemid=55
Tengo algunas dudas sobre el ejemplo que pones de sockets:
- Por lo que he leído accept espera a que se conecte un cliente pero, si son por ejemplo 2 clientes ¿como seria?
- Si cliente y servidor están en la misma máquina ¿se usaría AF_UNIX? Eso es lo que entendí.
- ¿Cómo sería para que fuesen a sincrónicos?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Reproductor de Musica Uso de WM_COPYDATA Arieloi2 API de Windows 1 28-05-2010 03:19:19
duda sobre dll romanuel C++ Builder 5 26-02-2008 20:58:52
Una duda sobre ADO PTW Conexión con bases de datos 1 13-04-2004 23:33:14
Duda sobre BDE vs IBX ESA Firebird e Interbase 3 04-03-2004 17:20:07
Duda sobre ADO Omar Alejandro Conexión con bases de datos 7 31-05-2003 19:52:58


La franja horaria es GMT +2. Ahora son las 03:33:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi