牛骨文教育服务平台(让学习变的简单)
博文笔记

winodws平台C++共享内存实现

创建时间:2012-10-26 投稿人: 浏览次数:3431

    工作中用到本地程序与浏览器插件之间共享数据的需求,因此想到了使用内存共享的方法。

    使用平台: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(将#更换为@)

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。