C++ 共享内存 函数封装
#pragma once
#include <string>
#include <wtypes.h>
#include <map> using namespace std; #define MEMORYSIZE 102400000 //每块内存的大小 struct MemoryAddr{
string StrName;
LPVOID pBuffer;
HANDLE m_Handle;
}; class SharedMemory
{
public:
SharedMemory(void);
~SharedMemory(void);
public:
string strMapName; // 内存映射对象名称
string strComData; // 共享内存中的数据
int MemoeryNum; //开辟内存数 map<int,MemoryAddr>MemoryInfo; LPVOID Init(string MeName);
void IntPutData(string MeName,string str);
string OutPutData(string MeName);
string GetAllData();
};
#include "StdAfx.h"
#include "SharedMemory.h" SharedMemory::SharedMemory(void)
{
MemoeryNum=;
} SharedMemory::~SharedMemory(void)
{
map<int,MemoryAddr>::iterator it; for (it=MemoryInfo.begin();it!=MemoryInfo.end();it++)
{
::UnmapViewOfFile(it->second.pBuffer);
::CloseHandle(it->second.m_Handle);
} MemoryInfo.clear();
} LPVOID SharedMemory::Init( string MeName)
{
MemoryAddr mMemoryAddr;
LPVOID pBuffer;
// 首先试图打开一个命名的内存映射文件对象
HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, , MeName.c_str()); if (NULL == hMap)
{ // 打开失败,创建之
hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,,MEMORYSIZE,MeName.c_str());
// 映射对象的一个视图,得到指向共享内存的指针,设置里面的数据
pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, , , );
}
else
{ // 打开成功,映射对象的一个视图,得到指向共享内存的指针,显示出里面的数据
pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, , , );
} mMemoryAddr.StrName=MeName.c_str();
mMemoryAddr.pBuffer=pBuffer;
mMemoryAddr.m_Handle=hMap; MemoryInfo.insert(pair<int,MemoryAddr>(MemoeryNum,mMemoryAddr)); MemoeryNum++; return pBuffer;
} void SharedMemory::IntPutData(string MeName, string str )
{
map<int,MemoryAddr>::iterator itr;
for (itr=MemoryInfo.begin();itr!=MemoryInfo.end();itr++)
{
if (MeName==itr->second.StrName)
{
strcpy((char*)itr->second.pBuffer, str.c_str());
}
}
} std::string SharedMemory::OutPutData(string MeName)
{
map<int,MemoryAddr>::iterator iter; for (iter=MemoryInfo.begin();iter!=MemoryInfo.end();iter++)
{
if (iter->second.StrName==MeName)
{
return (char*)iter->second.pBuffer;
}
}
} std::string SharedMemory::GetAllData()
{
string str="";
map<int,MemoryAddr>::iterator ir;
for (ir=MemoryInfo.begin();ir!=MemoryInfo.end();ir++)
{
string strTemp="";
strTemp.append(ir->second.StrName);
strTemp.append(":");
strTemp.append((char*)ir->second.pBuffer);
str.append(strTemp.c_str());
str.append(",");
}
return str;
}
C++ 共享内存 函数封装的更多相关文章
- 创建共享内存函数CreateFileMapping()详解
测试创建和打开文件映射的时候老是得到"句柄无效"的错误, 仔细看了MSDN以后才发觉是函数认识不透, 这里把相关的解释翻译出来 HANDLE CreateFileMapping( ...
- 作为phper既然了解共享内存函数shmop的使用方法,那么就必须要了解一下信号量是什么,以及信号量使用的代码案例
在单独的一个PHP进程中读写.创建.删除共享内存方面上你应该没有问题了.但是实际运行中不可能只是一个PHP进程在运行中.如果在多个进程的情况下你还是沿用单个进程的处理方法,你一定会碰到问题--著名的并 ...
- c#读写共享内存操作函数封装
原文 c#读写共享内存操作函数封装 c#共享内存操作相对c++共享内存操作来说原理是一样,但是c#会显得有点复杂. 现把昨天封装的读写共享内存封装的函数记录下来,一方面希望给需要这块的有点帮助,另一方 ...
- System V 共享内存 和 系列函数
跟消息队列一样,共享内存也有自己的数据结构,如下: struct shmid_ds { struct ipc_perm shm_perm; /* Ownership and permission ...
- v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码
百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...
- Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()
下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...
- linux进程间通信-共享内存
转载:http://www.cnblogs.com/fangshenghui/p/4039720.html 一 共享内存介绍 共享内存可以从字面上去理解,就把一片逻辑内存共享出来,让不同的进程去访问它 ...
- 进程间通信IPC:消息队列,信号量,共享内存
2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...
- 共享内存+互斥量实现linux进程间通信 分类: Linux C/C++ 2015-03-26 17:14 67人阅读 评论(0) 收藏
一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享 ...
随机推荐
- [No00009D]使用visual studio 2015 update3打包程序安装包的简单方法(不需要InstallShield)
注意: 该方法只适用于小型软件的打包发布: 该打包向导可以预先检查需要的运行库支持: 由于visual studio自2012后取消掉了自带的打包程序,如果有需要打包安装,需要使用一个叫用Instal ...
- MongoDB 导出、导入表
var srcTbl = "20161226"; var destTbl = "20161226-bak"; 方式一: MongoClient client ...
- [LeetCode] Max Points on a Line 共线点个数
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
- 实体类和DataTable的转换
引子 最近在项目中在数据库查询的时间,总是要用到数据表到实体类对象列表的转化,自己封装了一个转换的方法,用起来还比较方便,记下来,以后可以重复使用,原理就主要是利用反射,当然有更好的ORM框架可以实现 ...
- Visual Stdio 无法直接启动带有“类库输出类型”的项目若要调试此项目,请在此解决方案中添加一个引用库项目的可执行项目。将这个可执行项目设置为启动项目!
j解决方法:项目-属性-应用程序-输出类型-Windows应用程序
- ROS中DDNS的使用
一.通过tool fetch更新ddns,关于此命令的使用,参考 tool fetch Scripts中添加脚本/tool fetch url="http://www.51kwl.com/? ...
- 虚拟机下Centos7如何设置静态IP地址
最近在学习linux环境部署~~~~ 首先,将网络适配设置成为桥接模式 查看本机IP地址,ipconfig,记住ipv4地址和默认网关地址,等会配置的时候要用 启动Centos,进入终端模式,设置IP ...
- [CI] 使用Jenkins自动编译部署web应用
写在前面 初步接触持续集成自动化过程,本篇主要介绍基于Jenkins实现持续集成的方式,通过案例介绍线上自动编译及部署的配置过程 持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作 ...
- sql server 多列转多行实现方法
select * from b_workOrder select * from( SELECT work_order_id,work_level, roles,code FROM (SELECT wo ...
- IDEA中maven搭建Spring+SpringMVC+mybatis项目
一.介绍 使用IDEA搭建maven web项目,整合框架Spring+SpringMVC+mybatis 项目结构图: