2010-03-15 7 views
13

Je souhaite envoyer du texte entre processus. J'ai trouvé beaucoup d'exemples de cela, mais aucun que je peux travailler. Voici ce que j'ai jusqu'à présent:Utilisez WM_COPYDATA pour envoyer des données entre processus

pour la partie envoi:

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

la partie réceptrice:

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

Je ne sais pas comment construire le COPYDATASTRUCT, je viens de mettre quelque chose dans cela semble fonctionner. Lorsque le débogage du dossier WM_COPYDATA est exécuté, mais encore une fois je ne sais pas quoi faire avec le COPYDATASTRUCT.

Je voudrais envoyer du texte entre les deux processus.

Comme vous pouvez probablement le dire, je commence à peine, j'utilise GNU GCC Compiler dans Code :: Blocks, j'essaie d'éviter les MFC et les dépendances.

Répondre

16

Pour un exemple d'utilisation du message, voir http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx. Vous pouvez également regarder http://www.flounder.com/wm_copydata.htm. Les membres dwData est défini par vous. Pensez-y comme une énumération de type de données que vous définissez. C'est ce que vous voulez utiliser pour identifier que les données sont une chaîne telle et telle. Le membre cbData est la taille en octets des données pointées par lpData. Dans votre cas, ce sera la taille de la chaîne en octets. Le membre lpData pointe vers les données que vous souhaitez copier.

Ainsi, pour transférer une seule chaîne ....

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

Ensuite, pour la recevoir ....

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

Je sais que le deuxième lien (à flounder.com) utilise MFC, que vous n'utilisez pas, mais je l'ai inclus simplement pour illustrer que vous devriez considérer passer plus qu'une simple chaîne. – Tadmas

+1

Merci, je l'ai eu le travail.Même si je devais changer la première ligne à LPTSTR lpszString parce que je suis cette erreur: conversion non valide du 'const void * « à 'void * » –

+0

Ce lien est très 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

Ce n'est pas vraiment une réponse, mais indice utile lorsque débogage SendMessage (WM_COPYDATA ...

Puits Microsoft Spy ++ pourrait vraiment être utile. Vous pouvez le trouver ici:

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. test qu'il fonctionne sur le processus cible (fenêtre) [ctrl + f, Windows].
  2. Le second filtre de message défini sur WM_COPYDATA. ... et
  3. 'Vue \ Toujours visible' est également très pratique.

Heureux C++ 'ING - en particulier en C# cette API peut être vraiment' fun '. ;)

Questions connexes