2012-05-16 22 views
6

Aunque ya hay unos pocos recursos en línea que abordan este tema aproximado, todavía no he encontrado una respuesta que me funcione.
Enviando/recibiendo una cadena a través de PostMessage

deseo tener una comunicación total entre mi VB.net proceso y mi proceso de C++. Me gustaría ser capaz de enviar una cadena de y del proceso de C++, pero por el momento, lo que necesito para lograr:

Envío de una cadena en el proceso de C++, y su manejo.

Esto crea algunos puntos que no estoy seguro, pero voy a tratar de mantener esto tan simple como sea posible ...

Usando la siguiente declaración de la función en VB;

Declare Function PostMessage Lib "user32" Alias "PostMessageA" (_ 
    ByVal hWnd As IntPtr, _ 
    ByVal Msg As UInteger, _ 
    ByVal wParam As IntPtr, _ 
    ByVal lParam As String _ 
) As Boolean 

Y enviando el mensaje como tal;

PostMessage(hWnd, SM_PING, Nothing, "schlampe") 

Con la siguiente declaración de método para capturar el mensaje en C++;

LRESULT CALLBACK newWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 

Y para una prueba de si puedo acceder a la cadena usando;

char buffer[50]; 
sprintf(buffer, "Received: %s", (char *)lParam); 
MsgBox(buffer); 


La he leído sobre muchos de los detalles que yo creo que es innecesario, pero Pide y se os dará.

Mi problema es que el mensaje es recibido y "manejados" ... pero el cuadro de mensaje creado por el proceso de C++ no contiene mi mensaje de prueba (se lee: "Recibido:").

Entonces, ¿cómo puedo enviar una cadena a través de PostMessage/SendMessage de VB a C++?




Solución:

Véase la respuesta aceptada para la solución ... pero por otra parte, aquí es cómo recibo la cadena (C++):

LRESULT CALLBACK newWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch(uMsg) { 
     case WM_COPYDATA: 
      MsgBox("Received a WM_COPYDATA message"); 
      COPYDATASTRUCT * pcds = (COPYDATASTRUCT *)lParam; 
      LPCTSTR lpszString = (LPCTSTR)(pcds->lpData); 
      MsgBox(lpszString); 
      return 1L; 
    } 
    return CallWindowProc(instance->OriginalProcessor(), hwnd, uMsg, wParam, lParam); 
} 


Y, por último, utilicé el ejemplo de IPC here a envíe el mensaje. Este ejemplo envía el mensaje usando C#, pero el concepto era todo lo que necesitaba (sin mencionar que es un paseo por el parque para convertir dicho código a VB). Tenga en cuenta que en mi implementación de VB, no necesité terminar la cadena con un carácter nulo.

+0

¿Es específico el uso de mensajes de ventana? ¿O es pasar los datos entre procesos el objetivo final? Para este último, hay [mejores formas] (http://en.wikipedia.org/wiki/Inter-process_communication) para lograr eso. – ulidtko

+2

Probablemente deberías hacer una validación básica del 'COPYDATASTRUCT' antes de usarlo. Algunas aplicaciones maliciosas podrían enviarle mensajes 'WM_COPYDATA' falsos. – jamesdlin

Respuesta

6

Al usar mensajes de Windows, debe usar WM_COPYDATA para transferir datos de cadena entre procesos. Si usa ID de mensaje personalizado, los datos de cadena no se ordenarán entre los dos espacios de direcciones de proceso distintos.

Y esta es la razón por la que falla su código actual. El proceso de recepción se pasa en lParam un puntero a la memoria en el espacio de direcciones de los procesos de llamada. Y, por supuesto, eso no tiene sentido en el otro proceso.

Si bien hay otras maneras de recopilar datos como este entre procesos con mensajes de Windows, WM_COPYDATA es, con mucho, el más simple. Si su requisito se vuelve mucho más complejo, es posible que deba considerar un enfoque de IPC más completo que los mensajes de Windows.

+0

Menciono necesariamente las formas genéricas de hacer IPC: tuberías, memoria compartida + mutex, sockets, etc. – ulidtko

+1

@ulidtko Investigué otros métodos, y concluí que los mensajes de Windows me causarían menos problemas, pero gracias por su preocupación. – Spooky

+0

¿Es necesario usar 'OnCopyData' para recibir los datos? Es importante tener en cuenta que mi DLL C++ se inyecta en otro proceso, y no estoy seguro de si todavía puedo recibir el 'COPYDATASTRUCT' – Spooky

Cuestiones relacionadas