2010-03-15 17 views
13

Deseo enviar texto entre procesos. He encontrado muchos ejemplos de esto, pero ninguno con el que pueda trabajar. Aquí es lo que tengo hasta ahora:Utilice WM_COPYDATA para enviar datos entre procesos

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 en eso 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 sepa, recién estoy comenzando, estoy usando el compilador GNU GCC en Code :: Blocks, estoy tratando de evitar el MFC y las dependencias.

Respuesta

16

Para ver un ejemplo de cómo usar el mensaje, consulte http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx. También es posible que desee mirar 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.

Por lo tanto, para transferir una sola cadena ....

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... 
} 
+0

Sé que el segundo enlace (a flounder.com) usa MFC, que no está usando, pero lo incluí simplemente para ilustrar que debería considerar pasar más que una simple cadena. – Tadmas

+1

Gracias, lo tengo funcionando.A pesar de que tenía que cambiar la primera línea de LPTSTR lpszString porque tengo este error: la conversión no válida del 'const void * 'a' void *' –

+0

Este enlace es muy útil: http: //code.msdn. microsoft.com/windowsdesktop/CppSendWMCOPYDATA-f75bc681/ – pcunite

2
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; 
} 
0

Eso no es realmente una respuesta, pero indirecta útil cuando depuración SendMessage (WM_COPYDATA ...

bien Microsoft Spy ++ realmente podría ser útil. Usted puede encontrar 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 de que está trabajando en el proceso de destino (ventana) [Ctrl + F, Windows].
  2. Segundo conjunto de filtro de mensajes en WM_COPYDATA. ... y
  3. 'Ver \ Siempre en la parte superior' también es muy útil.

Happy C++ 'ing - especialmente en C# que la API puede ser realmente "divertida". ;)

Cuestiones relacionadas