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

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

调用方法:

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

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

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

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

使用示例:

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

  1. 在App1中创建和映射共享内存
cpp 复制代码
// 定义共享内存的大小和名称
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中,你需要使用相同的共享内存名称来打开和映射共享内存。

cpp 复制代码
// 使用相同的共享内存名称
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指向共享内存,你可以读取或写入数据

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

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

相关推荐
老狼主1 天前
MFC CChartCtrl编程
c++·mfc
一杯科技拿铁1 天前
go‑cdc‑chunkers:用 CDC 实现智能分块 & 强力去重
c++·mfc
西哥写代码3 天前
基于dcmtk的dicom工具 第九章 以json文件或sqlite为数据源的worklist服务(附工程源码)
sqlite·json·mfc·dcmtk·worklist
R-G-B10 天前
【67】MFC入门到精通——MFC 销售管理系统 项目实现详细教程
mfc·mfc销售管理系统·销售管理系统
chilavert31812 天前
技术演进中的开发沉思-38 MFC系列:关于打印
c++·mfc
R-G-B12 天前
【51】MFC入门到精通——MFC串口助手(一)---初级版(初始化、串口设置、修改参数、打开/关闭、状态显示),附源码
c++·mfc·mfc串口助手·串口设置·串口初始化·串口打开/关闭·串口状态显示
chilavert31812 天前
技术演进中的开发沉思-41 MFC系列:定制 AppWizard
数据库·c++·windows·mfc
chilavert31812 天前
技术演进中的开发沉思-40 MFC系列:多线程协作
c++·windows·mfc
R-G-B14 天前
【38】MFC入门到精通——MFC 2种方法实现自动查找串口号 Combobox 控件
c++·mfc·自动查找串口号·串口号自动填充combobox
R-G-B14 天前
【53】MFC入门到精通——MFC串口助手(二)---通信版(发送数据 、发送文件、数据转换、清空发送区、打开/关闭文件),附源码
mfc·mfc串口助手·串口助手通信·串口发送数据·串口发送文件·串口数据转换·串口清空发送区