C++ MFC深入详解之---- 实现进程间通信(WM_COPYDATA)

首先你要知道:

消息WM_COPYDATA的作用为:

当应用程序将数据传递到另一个应用程序时,将发送此消息。

句法:

WM_COPYDATA wParam = (WPARAM)(HWND) hwnd; 
    lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;

参数:

  • hwnd
    处理传递数据的窗口。
  • pcds
    指向包含要传递的数据的COPYDATASTRUCT结构的指针。

返回值:

如果接收方应用程序处理了此消息,则应返回TRUE;否则,返回TRUE。否则,应返回FALSE。

注意:

应用程序必须使用SendMessage函数发送此消息,而不是PostMessage函数。

传递的数据不得包含指向接收数据的应用程序不可访问的对象的指针或其他引用。

发送此消息时,发送过程的另一个线程不得更改引用的数据。

接收应用程序应将数据视为只读。在个人通讯装置参数仅该消息的处理过程中是有效的。接收应用程序不应释放pcds引用的内存。如果接收应用程序必须在SendMessage返回后访问数据,则必须将数据复制到本地缓冲区中

其中COPYDATASTRUCT的结构

typedef struct tagCOPYDATASTRUCT {
  ULONG_PTR dwData;
  DWORD     cbData;
  PVOID     lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;

 

dwData

类型:ULONG_PTR

要传递给接收应用程序的数据。

cbData

类型:DWORD

lpData成员指向的数据的大小(以字节为单位)。

lpData

类型:PVOID

要传递给接收应用程序的数据。该成员可以为NULL

 

一个例子:

首先我是在第一个应用程序中拖拽了一个Edit和一个Button控件,实现在文本编辑框内输入字符串,点击按钮发送到另一个应用程序的对话框内(第一个应用程序叫mfctest1,第二个叫mfctest2)

在mfctest1中实现:

其中Edit的ID为IDC_SENDSTR

按钮的响应函数内代码:

LRESULT copyData;  //copyDataResult has value returned by other app 
CWnd *pOtherWnd = CWnd::FindWindow(NULL, "mfctest2");

CString strData;
GetDlgItemText(IDC_SENDSTR,strData);
if (pOtherWnd)
{
    COPYDATASTRUCT cpd;   //上面提到的结构体
    cpd.dwData = 0;
    cpd.cbData = strData.GetLength()+sizeof(wchar_t);        //sizeof(wchar_t)指 \0 的长度。     
    cpd.lpData = (void*)strData.GetBuffer(cpd.cbData);             
    copyData= pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);
    strData.ReleaseBuffer();
}
else 
{
    AfxMessageBox("未找到");
}

 

在mfctest2中实现:

拖拽一个Edit编辑框,ID为:IDC_RecvStr;

先给窗口添加WM_COPYDATA消息函数,然后在函数中添加成如下:

在VC++6.0中是右击CMfctest2Dlg(我这里的窗口名叫“mfctest2”),再点击ADD Windows Message Handler...,找到WM_COPYDATA消息,添加。

在VS中是右击CMfctest2Dlg点击属性,上面有一个消息的图标,点击,找到WM_COPYDATA,add

函数实现:

BOOL CCarRecogDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    CString strRec = (LPCSTR) (pCopyDataStruct->lpData);
    SetDlgItemText(IDC_RecvStr,strRec);


    return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}

全部编译完成,并运行(注意两个程序都要运行,不然找不到接受方的对话框)

在mfctest1的编辑框中输入“123456789”,点击发送

“123456789”出现在mfctest2的编辑框中

成功!

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿尔兹

如果觉得有用就推荐给你的朋友吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值