使用WM_COPYDATA在进程之间发送数据

时间:2010-03-15 23:10:36

标签: c++ windows ipc 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和依赖。

3 个答案:

答案 0 :(得分:20)

有关如何使用该消息的示例,请参阅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...
}

答案 1 :(得分: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;
}

答案 2 :(得分:1)

调试 SendMessage(WM_COPYDATA ......

时,这不是一个真正的答案,而是有用的提示

Microsoft 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,Windows]。
  2. WM_COPYDATA 上设置第二个消息过滤器。 ......和
  3. 'View \ Always on top'也非常方便。
  4. 快乐的C ++' - 特别是在C#中,API可以真正“有趣”。 ;)