工作中用到本地程序與瀏覽器插件之間共享數據的需求,因此想到了使用內存共享的方法。
使用平臺: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
轉載請註明來自Master.R(石碩)的CSDN博客:blog.csdn.net/shishuo365 如有疑問請發郵件shishuo365#126.com(將#更換爲@)