2010-03-15 26 views
13

Desidero inviare il testo tra i processi. Ho trovato molti esempi di questo, ma nessuno dei quali riesco a lavorare. Ecco quello che ho finora:Utilizzare WM_COPYDATA per inviare dati tra processi

per la parte di invio:

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

parte ricevente:

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

Non so come costruire il COPYDATASTRUCT, ho appena messo qualcosa in sembra funzionare. Quando viene eseguito il debug del caso WM_COPYDATA, ma ancora non so cosa fare con COPYDATASTRUCT.

Vorrei inviare il testo tra i due processi.

Come si può probabilmente dire io sono solo agli inizi, sto usando GNU GCC Compiler in Code :: Blocks, sto cercando di evitare di MFC e le dipendenze.

risposta

16

Per un esempio di come utilizzare il messaggio, vedere http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx. Potresti anche voler dare un'occhiata a http://www.flounder.com/wm_copydata.htm.

Il membro dwData è definito dall'utente. Pensalo come un enum di tipo di dati che puoi definire. È qualsiasi cosa tu voglia usare per identificare che i dati sono una tale e tale stringa.

Il membro cbData è la dimensione in byte dei dati indicati da lpData. Nel tuo caso, sarà la dimensione della stringa in byte.

I lpData punti membri per i dati che si desidera copiare.

Così, per trasferire una singola stringa ....

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); 

Poi, a riceverlo ....

COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam; 
if (pcds->dwData == 1) 
{ 
    LPCTSTR lpszString = (LPCTSTR)(pcds->lpData); 
    // do something with lpszString... 
} 
+0

so che secondo link (a flounder.com) utilizza MFC, che non si sta usando, ma ho incluso solo per illustrare che si dovrebbe prendere in considerazione il passaggio di più di una semplice stringa. – Tadmas

+1

Grazie, ho funzionato.Anche se ho dovuto cambiare la prima linea a LPTSTR lpszString perché ho ottenuto questo errore: la conversione non valida dal 'const void * 'a' void *' –

+0

Questo collegamento è molto utile: 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

che non è proprio una risposta, ma suggerimento utile quando debugging SendMessage (WM_COPYDATA ...

Bene Microsoft Spy ++ potrebbe davvero tornare utile. Si possono trovare qui:

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. prova che si sta lavorando sul processo di destinazione (finestra) [Ctrl + F, Windows].
  2. Filtro messaggi set secondo su WM_COPYDATA. ... e
  3. 'Visualizza \ Sempre in primo piano' è anche molto utile.

Happy C++ 'ing - specialmente in C# che API può essere vero' divertente '. ;)

Problemi correlati