1 #pragma once
2 #include <string>
3 #include <wtypes.h>
4 #include <map>
5
6 using namespace std;
7
8 #define MEMORYSIZE 102400000 //每块内存的大小
9
10 struct MemoryAddr{
11 string StrName;
12 LPVOID pBuffer;
13 HANDLE m_Handle;
14 };
15
16 class SharedMemory
17 {
18 public:
19 SharedMemory(void);
20 ~SharedMemory(void);
21 public:
22 string strMapName; // 内存映射对象名称
23 string strComData; // 共享内存中的数据
24 int MemoeryNum; //开辟内存数
25
26 map<int,MemoryAddr>MemoryInfo;
27
28 LPVOID Init(string MeName);
29 void IntPutData(string MeName,string str);
30 string OutPutData(string MeName);
31 string GetAllData();
32 };
1 #include "StdAfx.h"
2 #include "SharedMemory.h"
3
4
5 SharedMemory::SharedMemory(void)
6 {
7 MemoeryNum=0;
8 }
9
10 SharedMemory::~SharedMemory(void)
11 {
12 map<int,MemoryAddr>::iterator it;
13
14 for (it=MemoryInfo.begin();it!=MemoryInfo.end();it++)
15 {
16 ::UnmapViewOfFile(it->second.pBuffer);
17 ::CloseHandle(it->second.m_Handle);
18 }
19
20 MemoryInfo.clear();
21 }
22
23 LPVOID SharedMemory::Init( string MeName)
24 {
25 MemoryAddr mMemoryAddr;
26 LPVOID pBuffer;
27 // 首先试图打开一个命名的内存映射文件对象
28 HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, MeName.c_str());
29
30 if (NULL == hMap)
31 { // 打开失败,创建之
32 hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,MEMORYSIZE,MeName.c_str());
33 // 映射对象的一个视图,得到指向共享内存的指针,设置里面的数据
34 pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
35 }
36 else
37 { // 打开成功,映射对象的一个视图,得到指向共享内存的指针,显示出里面的数据
38 pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
39 }
40
41 mMemoryAddr.StrName=MeName.c_str();
42 mMemoryAddr.pBuffer=pBuffer;
43 mMemoryAddr.m_Handle=hMap;
44
45 MemoryInfo.insert(pair<int,MemoryAddr>(MemoeryNum,mMemoryAddr));
46
47 MemoeryNum++;
48
49 return pBuffer;
50 }
51
52 void SharedMemory::IntPutData(string MeName, string str )
53 {
54 map<int,MemoryAddr>::iterator itr;
55 for (itr=MemoryInfo.begin();itr!=MemoryInfo.end();itr++)
56 {
57 if (MeName==itr->second.StrName)
58 {
59 strcpy((char*)itr->second.pBuffer, str.c_str());
60 }
61 }
62 }
63
64 std::string SharedMemory::OutPutData(string MeName)
65 {
66 map<int,MemoryAddr>::iterator iter;
67
68 for (iter=MemoryInfo.begin();iter!=MemoryInfo.end();iter++)
69 {
70 if (iter->second.StrName==MeName)
71 {
72 return (char*)iter->second.pBuffer;
73 }
74 }
75 }
76
77 std::string SharedMemory::GetAllData()
78 {
79 string str="";
80 map<int,MemoryAddr>::iterator ir;
81 for (ir=MemoryInfo.begin();ir!=MemoryInfo.end();ir++)
82 {
83 string strTemp="";
84 strTemp.append(ir->second.StrName);
85 strTemp.append(":");
86 strTemp.append((char*)ir->second.pBuffer);
87 str.append(strTemp.c_str());
88 str.append(",");
89 }
90 return str;
91 }
原文链接: https://www.cnblogs.com/xuandi/p/5673917.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/237070
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!