#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++ 共享内存 函数封装的更多相关文章

  1. 创建共享内存函数CreateFileMapping()详解

    测试创建和打开文件映射的时候老是得到"句柄无效"的错误, 仔细看了MSDN以后才发觉是函数认识不透, 这里把相关的解释翻译出来 HANDLE CreateFileMapping( ...

  2. 作为phper既然了解共享内存函数shmop的使用方法,那么就必须要了解一下信号量是什么,以及信号量使用的代码案例

    在单独的一个PHP进程中读写.创建.删除共享内存方面上你应该没有问题了.但是实际运行中不可能只是一个PHP进程在运行中.如果在多个进程的情况下你还是沿用单个进程的处理方法,你一定会碰到问题--著名的并 ...

  3. c#读写共享内存操作函数封装

    原文 c#读写共享内存操作函数封装 c#共享内存操作相对c++共享内存操作来说原理是一样,但是c#会显得有点复杂. 现把昨天封装的读写共享内存封装的函数记录下来,一方面希望给需要这块的有点帮助,另一方 ...

  4. System V 共享内存 和 系列函数

    跟消息队列一样,共享内存也有自己的数据结构,如下: struct shmid_ds { struct ipc_perm shm_perm;    /* Ownership and permission ...

  5. v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...

  6. Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()

    下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...

  7. linux进程间通信-共享内存

    转载:http://www.cnblogs.com/fangshenghui/p/4039720.html 一 共享内存介绍 共享内存可以从字面上去理解,就把一片逻辑内存共享出来,让不同的进程去访问它 ...

  8. 进程间通信IPC:消息队列,信号量,共享内存

    2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...

  9. 共享内存+互斥量实现linux进程间通信 分类: Linux C/C++ 2015-03-26 17:14 67人阅读 评论(0) 收藏

    一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享 ...

随机推荐

  1. 例解 Linux cd 命令

    cd 命令是 *nix 系统中最基本的命令,它所做的事情是改变你当前所在的目录.本文详细介绍该命令,它所能完成的功能以及关于该命令内在的东西. cd 命令:一个内置命令 BASH Shell 是大多 ...

  2. Everything(文件搜索神器)

    前言 Everything官网: http://www.voidtools.com/ 软件版本: V1.3.4.686 (x64) 操作系统: windows 7/10 搜索FTP(内网)资源 比如内 ...

  3. find your present (感叹一下位运算的神奇)

    find your present (2) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  4. Linux文件管理

    虚拟文件系统(VFS)概述: VFS位于文件系统.和访问文件的系统调用(API)之间,为系统调用访问文件系统提供统一的抽象接口. 不同文件系统连接成一个单一树形结构,分别挂载(自己挂载需要用mount ...

  5. [LeetCode] Add and Search Word - Data structure design 添加和查找单词-数据结构设计

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  6. C#计算代码执行时间

    System.Diagnostics.Stopwatch watch = new Stopwatch();watch.Start(); //要计算的操作 DoSomeThing(); watch.St ...

  7. vs2013中2.0类库提示是英文,解决方案

     将C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\zh-Hans下的XML文件复 ...

  8. sql 代码笔记

    1. if() 函数 推荐一个学习MySQL的网站  Study MySql

  9. Tomcat内存溢出的三种情况及解决办法分析

    Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出.造成内存溢出是不一样的,当然处理方式也不一样. 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三种 ...

  10. MSMQ学习

    一.理论准备 MSMQ(MicroSoft Message Queue,微软消息队列)官方的解释是:在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布 ...