• 共享内存创建步骤
    ** 1.CreateFileMapping(创建一块内存)
    ** 2.MapViewOfFile(获取内存中的位置)
    ** 3.strcpy 在内存地址中写入数据
    ** 4.使用结束后,关闭销毁。。。
    头文件
#include <stdio.h>
#include <tchar.h>#include <iostream>
#include <Windows.h>
#include <string>
#include <vector>
  • 类声明文件
#include "stdafx.h"
//共享内存类的封装
enum USERTYPE{USER_CLIENT, //客户端USER_SERVER, //服务端
};class ShareMemory{public:ShareMemory();~ShareMemory();bool InitShareMemory(std::wstring share_name,USERTYPE user_type,int data_size = 4096);//初始化bool WriteData(std::string datas); //写入数据统一使用std::string格式bool ReadData(std::string&read_datas);//读取数据bool CloseShareMemory();//提前关闭static ShareMemory* getInstance(); //获取实例指针 避免static ShareMemory* m_instance;
private:HANDLE m_hMapFile; //文件句柄int m_read_size;//读取大小LPVOID m_lpBase;};
  • 类实现文件
#include "stdafx.h"
#include "ShareMemory.h"
using namespace std;#define BUF_SIZE 4096ShareMemory* ShareMemory::m_instance = nullptr;ShareMemory* ShareMemory::getInstance(){if (m_instance==nullptr){m_instance = new ShareMemory();if (m_instance){return m_instance;}}return m_instance;
}ShareMemory::ShareMemory()
{m_hMapFile = nullptr;m_read_size = 0;m_lpBase = nullptr;
}ShareMemory::~ShareMemory()
{if (m_hMapFile!=nullptr){//关闭 防止内存泄漏UnmapViewOfFile(m_lpBase);//解除文件映射CloseHandle(m_hMapFile); //关闭句柄}
}//初始化共享内存模块
//@params:share_name:内存名:
//@params:user_type:选择客户端或者服务端
//@data_size:默认4096 为创建多大的内存存放数据
bool ShareMemory::InitShareMemory(std::wstring share_name,USERTYPE user_type,int data_size)
{m_read_size = data_size;//判断用户类型if (user_type == USER_SERVER){HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,data_size,share_name.c_str());if (hMapFile == nullptr){cout << "服务端初始化共享内存失败" << endl;return false;}m_hMapFile = hMapFile;}else{HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL, share_name.c_str());if (hMapFile == nullptr){cout << "客户端初始化共享内存失败" << endl;return false;}m_hMapFile = hMapFile;}return true;
}//写入数据
//datas:需要写入的数据
bool ShareMemory::WriteData(std::string datas)
{LPVOID lpBase = MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); //获取共享内存的地址if (lpBase==nullptr){return false;}m_lpBase = lpBase;strcpy((char*)m_lpBase,datas.c_str()); //写入数据return true;
}//读取数据
//read_datas:读出的数据返回到这
bool ShareMemory::ReadData(std::string&read_datas)
{LPVOID lpBase = MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); //获取共享内存的地址if (lpBase==nullptr){return false;}m_lpBase = lpBase;char szBuffer[BUF_SIZE] = {0};strcpy(szBuffer,(char*)m_lpBase); //读出数据read_datas = szBuffer; //转到read_data;return true;
}bool ShareMemory::CloseShareMemory()
{if (m_hMapFile!=nullptr){//关闭 防止内存泄漏UnmapViewOfFile(m_lpBase);//解除文件映射CloseHandle(m_hMapFile); //关闭句柄}return true;
}
  • 调用方法
int _tmain(int argc, _TCHAR* argv[])
{unique_ptr<ShareMemory>sm(new ShareMemory());std::wstring demo_name = L"ff";sm->InitShareMemory(demo_name,USER_SERVER);std::string info_str = "twice";sm->WriteData(info_str);system("pause");return 0;
}
  • 具体说明和优化 回去写

C++共享内存类封装相关推荐

  1. linux 共享内存函数封装,linux ftok()函数 --多进程IPC之共享内存

    系统创建IPC通信(如消息队列.共享内存时)必须指定一个ID值.一般状况下,该id值经过ftok函数获得. ftok原型以下: key_t ftok( char * fname, int id ) f ...

  2. alin的学习之路:共享内存

    alin的学习之路:共享内存 1. 概念 共享内存是进程间通信中效率最高的一种方式. 共享内存: 可以被多个进程同时使用的一块内核的内存 有血缘关系的进程 没有血缘关系的进程 这块内存不属于任何的进程 ...

  3. 正文6:System V共享内存(修正版)及ftok函数讲解

    文章目录 0.linux共享内存相关操作命令 1)ipcs用法 2)ipcrm用法 1.共享内存的通信原理 0)特点 1)定义: 2)原理: 3)特别提醒: 4)原理图: 5)补充 2.为什么共享内存 ...

  4. boost库中共享内存的使用

    什么是共享内存 共享内存是最快速的进程间通信机制.操作系统在几个进程的地址空间上映射一段内存,然后这几个进程可以在不需要调用操作系统函数的情况下在那段内存上进行读/写操作.但是,在进程读写共享内存时, ...

  5. C#共享内存实例 附源码

    原文 C#共享内存实例 附源码 网上有C#共享内存类,不过功能太简单了,并且写内存每次都从开头写.故对此进行了改进,并做了个小例子,供需要的人参考. 主要改进点: 通过利用共享内存的一部分空间(以下称 ...

  6. linux 内存越界判断_LINUX 共享内存越界

    shmget的时候,我们能指定共享内存的size,当size越界的时候,会如何呢? 如下: /* * ShareMem.h * *  Created on: 2013-2-25 *      Auth ...

  7. 210305设计共享内存

    目录 一.学习的知识点 共享内存的设计 共享内存 的头部信息 共享内存的属性 共享内存类 共享内存类的构造函数 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 共享内存的作用 ...

  8. linux 共享内存_盘点那些linux 后台开发类常见问题及知识点

    一.linux和os: netstat :显示网络状态 tcpdump:主要是截获通过本机网络接口的数据,用以分析.能够截获当前所有通过本机网卡的数据包.它拥有灵活的过滤机制,可以确保得到想要的数据. ...

  9. 共享内存 传一个类指针_大神是如何学习 Go 语言之为什么使用通信来共享内存...

    为什么这么设计(Why's THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点.对具体实现造成的影响 ...

最新文章

  1. python 程序流程控制结构-Python基础—程序控制结构
  2. DEEPNORM:千层transformer...
  3. ViewPager的事件冲突的解决
  4. c语言串口通信_stm32 串口通信收发说明
  5. Express-generator
  6. Kai - Golang实现的目标检测云服务
  7. python结构_Python 项目的结构
  8. SpringBooot-基础1-构建项目
  9. 【CCCC】L3-005 垃圾箱分布 (30分),Dijkstra跑n遍 = 多源最短路,emm
  10. 第四章——数据库安全性
  11. 安卓Android的手机微博平台设计与开发
  12. css实现超过两行用...表示
  13. 关于手机的MAC地址
  14. 实验记录 | 8/7 阶段性结果整理(一)
  15. 如何进行IT服务管理系统/IT运维管理系统/ITSM选型?
  16. 数据挖掘 (一)——ASC文件读写、时间戳转换、可执行文件打包
  17. android 深度自定义View
  18. 动手深度学习笔记(一)2.1数据操作
  19. Activiti7实战入门一:请假单流程的制定以及代码实现
  20. YOLACT实时实例分割

热门文章

  1. Mybatis 一连串提问,被面试官吊打了!
  2. Echarts地图详细镇区的划分_echarts乡镇地图,echarts地图街道-算法与数据结构文档
  3. ES termQuery和matchQuery区别浅析
  4. CNN反向传播算法过程
  5. Java设计模式学习记录-单例模式
  6. 为什么我们要使用min-height和max-height样式属性?
  7. Unity时钟定时器插件
  8. SQL一些时间格式的转换
  9. 解决在phpmyadmin中执行sql语句出现的错误:Unknown storage engine 'InnoDB'
  10. [转载]企业网站建设必知必会