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(将#更换为@)
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了
