Use WM_COPYDATA para enviar datos entre procesos

Deseo enviar texto entre procesos. He encontrado muchos ejemplos de esto, pero ninguno con el que pueda trabajar. Esto es lo que tengo hasta ahora:

para la parte que envía:

COPYDATASTRUCT CDS; CDS.dwData = 1; CDS.cbData = 8; CDS.lpData = NULL; SendMessage(hwnd, WM_COPYDATA , (WPARAM)hwnd, (LPARAM) (LPVOID) &CDS); 

la parte receptora:

 case WM_COPYDATA: COPYDATASTRUCT* cds = (COPYDATASTRUCT*) lParam; 

No sé cómo construir el COPYDATASTRUCT, acabo de poner algo que parece funcionar. Al depurar, se ejecuta el caso WM_COPYDATA, pero nuevamente no sé qué hacer con el COPYDATASTRUCT.

Me gustaría enviar mensajes de texto entre los dos procesos.

Como probablemente pueda decir que estoy empezando, estoy usando el comstackdor GNU GCC en Code :: Blocks, estoy tratando de evitar el MFC y las dependencias.

Para ver un ejemplo de cómo usar el mensaje, consulte http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx . También puede consultar http://www.flounder.com/wm_copydata.htm .

El miembro dwData lo define usted. Piénselo como una enumeración de tipo de datos que puede definir. Es lo que quieras usar para identificar que los datos son una cadena de tal y tal.

El miembro cbData es el tamaño en bytes de los datos apuntados por lpData . En su caso, será el tamaño de la cadena en bytes.

El miembro lpData apunta a los datos que desea copiar.

Entonces, para transferir una sola cuerda ….

 LPCTSTR lpszString = ...; COPYDATASTRUCT cds; cds.dwData = 1; // can be anything cds.cbData = sizeof(TCHAR) * (_tcslen(lpszString) + 1); cds.lpData = lpszString; SendMessage(hwnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds); 

Entonces, para recibirlo ….

 COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam; if (pcds->dwData == 1) { LPCTSTR lpszString = (LPCTSTR)(pcds->lpData); // do something with lpszString... } 
 Use the following code. //Message Sender Class( for the demonstration purpose put the following code in //button click event) CString strWindowTitle= _T("InterProcessCommunicationExample"); CString dataToSend =_T("Originate from Windows"); LRESULT copyDataResult; CWnd *pOtherWnd=CWnd::FindWindowW(NULL, strWindowTitle); if(pOtherWnd) { COPYDATASTRUCT cpd; cpd.dwData=0; cpd.cbData=dataToSend.GetLength(); //cpd.cbData=_tcslen(dataToSend)+1; cpd.lpData=(void*)dataToSend.GetBuffer(cpd.cbData); AfxMessageBox((LPCTSTR)cpd.lpData); //cpd.lpData=(void*)((LPCTSTR)cpd.cbData); copyDataResult=pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM) &cpd); dataToSend.ReleaseBuffer(); } else { AfxMessageBox(L"Hwllo World"); } //Message Receiver Process BOOL CMessageReceiverClass::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { CString copiedData=(LPCTSTR)(pCopyDataStruct->lpData); AfxMessageBox((LPCTSTR)(pCopyDataStruct->lpData)); // return CDialog::OnCopyData(pWnd, pCopyDataStruct); return TRUE; } 

Esa no es realmente una respuesta, pero una pista útil para depurar SendMessage (WM_COPYDATA …

Bueno, Microsoft Spy ++ realmente podría ser útil. Puede encontrarlo aquí:

 c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\spyxx_amd64.exe c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\spyxx.exe 
  1. Prueba que está trabajando en el proceso objective (ventana) [ctrl + f, Windows].
  2. Segundo filtro de mensaje configurado en WM_COPYDATA . … y
  3. ‘Ver \ Siempre arriba’ también es muy útil.

Feliz C ++’ing – especialmente en C # que la API puede ser realmente ‘divertida’. 😉