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.
¿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
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