winodws平台C++共享内存实现
工作中用到本地程序与浏览器插件之间共享数据的需求,因此想到了使用内存共享的方法。
使用平台:windows
使用说明:内存共享分为服务端和客户端,服务端写入数据,客户端读取数据,服务端和客户端通过使用相同的名字,来确认配对。
服务端实现:ShareMemServer.h
#pragma once /************************************************************************************************** 功能:共享内存服务端 作用: 用法: CShareMemServer m_shareMem; void* pShareMem = m_shareMem.GetAddr(); 共享内存名例子 #define SHARE_MEM_NAME ( L"12345578-0B4B-4e9f-AAA4-19D29CC9416A" ) #define SHARE_MEM_NAME ( L"12345578-0B4B-4e9f-AAA4-19D29CC9416A-1" ) #define SHARE_MEM_NAME ( L"12345578-0B4B-4e9f-AAA4-19D29CC9416A-2" ) #define SHARE_MEM_NAME ( L"12345578-0B4B-4e9f-AAA4-19D29CC9416A-3" ) **************************************************************************************************/ #include <Windows.h> #include <string> using namespace std; class CShareMemServer { public: CShareMemServer(int iShareMemSize, wchar_t* pShareMemName); ~CShareMemServer(void); void* GetAddr(); //获取共享内存地址 private: int m_iShareMemSize; wstring m_strShareMemName; HANDLE m_hMapFile; LPVOID m_lpMapAddress; //共享内存地址 };
服务端实现:ShareMemServer.cpp
#include ".ShareMemServer.h" CShareMemServer::CShareMemServer(int iShareMemSize, wchar_t* pShareMemName) : m_iShareMemSize(iShareMemSize) , m_strShareMemName(pShareMemName) , m_lpMapAddress(NULL) , m_hMapFile(NULL) { } CShareMemServer::~CShareMemServer(void) { if ( m_lpMapAddress ) { UnmapViewOfFile( m_lpMapAddress ); m_lpMapAddress = NULL; } if ( m_hMapFile ) { CloseHandle( m_hMapFile ); m_hMapFile = NULL; } } void* CShareMemServer::GetAddr() { if ( NULL == m_lpMapAddress ) { if ( NULL == m_hMapFile ) { m_hMapFile = CreateFileMappingW( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, m_iShareMemSize, m_strShareMemName.c_str() ); } if (m_hMapFile) { m_lpMapAddress = MapViewOfFile( m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0 ); } } return m_lpMapAddress; }
客户端实现:ShareMemClient.h
#pragma once /************************************************************************************************** 功能:共享内存客户端 作用: 1、获取共享内存地址 用法: CShareMemClient m_VideoData(VIDEO_SOURCE_SHARE_MEM_NAME) void* pShareMem = m_VideoData.GetAddr(); **************************************************************************************************/ #include <Windows.h> #include <string> using namespace std; class CShareMemClient { public: CShareMemClient(wchar_t* pShareMemName); ~CShareMemClient(void); void* GetAddr(); //获取共享内存地址 private: int m_iShareMemSize; wstring m_strShareMemName; HANDLE m_hMapFile; LPVOID m_lpMapAddress; //共享内存地址 };
客户端实现:ShareMemClient.cpp
#include ".ShareMemClient.h" CShareMemClient::CShareMemClient(wchar_t* pShareMemName) : m_strShareMemName(pShareMemName) , m_lpMapAddress(NULL) , m_hMapFile(NULL) { } CShareMemClient::~CShareMemClient(void) { if ( m_lpMapAddress ) { UnmapViewOfFile( m_lpMapAddress ); m_lpMapAddress = NULL; } if ( m_hMapFile ) { CloseHandle( m_hMapFile ); m_hMapFile = NULL; } } void* CShareMemClient::GetAddr() { if ( NULL == m_lpMapAddress ) { if ( NULL == m_hMapFile ) { m_hMapFile = OpenFileMappingW( FILE_MAP_ALL_ACCESS, false, m_strShareMemName.c_str() ); } if (m_hMapFile) { m_lpMapAddress = MapViewOfFile( m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0 ); } } return m_lpMapAddress; }
资源下载:http://download.csdn.net/detail/shishuo365/4858832
工具推荐
1.软件开发必备翻墙代理,低延迟(50ms),月费10元,详询(宝哥儿QQ1066690060)请自觉遵守国家法律法规
转载请注明来自Master.R(石硕)的CSDN博客:blog.csdn.net/shishuo365 如有疑问请发邮件shishuo365#126.com(将#更换为@)
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。