当前位置: 首页 > news >正文

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函数,处理低级网络控制,不常用;

相关文章:

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

win32进程间通信 文件映射共享内存匿名管道命名管道远程过程调用(RPC)对象连接与嵌入(OLE)动态数据交换(DDE)剪贴板WM_COPYDATA消息邮件槽其它 文件映射 特点:本地间通信,不能用于网…...

基于Vue+ELement搭建动态树与数据表格实现分页模糊查询

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 &#x1…...

多线程案例 - 单例模式

单例模式 ~~ 单例模式是常见的设计模式之一 什么是设计模式 你知道象棋,五子棋,围棋吗?如果,你想下好围棋,你就不得不了解一个东西,”棋谱”,设计模式好比围棋中的 “棋谱”. 在棋谱里面,大佬们,把一些常见的对局场景,都给推演出来了,照着棋谱来下棋,基本上棋力就不会差到哪…...

云原生Kubernetes:对外服务之 Ingress

目录 一、理论 1.Ingress 2.部署 nginx-ingress-controller(第一种方式) 3.部署 nginx-ingress-controller(第二种方式) 二、实验 1.部署 nginx-ingress-controller(第一种方式) 2.部署 nginx-ingress-controller(第二种方式) 三、问题 1.启动 nginx-ingress-controll…...

Java21 新特性

文章目录 1. 概述2. JDK21 安装与配置3. 新特性3.1 switch模式匹配3.2 字符串模板3.3 顺序集合3.4 记录模式(Record Patterns)3.5 未命名类和实例的main方法(预览版)3.6 虚拟线程 1. 概述 2023年9月19日 ,Oracle 发布了…...

Rest Template 使用

大家好我是苏麟 今天带来Rest Template . spring框架中可以用restTemplate来发送http连接请求, 优点就是方便. Rest Template 使用 Rest Template 使用步骤 /*** RestTemple:* 1.创建RestTemple类并交给IOC容器管理* 2. 发送http请求的类*/ 1.注册RestTemplate对象 SpringB…...

IDEA git操作技巧大全,持续更新中

作者简介 目录 1.创建新项目 2.推拉代码 3.状态标识 5.cherry pick 6.revert 7.squash 8.版本回退 9.合并冲突 1.创建新项目 首先我们在GitHub上创建一个新的项目,然后将这个空项目拉到本地,在本地搭建起一个maven项目的骨架再推上去&#xff0…...

计算机操作系统 (王道考研)笔记(四)I/O系统

目录 1 I/O1.1 I/O 概念和分类1.1.1 I/O 定义1.1.2 I/O 分类 1.2 I/O控制器1.3 I/O 软件层次结构1.4 I/O 应用程序接口和驱动程序应用接口 1 I/O 1.1 I/O 概念和分类 1.1.1 I/O 定义 BIOS(英文:Basic Input/Output System),即基…...

【Java基础】抽象类和接口的使用

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌 目录 一、抽象类抽象类概念…...

Golang的性能优化

欢迎,学习者们,来到Golang性能优化的令人兴奋的世界!作为开发者,我们都努力创建高效、闪电般快速的应用程序,以提供出色的用户体验。在本文中,我们将探讨优化Golang应用程序性能的基本技巧。所以&#xff0…...

实现两栏布局的五种方式

本文节选自我的博客:实现两栏布局的五种方式 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。📝 CSDN主页:爱吃糖的猫🔥📣 我的博客:爱吃糖的猫&…...

博物馆门票预约APP的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

【AI视野·今日Robot 机器人论文速览 第四十四期】Fri, 29 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 29 Sep 2023 Totally 38 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚NCF,基于Neural Contact Fields神经接触场的方法实现有效的外部接触估计和插入操作。 (from FAIR ) 操作插入处理结果&am…...

一维数组和二维数组的使用(char类型)

目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用: 一…...

1.基本概念 进入Java的世界

1.1 Java的工作方式 1.2 Java的程序结构 类存于源文件里面,方法存于类中,语句(statement)存于方法中 源文件(扩展名为.java)带有类的定义。类用来表示程序的一个组件,小程序或许只会有一个类…...

程序在线报刊第一期

文章目录 程序在线报刊第一期排序算法:优化数据处理效率的核心技术回顾区块链技术:去中心化引领数字经济新时代展望AI未来:智能化时代的无限可能 程序在线报刊第一期 排序算法:优化数据处理效率的核心技术 近年来,随…...

k8s 拉取镜像报错 no basic auth credentials

文章目录 [toc]基于现有凭据创建 Secret通过命令行创建 Secretpod 使用指定 secret 认证私有镜像仓库 省流提醒: 本次解决的问题是 docker login 可以正常登录,docker pull 也可以正常拉取镜像,只是 k8s 在启动 pod 的时候,没有指…...

Koa处理请求数据

在开发中,后端接收到请求参数后,需要解析参数。请求分为很多种类型,比如常见的get和post。 请求参数 Koa本身可以解析get请求参数,不能解析post请求参数。例如: router.get(/api/get/userInfo, async (context) >…...

关于浮点数的 fld、fadd、fstp 汇编指令介绍

文章目录 FLDFADDFSTP FLD, FADD 和 FSTP 常在一起出现&#xff0c;用于 float 运算。组合实现浮点数的加载、加法运算和保存 FLD FLD 指令用于将 浮点数 从内存加载到浮点寄存器栈&#xff08;FPU Stack&#xff09;中。它的使用方式如下&#xff1a; FLD <源内存地址&g…...

知识图谱小白入门(1):neo4j的安装与CQL的使用

文章目录 序一、安装neo4j1.1 下载neo4j1.2 安装JDK1.3 BUG&#xff1a;dbms failed to start 二、CQL语法2.1 CQL语法创建节点查询节点创建关系查询关系2.2 习题 习题答案 序 知识图谱&#xff0c;是一种实体间的信息与关系知识的网状结构&#xff0c;借用图论中点与边的概念…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...