2010-03-15 100 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可以是真正'有趣'的。 ;)

相关问题