MFC中内存共享调用方法及使用示例

在MFC(Microsoft Foundation Classes)中,内存共享是一种实现进程间通信的有效方法。以下是MFC中内存共享的调用方法以及一个基本的使用示例:

调用方法:

  1. 创建文件映射对象:使用CreateFileMapping函数创建一个文件映射对象。该函数允许你指定共享内存的大小、访问权限和名称。

  2. 映射到地址空间:使用MapViewOfFile函数将文件映射对象映射到当前进程的地址空间。这将返回一个指向共享内存的指针。

  3. 访问共享内存:通过MapViewOfFile返回的指针,你可以像访问常规内存一样访问共享内存。

  4. 解除映射和关闭句柄:使用UnmapViewOfFile函数解除对共享内存的映射,并使用CloseHandle关闭相关的句柄。

使用示例:

假设我们有两个MFC应用程序,App1和App2,它们需要共享一些数据。

  1. 在App1中创建和映射共享内存
// 定义共享内存的大小和名称
const DWORD SHARED_MEM_SIZE = 4096;
const LPCTSTR SHARED_MEM_NAME = _T("MySharedMem");// 创建文件映射对象
HANDLE hFileMap = CreateFileMapping((HANDLE)INVALID_HANDLE_VALUE,    // 使用页文件作为共享内存NULL,                             // 安全描述符PAGE_READWRITE,                  // 读写权限0,                                // 最大大小的高位SHARED_MEM_SIZE,                 // 最大大小的低位SHARED_MEM_NAME                  // 共享内存的名称
);if (hFileMap == NULL) {// 处理错误
}// 映射到地址空间
LPVOID pSharedMem = MapViewOfFile(hFileMap,                       // 文件映射对象的句柄FILE_MAP_READ | FILE_MAP_WRITE,// 读写权限0, 0, 0                         // 偏移量和映射大小(这里映射整个共享内存)
);if (pSharedMem == NULL) {// 处理错误
}// 现在,pSharedMem指向共享内存,你可以在这里写入或读取数据
  1. 在App2中访问共享内存

在App2中,你需要使用相同的共享内存名称来打开和映射共享内存。

// 使用相同的共享内存名称
const LPCTSTR SHARED_MEM_NAME = _T("MySharedMem");// 打开已存在的文件映射对象
HANDLE hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, // 读写权限FALSE,                          // 不继承句柄SHARED_MEM_NAME                 // 共享内存的名称
);if (hFileMap == NULL) {// 处理错误
}// 映射到地址空间
LPVOID pSharedMem = MapViewOfFile(hFileMap,                       // 文件映射对象的句柄FILE_MAP_READ | FILE_MAP_WRITE,// 读写权限0, 0, 0                         // 偏移量和映射大小(这里映射整个共享内存)
);if (pSharedMem == NULL) {// 处理错误
}// 现在,pSharedMem指向共享内存,你可以读取或写入数据

注意,在使用共享内存时,必须确保所有进程都使用相同的共享内存名称,并且正确管理内存的生命周期和访问权限。此外,当多个进程或线程同时访问共享内存时,需要使用同步机制(如互斥锁、信号量等)来确保数据的一致性和完整性。

上述示例仅展示了如何创建和访问共享内存。在实际应用中,你可能还需要考虑如何同步访问、处理错误和异常情况,以及如何优雅地关闭和清理资源。

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

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

相关文章

在 debian 虚拟机里如何设置 iso 文件为本地安装源

文章目录 在debian虚拟机里如何设置iso文件为本地安装源 <2023-07-10 周一> 在debian虚拟机里如何设置iso文件为本地安装源 这里有个坑&#xff0c;首先必须要先将iso文件加载好&#xff08;如何运行apt-cdrom后提示加载并按回车的话&#xff0c;后面可能出设置失败&am…

ARM 汇编指令:(三)运算处理指令

目录 一.add指令 二.sub指令 三.MUL指令 一.add指令 add用于执行实现两个寄存器或寄存机或寄存器与立即数的相加操作。它可以用于整数、浮点数等各种数据类型的加法运算。 ADD{cond}{S} Rd,操作数,操作数 1.不带进位加法指令add add r1, r2, #4 //r1 r2 4 add r1, r2 …

解决JVM进程被系统杀掉问题

背景 服务A在测试环境&#xff0c;隔几个小时接口就无法访问。登录机器查看&#xff0c;发现进程已经没了。大致猜想是进程使用的内存或CPU资源使用太多&#xff0c;导致被系统kill。 问题定位 使用dmesg命令查看进程被kill的详情。 > dmesg --time-format iso2024-03-0…

cv2.cvtColor()将二维转化为彩色图像

我们如果要将一维的图像转化为三维的彩色图像 import cv2 img cv2.cvtColor(img.squeeze(0), cv2.COLOR_GRAY2BGR) 这里的img.squeeze为二维数据&#xff0c;img为三维数据&#xff0c;所以压缩掉一个维度 。这样就将图像转化为了三维彩色图像。 cv2.imshow(Image, img) c…

EasyCode 插件的具体使用

前言 EasyCode 是基于IntelliJ IDEA Ultimate版开发的一个代码生成插件&#xff0c;主要通过自定义模板&#xff08;基于velocity&#xff09;来生成各种你想要的代码。通常用于生成Entity、Dao、Service、Controller。如果你动手能力强还可以用于生成HTML、JS、PHP等代码。理…

iOS 判断触摸位置是否在图片的透明区域

装扮功能系列&#xff1a; Swift 使用UIScrollerView 实现装扮功能&#xff08;基础&#xff09;Swift 使用UIScrollerView 实现装扮功能&#xff08;拓展&#xff09;iOS 判断触摸位置是否在图片的透明区域 背景 在装扮功能中&#xff0c;一般都是长按使道具进入编辑状态&…

AI与法律:大模型在法律文书生成中的应用与前景

AI与法律&#xff1a;大模型在法律文书生成中的应用与前景 测试&#xff1a; 评估指标&#xff1a;使用BLEU、ROUGE等指标评估生成质量。 模型压缩&#xff1a;通过剪枝、量化等方法减小模型大小。 模型部署&#xff1a;将模型部署到服务器或移动端&#xff0c;实现实时生成…

Docker拉取镜像存储不足

在使用Docker时&#xff0c;我们经常遇到一个问题&#xff0c;就是拉取镜像时提示存储空间不足。这是因为Docker在拉取镜像时需要将镜像文件下载到本地存储中&#xff0c;而有时本地存储空间不足以容纳完整的镜像文件。 本文将介绍一些解决这个问题的方法&#xff0c;并提供相…

Java学习笔记(11)

面向对象进阶 Static 静态变量 所有对象一起共享&#xff0c;就用static修饰 不属于对象&#xff0c;属于类的 可以用 类名.静态变量 “”&#xff1b;赋值 但是 对象.静态变量也可以访问到内容 Static内存图 Student这个类的字节码文件加载到方法区&#xff0c;并在内…

HTTP/1.1和HTTP/2的区别

HTTP/1.1和HTTP/2是两个不同的版本的超文本传输协议&#xff08;HTTP&#xff09;&#xff0c;用于在客户端和服务器之间传输信息。下面是它们之间的一些主要区别&#xff1a; 请求-响应的方式&#xff1a; HTTP/1.1: 在HTTP/1.1中&#xff0c;每个请求都需要单独的建立和维护…

什么是池架构?

池架构是一个微服务架构的潜在竞争者&#xff0c;在面向未来的可扩展性的竞争中挑战微服务的主导地位。 本文深入研究池架构的核心功能&#xff0c;将其与微服务进行比较&#xff0c;并探讨其彻底改变我们构建可扩展应用程序方式的潜力。我们将揭示与池架构相关的已公开的优势…

“人工智能+”成国策,天翼云如何打造大模型时代的驱动力样板?

文 | 智能相对论 作者 | 叶远风 两会政府工作报告中明确指出要制定支持数字经济高质量发展政策&#xff0c;开展“人工智能”行动&#xff0c;这意味着&#xff0c;“人工智能”已经成为国策。 在这种大背景下&#xff0c;大模型的重要性无疑被抬到了新的高度。 此时&#…

一文了解前端面试重点--闭包

1、什么是闭包&#xff1f; 闭包是指有权访问另一个函数作用域中的变量的函数&#xff0c;创建闭包的最常见的方式就是在一个函数内创建另一个函数。 温馨提示&#xff1a;由于闭包所在的作用域返回的局部变量不会被销毁&#xff0c;所以会占用内存。过度的使用闭包会迫使性能…

GraphQL入门之使用ApolloServer和express构建GraphQL服务

接上一篇文章&#xff0c;由于 express 现在仍然是主流的 Node.js 服务端框架&#xff0c;所以今天看看 ApolloServer 怎样和 express 集成构建 GraphQL 服务。另外今天文章也顺便讲一下怎么使用 typescript 来实现。 初始化项目 mkdir myapp cd myapp npm init (一路回车)安…

FPGA - 单总线协议(one-wire)

1&#xff0c;简介 单总线&#xff08;one-wire&#xff09;是美国 DALLAS 公司推出的外围串行扩展总线技术&#xff0c;与 SPI、I2C 等串行数据通信方式不同&#xff0c;它采用单根信号线&#xff0c;既传输时钟又传输数据&#xff0c;而且数据传输是双向的。它具有节省 I/O口…

【机器人控制 Robot Control】非线性控制(Non-linear Control)建模举例【新加坡南洋理工大学 NTU Singapore】

Non-linear Control Method Example: Non-linear Mechanical System Modelling of the System using Control Law Partitioning (Handwritten)

Lua 如何在Lua中调用C/C++函数

Lua调用C函数有两种方式 程序主体在C中运行&#xff0c;C函数注册到Lua中。C调用Lua&#xff0c;Lua调用C注册的函数&#xff0c;C或者Lua得到函数的执行结果。程序主体在Lua中运行&#xff0c;C函数作为库函数供Lua使用。 C的代码如下 如何在Lua脚本中调用这个C语言函数(ad…

医药电商大数据实践

文章目录 一、项目概述二、功能概述三、关键技术四、系统架构设计4.1 大数据采集子系统4.1.1定义4.1.2接口五、数据存储设计5.2数据采集子系统5.2.1采集用户流量数据5.2.2采集用户订单数据5.2.3 采集用户订单项数5.3流量分析及经营状况分析5.3.1流量分析5.3.2经营状况分析数据5…

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理 一、安装OpenCV-3.4.161.下载OpenCV-3.4.16安装包2.将安装包放到/home&#xff0c;并解压3.使用 cmake 安装 opencv4.配置环境5.查看 opencv 的版本信息 二、处理图片&#xff08;一&#xff09;创建文件夹 code &#…

Ansible管理主机的清单------------inventory

一、 Ansible组成 INVENTORY&#xff1a;Ansible管理主机的清单 /etc/ansible/hosts 需要管理的服务清单,(将你需要管理的主机 、地址 或者名字 写入此文件) MODULES&#xff1a;Ansible执行命令的功能模块&#xff0c;多数为内置核心模块&#xff0c;也可自定义 PLUGINS&…