用sendmessage实现进程间通信。

1.WM_COPYDATA实现进程间通信

实现方式是发送WM_COPYDATA消息。

发送程序:

LRESULT copyDataResult;  //copyDataResult has value returned by other app
CWnd *pOtherWnd = CWnd::FindWindow(NULL, "卡口图片管理");CString strDataToSend = "0DAE12A3D8C9425DAAE25B3ECD16115A" ;
if (pOtherWnd)
{COPYDATASTRUCT cpd;cpd.dwData = 0;cpd.cbData = strDataToSend.GetLength()+sizeof(wchar_t);             //data lengthcpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData); //data buffercopyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);strDataToSend.ReleaseBuffer();
}
else
{AfxMessageBox("Unable to find other app.");
}

这里字符串长度为strDataToSend.GetLength()+sizeof(wchar_t),其中sizeof(wchar_t)指 \0 的长度。

接收程序:

接收程序先给窗口(我这里的窗口名叫“卡口图片管理”)添加WM_COPYDATA消息函数,然后在函数中添加成如下:

BOOL CCarRecogDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{// TODO: 在此添加消息处理程序代码和/或调用默认值
CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);string str(strRecievedText.GetBuffer(pCopyDataStruct->cbData));//string str = strRecievedText.GetBuffer() ;printf("%s \n", str.c_str()) ;if (str == "0DAE12A3D8C9425DAAE25B3ECD16115A"){printf("正确接收 \n") ;}return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}

运行结果:

2.win32程序和x64程序之间传递结构体

win32程序和x64程序的指针长度是不一样的。经大神指点,结构体中的成员变量只能是基本数据类型,不能是像string这样的类,大体原因是类中有函数,函数也是一个地址(说法貌似不严谨,大概是这个意思)。

下面在之前的基础上实现传递结构体。

结构体定义:

struct NOTIFY_INFO_t
{char  GUID[1024];char  task_id[1024];int  index ;
};

收发程序中的结构体定义要一致(结构体名可以不一致,但内部需要一致)。

主要的注意点是结构体成员变量的定义,具体的收发其实差不多。

发送:

void CMFCApplication1Dlg::OnBnClickedButtonSend()
{// TODO: 在此添加控件通知处理程序代码
LRESULT copyDataResult;  //copyDataResult has value returned by other app CWnd *pOtherWnd = CWnd::FindWindow(NULL, "卡口图片管理");CString strDataToSend = "0DAE12A3D8C9425DAAE25B3ECD16115A" ;if (pOtherWnd){NOTIFY_INFO_t *pNotify = new NOTIFY_INFO_t();memcpy(pNotify->GUID,"0DAE12A3D8C9425DAAE25B3ECD16115A",sizeof("0DAE12A3D8C9425DAAE25B3ECD16115A")) ;COPYDATASTRUCT cpd;cpd.dwData = 0;cpd.cbData = sizeof(NOTIFY_INFO_t);             //data lengthcpd.lpData = (void*)pNotify;                //data buffercopyDataResult = pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM)&cpd);strDataToSend.ReleaseBuffer();}else {AfxMessageBox("Unable to find other app.");}
}

接收:

BOOL CCarRecogDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{// TODO: 在此添加消息处理程序代码和/或调用默认值
NOTIFY_INFO_t *pNotify ;pNotify = (NOTIFY_INFO_t *)pCopyDataStruct->lpData ;printf("%s \n",pNotify->GUID) ;return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}

运行结果:

转载于:https://www.cnblogs.com/betterwgo/p/8441452.html

MFC sendmessage实现进程间通信相关推荐

  1. MFC SendMessage()函数传递字符串

    CString cstr1 = _T("123"); CString cstr2 = _T("hello"); ::SendMessage(hWnd, WM_X ...

  2. SendMessage实现进程间通信

    通过SendMessage来发送WM_COPYDATA消息实现进程间的通信,之所以使用SendMessage是因为SendMessage会等待消息处理过程运行完毕才返回继续执行,不会清除发送的代码. ...

  3. MFC sendMessage消息使用说明

    首先 我们了解一下Windows的消息机制.Windows是一个消息驱动式系统,Windows消息提供应用程序与应用程序之间,应用程序与Windows系统之间进行通信的手段. 举个例子,打开记事本程序 ...

  4. C#中进程间通信方式汇总

    一.进程间通讯的方式 进程间通讯的方式有很多,常用的有共享内存(内存映射文件.共享内存DLL.剪切板等).命名管道和匿名管道.发送消息等几种方法来直接完成,另外还可以通过socket口.配置文件和注册 ...

  5. CString::GetBuffer函数作用

    CString::GetBuffer  LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); 对一个CString变量,你 ...

  6. VC/MFC 进程间通信方法总结

    VC/MFC 进程间通信方法总结 摘   要   随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程 / 多线程程序成为现代程序设计的一个重要特点,在多进程程序设计 ...

  7. MFC的SendMessage函数详解

    SendMessage函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数PostMessage不同,将一个消息寄送到一个线程的消息队 ...

  8. MFC中的模态对话框与非模态对话框的消息循环及消息传递问题(都可以通过SendMessage传递消息)

    注意:非模态和模态对话框都有自己的消息响应过程函数WindowPro,只不过他们的调用模态是自己的消息泵,非模态是由父窗体或父窗体的上一级的消息泵来调用.模态对话框和非模态对话框都可以通过SendMe ...

  9. MFC中SendMessage的用法与相应函数的添加

    1. 先来个基本知识介绍 [cpp] view plaincopy print? SendMessage的基本结构如下: SendMessage( HWND hWnd,  //消息传递的目标窗口或线程 ...

最新文章

  1. 大学计算机教学设计案例,信息技术教学设计案例.ppt
  2. 3亿人养老靠机器人?这家公司要在2030年实现,有谱
  3. 无法分配更多的internet句柄怎么回事_一文精通Java NIO(内容较多,无耐心者勿点)...
  4. gitlab ci 自动化部署_前端gitLab加jenkins自动化构建和部署,以及服务器常用的linux命令行操作,免密登录...
  5. HDU 1856 More is better
  6. 基于Google Reader发展起来的个性化推荐系统之三大问题
  7. linux虚拟光驱挂载方法,Linux操作系统下虚拟光驱(iso)的挂载
  8. 【VB.NET】测验题目Quiz2
  9. OpenStack Glance简介
  10. UnrealEngine4 学习总结备忘
  11. 辰皇怎么过鸿蒙,诛仙3职业全面解析 各职业副本优缺点介绍
  12. 拓扑容差如何修改_如何做到全屋WIFI无死角,MESH组网对比有哪些优势?
  13. c++ 写x64汇编 5参数_第9篇-C/C++ x86_64的函数栈
  14. C#图片处理之: 获取数码相片的EXIF信息(二)
  15. ROS中测试机器人里程计信息
  16. SharedPreferences小探
  17. UnityShader[3]屏幕后处理学习笔记
  18. 基于微流域划分的洪水淹没分析
  19. FreeCAD源码分析:Sketcher模块
  20. FPGA 429 接口设计

热门文章

  1. S2011打印机的IP设置
  2. rust腐蚀 木制窗户怎么修_潜艇围壳上的窗户为什么不会裂开?
  3. 坦克乘员协同训练模拟系统
  4. Debug在中Eclipse的应用
  5. 从零开始,DIY一个jQuery(2)
  6. mysql-installer-community-5.5.29.0.msi 下载
  7. 【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader
  8. 一步一步学solr:什么是solr?
  9. 设置 ASP.NET 存储当前应用程序的临时文件(生成的源、编译了的程序集等)的目录的物理路径。...
  10. 1091 N-自守数 (15分)