winodws平臺C++共享內存實現

    工作中用到本地程序與瀏覽器插件之間共享數據的需求,因此想到了使用內存共享的方法。

    使用平臺: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(將#更換爲@)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章