win32进程间通信方式(13种)

win32进程间通信

  • 文件映射
  • 共享内存
  • 匿名管道
  • 命名管道
  • 远程过程调用(RPC)
  • 对象连接与嵌入(OLE)
  • 动态数据交换(DDE)
  • 剪贴板
  • WM_COPYDATA消息
  • 邮件槽
  • 其它

文件映射

特点:本地间通信,不能用于网络,需控制进程同步;
三种方法来使多个进程共享一个文件映射对象:

  • 继承。父进程创建文件映射对象,子进程继承其句柄;
  • 命名文件映射。给文件映射对象一个名字,其它进程通过名字(其它IPC传递)打开映射对象;
  • 句柄复制。通过其它IPC通信方式,传递对象句柄到另一个进程;

共享内存

特点:文件映射的一种特殊方式;
进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映 射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。

匿名管道

特点:父子进程通信,或者子进程间通信,不能在两个不相关进程通信,子进程标准I/O重定向;
两个带句柄的进程作为2个端点,建立一条通信通道,一般一段负责读,另一端负责写,也可以做成两端可读写;

命名管道

特点:可进行远程通信(服务器),但在1对多的情况下较困难;
服务器端(本地进程)创建命名管道,远端打开这个管道,根据给定的权限跟其它服务器通信;

远程过程调用(RPC)

特点:实现远程接口本地调用,跨操作系统远程通信;
Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,通过Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信;

对象连接与嵌入(OLE)

特点:可嵌套电子表格,打开自启动表格编辑器,关闭自动更新表格(文档);
应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服务。

动态数据交换(DDE)

特点:自定义数据格式,远端操作;
动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。
DDE有 三种数据交换方式:
(1) 冷链:数据交换是一次性数据传输,与剪贴板相同。
(2) 温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。
(3) 热链:当数据交换时服务器自动给客户发送数据。

剪贴板

特点:操作简单,有丰富的API函数,windows应用程序间通信;
剪贴板为Windows应用程序之间进行数据共享提供了一个中介,是一个非常松散的交换媒介,支持任何数据格式,只需在数据格式上一致或都可以转化为某种格式就行;

// 常用数据格式
#define CF_TEXT             1
#define CF_BITMAP           2
#define CF_METAFILEPICT     3
#define CF_SYLK             4
#define CF_DIF              5
#define CF_TIFF             6
#define CF_OEMTEXT          7
#define CF_DIB              8
#define CF_PALETTE          9
#define CF_PENDATA          10
#define CF_RIFF             11
#define CF_WAVE             12
#define CF_UNICODETEXT      13// 复制内容到剪贴板
if (OpenClipboard(m_hWnd))
{CStringW strWide = CStringW(L"这是测试内容!");int nLen = strWide.GetLength();::EmptyClipboard();HANDLE clipbuffer = ::GlobalAlloc(GMEM_DDESHARE, (nLen + 1) * 2);if (!clipbuffer){::CloseClipboard();return;}char* buffer = (char*)::GlobalLock(clipbuffer);memset(buffer, 0, (nLen + 1) * 2);memcpy_s(buffer, nLen * 2, strWide.GetBuffer(0), nLen * 2);strWide.ReleaseBuffer();::GlobalUnlock(clipbuffer);::SetClipboardData(CF_UNICODETEXT, clipbuffer);::CloseClipboard();
}// 粘贴剪贴板内容
OpenClipboard(m_hWnd); 
if (IsClipboardFormatAvailable(CF_UNICODETEXT))
{//取出数据  HGLOBAL hg = GetClipboardData(CF_UNICODETEXT);//锁定内存块  LPWSTR wstr = (LPWSTR)GlobalLock(hg);if (wstr != NULL){MyMessageBox(wstr);}GlobalUnlock(hg);
}
CloseClipboard();

注意:复制和粘贴的内容格式保持一致。

WM_COPYDATA消息

特点:操作简单,通信安全,底层通过文件映射实现;
通过调用SendMessage函数,接收方像处理普通消息一样,在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据,可实现安全传输;

// 数据结构
typedef struct tagCOPYDATASTRUCT{ DWORD dwData;//用户定义数据 DWORD cbData;//数据大小 PVOID lpData;//指向数据的指针 
}COPYDATASTRUCT;// 发送方
char copystr[] ="hello world!" ;
CopyData.dwData = 1;//这个是自定义数据随意填
CopyData.cbData = strlen(copystr);//发送数据的大小
CopyData.lpData = (char*)copystr;//指向数据的指针
::SendMessage(g_pHwnd, WM_COPYDATA, 0, (LPARAM)&CopyData);// 接收方
COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT*)lParam;
char *pData = new char[pCopyData->cbData+1];
memcpy(pData, pCopyData->lpData , pCopyData->cbData);
pData[pCopyData->cbData] = '\0';

邮件槽

特点:双向通信,数据传输不可靠(UDP包),有简化的编程接口,可进行进程消息广播;
进程服务器创建邮件槽,其它进程作为邮件槽客户,客户通过邮件槽名字给进程服务器发消息, 实现单向通信。任何进程都可创建邮件槽,故可进行双向通信。

其它

除了这些,进程间通信方式还有很多。如:

  • socket套接字,经常使用的;
  • 动态链接库(DLL),全局数据实现共享;
  • NetBios函数,处理低级网络控制,不常用;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel实现只针对某项字符第一次出现的位置分列

取第一次出现左边数值 B1LEFT(A1,SEARCH(".",A1)-1) 取第一次出现右边数值 C1RIGHT(A1,LEN(A1)-SEARCH(".",A1)) 公式如图:

Vim快捷用法

以下为文本操作 1.快速切换 行首^(shift6) 行尾$(shift4) 文章开始gg 位置末尾G 向下翻页CTRLB 向上翻页CTRLF 2.删除内容 删除一行 dd 3.复制粘贴 复制一行yy 粘贴 p 4.撤销操作 撤销操作 u 恢复操作ctrlr 以下都为底行操作 1.显示行号 set nu 2.多文件分屏阅读 加入阅…

AI智能视频监控技术如何助力美好乡村建设?

随着城市化发展,很多乡村设施也在逐渐完善,智能监控也成了乡村发展必不可少的一环,智能视频监控应该在乡村建设里如何发挥作用呢? 1、有效提升安全意识 通过在乡村重要区域、公共场所、道路等设置智能视频监控设备,可…

第六次面试、第一次复试

第六面: hr迟到,说是搞错了以为线下,我打电话过去才开始,问我想电话面还是视频,果断电话面 自我介绍 介绍了一下公司的工作 ................. 项目拷打: grpc数据如何传输的如何调用两个接口如何获取…

CasaOS:一个docker容器应用的可视化Portal

CasaOS 官网声称他是一个家庭云操作系统,但我实际使用后感觉称之为“docker容器的可视化Portal”更合适。因为它本身不具备IAAS、PAAS、或SAAS的开箱即用能力,更像是一个把OS上的docker Container集中管理并展示的索引目录,各个docker Contai…

uni-app:点击图片进行图片旋转(可自定义旋转次数)

效果 代码 <template><view><view class"top_line"><view class"top_img"><image src"../../../static/bg/index.png" mode""></image></view><view class"top_button">…

java_Springboot_Mybatis-Plus_自定义多数据源MybatisSqlSessionFactoryBean配置

java_Springboot_Mybatis-Plus_自定义多数据源MybatisSqlSessionFactoryBean配置方法 目录 java_Springboot_Mybatis-Plus_自定义多数据源MybatisSqlSessionFactoryBean配置方法引言环境集成过程中遇到的问题Invalid bound statement (not found) 错误默认数据源问题 测试数据源…

3D 视觉市场空间广阔,3D 感知龙头全技术路线布局

3D 视觉市场尚处在发展早期,空间广阔 人类 70%以上信息通过眼睛获取,对于机器而言,视觉感知也是其“智能化”升级的重要基础。3D 成像让每一个像素除 x、y 轴数据外,还有 z 轴(深度/距离)数据。围绕着人体、物体、空间扫描一圈,就能得到点云图和精准的“1:1”还原的 3D …

踩坑 | vue项目运行后使用require()图片也不显示

文章目录 踩坑 | vue项目运行后使用require()图片也不显示问题描述解决办法1&#xff1a;src属性直接传入地址解决办法2 踩坑 | vue项目运行后使用require()图片也不显示 问题描述 在网上查阅之后&#xff0c;发现结论是在使用vue动态加载图片时&#xff0c;必须使用require。…

rust :mod.rs和lib.rs中use的作用

一、mod.rs和lib.rs mod.rs往往是把同一目录下的n个rs文件综合在一起的有效方式&#xff1b; lib.rs是一个库或子库层次综合在一起的有效方式&#xff1b; songroomstaff-NB-146:~/myffi/rusttoc/src$ ls -R .: bar lib.rs./bar: data.rs ffi.rs mod.rsdata.rs文件内容 #[…

B. Sets and Union

题目&#xff1a; 样例&#xff1a; 输入 4 3 3 1 2 3 2 4 5 2 3 4 4 4 1 2 3 4 3 2 5 6 3 3 5 6 3 4 5 6 5 1 1 3 3 6 10 1 9 2 1 3 3 5 8 9 1 2 4 28输出 4 5 6 0 思路&#xff1a; 这里题目的意思是&#xff0c;要求合并尽可能多的集合&#xff0c;使它的集合大小最大&…

C#之性能优化

一、垃圾回收 1.避免不必要的对象创建 ①避免循环创建对象 如果对象并不会随每次循环而改变状态&#xff0c;那么在循环中反复创建对象将带来性能损耗。高效的做法是将对象提到循环外面创建。 ②在需要逻辑分支中创建对象 如果对象只在某些逻辑分支中才被用到&#xff0c;…

Spring面试题23:Spring支持哪些事务管理类型?Spring框架的事务管理有哪些优点?你更倾向用哪种事务管理类型?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持哪些事务管理类型? Spring 支持以下几种事务管理类型: 编程式事务管理:通过在代码中显式地使用事务管理 API(如 TransactionTempla…

【C++基础】内存泄漏检测——Valgrind、VLD、RTC

Valgrind Valgrind安装 &#xff08;这里我的安装环境是Ubuntu&#xff09; 打开终端&#xff0c;确保你的包列表是最新的。运行以下命令来更新包列表&#xff1a; sudo apt update 安装 valgrind。运行以下命令来安装 valgrind&#xff1a; sudo apt install valgrind 安装…

如何使ssh操作linux 更安全

对于提高linux的SSH远程操作安全性可从以下几个方面进行增强 禁用ROOT用户&#xff0c;创建其他用户&#xff0c;并使用密钥登陆更改SSH默认端口号&#xff0c;设置一个较长数位的端口号&#xff0c;增加被端口扫描到的难度可对常使用的用户经常执行的命令进行sudo授权&#x…

jenkins联动显示或隐藏参数

1. 添加组件 Active Choices Plug-in 如jenkins无法联网,可在以下两个地址中下载插件,然后放到/home/jenkins/.jenkins/plugin下面重启jenkins即可 Active Choices Active Choices | Jenkins plugin 2. 效果如下: sharding为空时,sharding_info和copy_info不显示 shard…

【LeetCode-简单题】589. N 叉树的前序遍历

文章目录 题目方法一&#xff1a;单循环栈做法方法二&#xff1a;递归 题目 方法一&#xff1a;单循环栈做法 关键在于子节点的入栈顺序&#xff0c;决定了子节点的出栈顺序&#xff0c; 因为是前序遍历 所以压栈顺序先让右边的入栈 依次往左 这样左边的节点会在栈顶 这样下次…

全链路压测:优化系统性能的关键措施

在现代互联网时代&#xff0c;系统的性能稳定性和可靠性对于企业的成功至关重要。全链路压测作为一项关键的测试措施&#xff0c;可以模拟真实的负载情况&#xff0c;全面评估系统在高负载环境下的表现。本文将介绍全链路压测的定义、作用以及在优化系统性能方面的重要性。 一、…

MATLAB打开历史命令窗口并保持

版本&#xff1a;matlab 2021a 方法&#xff1a;菜单栏 主页 - 布局 - 命令历史记录 - 停靠

elasticsearch 索引write.lock报错解决 —— 筑梦之路

ES报错&#xff1a; Caused by: org.apache.lucene.store.LockObtainFailedException: Lock held by another xxx write.lock 这是ES异常关闭导致索引的写锁未释放&#xff0c;索引一直处于red状态 解决方法&#xff1a; 1. 停掉ES服务 2. 找到相应的数据目录&#xff0c…