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

来源:互联网 发布:python 迭代器的使用 编辑:程序博客网 时间:2024/06/01 08:07

目录(?)[-]

  1.     服务端实现ShareMemServerh
  2.     服务端实现ShareMemServercpp
  3.     客户端实现ShareMemClienth
  4.     客户端实现ShareMemClientcpp

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

    使用平台:windows

    使用说明:内存共享分为服务端和客户端,服务端写入数据,客户端读取数据,服务端和客户端通过使用相同的名字,来确认配对。

    服务端实现:ShareMemServer.h

[cpp] view plain copy
  1. #pragma once  
  2.   
  3. /************************************************************************************************** 
  4.  
  5. 功能:共享内存服务端 
  6. 作用: 
  7.  
  8. 用法: 
  9. CShareMemServer     m_shareMem; 
  10. void* pShareMem = m_shareMem.GetAddr(); 
  11.  
  12. 共享内存名例子 
  13. #define SHARE_MEM_NAME  ( L"12345578-0B4B-4e9f-AAA4-19D29CC9416A" ) 
  14. #define SHARE_MEM_NAME  ( L"12345578-0B4B-4e9f-AAA4-19D29CC9416A-1" ) 
  15. #define SHARE_MEM_NAME  ( L"12345578-0B4B-4e9f-AAA4-19D29CC9416A-2" ) 
  16. #define SHARE_MEM_NAME  ( L"12345578-0B4B-4e9f-AAA4-19D29CC9416A-3" ) 
  17.  
  18. **************************************************************************************************/  
  19.   
  20. #include <Windows.h>  
  21. #include <string>  
  22. using namespace std;  
  23.   
  24.   
  25. class CShareMemServer  
  26. {  
  27. public:  
  28.     CShareMemServer(int iShareMemSize, wchar_t* pShareMemName);   
  29.     ~CShareMemServer(void);  
  30.   
  31.     void* GetAddr();                                                //获取共享内存地址  
  32.   
  33. private:  
  34.     int         m_iShareMemSize;  
  35.     wstring     m_strShareMemName;  
  36.   
  37.     HANDLE      m_hMapFile;  
  38.     LPVOID      m_lpMapAddress;                                     //共享内存地址  
  39. };  


    服务端实现:ShareMemServer.cpp

[cpp] view plain copy
  1. #include ".\ShareMemServer.h"  
  2.   
  3. CShareMemServer::CShareMemServer(int iShareMemSize, wchar_t* pShareMemName)  
  4. : m_iShareMemSize(iShareMemSize)  
  5. , m_strShareMemName(pShareMemName)  
  6. , m_lpMapAddress(NULL)  
  7. , m_hMapFile(NULL)  
  8. {  
  9. }  
  10.   
  11. CShareMemServer::~CShareMemServer(void)  
  12. {  
  13.     if ( m_lpMapAddress )  
  14.     {  
  15.         UnmapViewOfFile( m_lpMapAddress );  
  16.         m_lpMapAddress = NULL;  
  17.     }  
  18.   
  19.     if ( m_hMapFile )  
  20.     {  
  21.         CloseHandle( m_hMapFile );  
  22.         m_hMapFile = NULL;  
  23.     }  
  24. }  
  25.   
  26. void* CShareMemServer::GetAddr()  
  27. {  
  28.     if ( NULL == m_lpMapAddress )  
  29.     {  
  30.         if ( NULL == m_hMapFile )  
  31.         {  
  32.             m_hMapFile = CreateFileMappingW( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, m_iShareMemSize, m_strShareMemName.c_str() );   
  33.         }  
  34.   
  35.         if (m_hMapFile)  
  36.         {  
  37.             m_lpMapAddress = MapViewOfFile( m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0 );   
  38.         }  
  39.     }  
  40.   
  41.   
  42.     return m_lpMapAddress;  
  43. }  

    客户端实现:ShareMemClient.h

[cpp] view plain copy
  1. #pragma once  
  2.   
  3. /************************************************************************************************** 
  4.  
  5. 功能:共享内存客户端 
  6. 作用: 
  7. 1、获取共享内存地址 
  8.  
  9. 用法: 
  10. CShareMemClient m_VideoData(VIDEO_SOURCE_SHARE_MEM_NAME) 
  11. void* pShareMem = m_VideoData.GetAddr(); 
  12.  
  13. **************************************************************************************************/  
  14.   
  15. #include <Windows.h>  
  16. #include <string>  
  17. using namespace std;  
  18.   
  19. class CShareMemClient  
  20. {  
  21. public:  
  22.     CShareMemClient(wchar_t* pShareMemName);  
  23.     ~CShareMemClient(void);  
  24.   
  25.     void* GetAddr();                                        //获取共享内存地址  
  26.   
  27. private:  
  28.     int         m_iShareMemSize;  
  29.     wstring     m_strShareMemName;  
  30.   
  31.     HANDLE      m_hMapFile;  
  32.     LPVOID      m_lpMapAddress;                             //共享内存地址  
  33. };  


    客户端实现:ShareMemClient.cpp

[cpp] view plain copy
  1. #include ".\ShareMemClient.h"  
  2.   
  3. CShareMemClient::CShareMemClient(wchar_t* pShareMemName)  
  4. : m_strShareMemName(pShareMemName)  
  5. , m_lpMapAddress(NULL)  
  6. , m_hMapFile(NULL)  
  7. {  
  8. }  
  9.   
  10. CShareMemClient::~CShareMemClient(void)  
  11. {  
  12.     if ( m_lpMapAddress )  
  13.     {  
  14.         UnmapViewOfFile( m_lpMapAddress );  
  15.         m_lpMapAddress = NULL;  
  16.     }  
  17.   
  18.     if ( m_hMapFile )  
  19.     {  
  20.         CloseHandle( m_hMapFile );  
  21.         m_hMapFile = NULL;  
  22.     }  
  23. }  
  24.   
  25. void* CShareMemClient::GetAddr()  
  26. {  
  27.     if ( NULL == m_lpMapAddress )  
  28.     {  
  29.         if ( NULL == m_hMapFile )  
  30.         {  
  31.             m_hMapFile = OpenFileMappingW( FILE_MAP_ALL_ACCESS, false, m_strShareMemName.c_str() );  
  32.         }  
  33.   
  34.         if (m_hMapFile)  
  35.         {  
  36.             m_lpMapAddress = MapViewOfFile( m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0 );  
  37.         }  
  38.     }  
  39.   
  40.   
  41.     return m_lpMapAddress;  
  42. }  

资源下载:http://download.csdn.net/detail/shishuo365/4858832


转载请注明来自Master.R(石硕)的CSDN博客:blog.csdn.net/shishuo365  如有疑问请发邮件shishuo365#126.com(将#更换为@)

0 0
原创粉丝点击