首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用WM_COPYDATA在进程之间发送数据

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

Stack Overflow用户
提问于 2010-03-16 07:10:36
回答 3查看 33.5K关注 0票数 19

我希望在进程之间发送文本。我已经找到了很多这样的例子,但没有一个我可以工作。这是我到目前为止所知道的:

对于发送方:

代码语言:javascript
运行
复制
COPYDATASTRUCT CDS;
CDS.dwData = 1;
CDS.cbData = 8;
CDS.lpData = NULL;
SendMessage(hwnd, WM_COPYDATA , (WPARAM)hwnd, (LPARAM) (LPVOID) &CDS);

接收部分:

代码语言:javascript
运行
复制
case WM_COPYDATA:
COPYDATASTRUCT* cds = (COPYDATASTRUCT*) lParam;

我不知道如何构建COPYDATASTRUCT,我只是在里面放了一些似乎可以工作的东西。在调试时,会执行WM_COPYDATA用例,但我仍然不知道如何处理COPYDATASTRUCT

我想在两个进程之间发送文本。

正如你可能知道的那样,我刚刚开始,我在Code::Blocks中使用GNU GCC编译器,我试图避免MFC和依赖。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-16 07:29:03

有关如何使用消息的示例,请参见http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx。您可能还想看看http://www.flounder.com/wm_copydata.htm

dwData成员由您定义。可以将其视为您要定义的数据类型枚举。它是您想要用来标识数据是某某字符串的任何东西。

cbData成员是lpData指向的数据的字节大小。在本例中,它将是以字节为单位的字符串大小。

lpData成员指向要复制的数据。

因此,要传输单个字符串...

代码语言:javascript
运行
复制
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);

然后,为了接受它...

代码语言:javascript
运行
复制
COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam;
if (pcds->dwData == 1)
{
    LPCTSTR lpszString = (LPCTSTR)(pcds->lpData);
    // do something with lpszString...
}
票数 22
EN

Stack Overflow用户

发布于 2015-08-02 19:05:54

代码语言:javascript
运行
复制
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;
}
票数 3
EN

Stack Overflow用户

发布于 2015-10-15 20:27:23

这不是一个真正的答案,但在调试SendMessage(WM_COPYDATA...

嗯, Spy++可能真的派上用场了。你可以在这里找到它:

代码语言:javascript
运行
复制
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上工作。WM_COPYDATA上的
  2. Second set message filter。..。
  3. 的“查看\总是在最上面”也很方便。

快乐的C++--尤其是在C#中,API可以是真正的“有趣”。;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2451103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档