2010-03-15 44 views
13

我希望在進程之間發送文本。我發現了很多這方面的例子,但沒有一個可以工作。以下是我迄今爲止:使用WM_COPYDATA在進程之間發送數據

的發送部分:

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

接收部分:

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

我不知道如何構建COPYDATASTRUCT,我剛裝上去這似乎工作。當調試WM_COPYDATA的情況下執行,但我不知道如何處理COPYDATASTRUCT。

我想在兩個進程之間發送文本。你可能會告訴我剛剛開始,我在Code :: Blocks中使用GNU GCC編譯器,我試圖避免MFC和依賴關係。

回答

16

有關如何使用消息的示例,請參閱http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx。你也可以看看http://www.flounder.com/wm_copydata.htm

dwData成員由您定義。把它想象成你可以定義的數據類型枚舉。無論你想用什麼來識別數據是一個這樣的字符串。

cbData成員是由lpData指向的數據的大小(以字節爲單位)。在你的情況下,它將以字節爲單位的字符串的大小。

lpData成員指向您要複製的數據。

因此,轉讓一個字符串....

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

然後,接受它....

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

我知道第二個鏈接(到flounder.com)使用MFC,你沒有使用,但我只是爲了說明你應該考慮傳遞的不僅僅是一個簡單的字符串。 – Tadmas 2010-03-15 23:49:49

+1

謝謝,我得到了它的工作。雖然我不得不把第一行改爲 LPTSTR lpszString ,因爲我得到這個錯誤:從'常量無效*無效的轉換「到'無效*」 – 2010-03-16 09:29:38

+0

這個環節是非常有幫助的: HTTP://code.msdn。 microsoft.com/windowsdesktop/CppSendWMCOPYDATA-f75bc681/ – pcunite 2012-02-09 06:13:39

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

這是不是一個真正的答案,但有用的提示時,調試SendMessage(WM_COPYDATA ...

微軟Spy ++可能真的派上用場。 您可以在這裏找到:

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. 測試,它的工作目標進程(窗口)按Ctrl + F,視窗]。
  2. 第二組消息過濾器WM_COPYDATA。 ...和
  3. 'View \ Always on top'也非常方便。

快樂的C++'ing - 特別是在C#中,API可以是真正'有趣'的。 ;)