2010-03-15 22 views
13

Chcę wysłać tekst między procesami. Znalazłem wiele przykładów tego, ale niestety, że mogę pracować. Oto co mam do tej pory:Użyj WM_COPYDATA do wysyłania danych między procesami

dla wysyłającego części:

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

część odbiorcza:

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

nie wiem jak skonstruować COPYDATASTRUCT, ja po prostu umieścić coś w to wydaje się działać. Podczas debugowania wykonywana jest sprawa WM_COPYDATA, ale znowu nie wiem, co zrobić z COPYDATASTRUCT.

Chciałbym wysłać tekst między dwoma procesami.

Jak zapewne wiesz, że właśnie zaczynam, używam kompilatora GNU GCC w Code :: Blocks, staram się unikać MFC i zależności.

Odpowiedz

16

Aby zapoznać się z przykładem użycia wiadomości, zobacz: http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx. Możesz również spojrzeć na http://www.flounder.com/wm_copydata.htm.

Członek dwData jest zdefiniowany przez Ciebie. Pomyśl o tym jak o enum typu danych, który definiujesz. Jest to, co chcesz, aby zidentyfikować, że dane są takim i takim ciągiem.

Członek cbData jest wielkością w bajtach danych wskazanych przez lpData. W twoim przypadku będzie to rozmiar łańcucha w bajtach.

Członek lpData wskazuje dane, które chcesz skopiować.

Tak, aby przenieść pojedynczy łańcuch ....

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

Następnie, aby otrzymać go ....

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

Wiem, że drugi link (do flounder.com) używa MFC, którego nie używasz, ale zamieściłem go jedynie w celu zilustrowania, że ​​powinieneś rozważyć przekazanie czegoś więcej niż zwykłego ciągu znaków. – Tadmas

+1

Dzięki, mam to działa.Choć musiałem zmienić pierwszą linię do LPTSTR lpszString bo mam ten błąd: nieprawidłowy konwersji z 'const void *„do 'void *” –

+0

Ten link jest bardzo pomocne: 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

To naprawdę nie jest odpowiedzią, ale kiedy przydatna wskazówka debugowanie SendMessage (WM_COPYDATA ...

Cóż Microsoft Spy ++ może się bardzo przydać. Można go znaleźć tutaj:

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. testowy, że to działa na proces docelowej (okno) [Ctrl + F, Windows].
  2. Drugi ustawiony filtr wiadomości na WM_COPYDATA. ... i
  3. "Widok \ Zawsze na wierzchu" jest również bardzo przydatny.

Happy C++ "ing - zwłaszcza w języku C#, że API może być prawdziwą" zabawą ". ;)

Powiązane problemy