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

进程间通信_共享内存类_C++实现

创建时间:2014-04-24 投稿人: 浏览次数:8582

本文转自:http://blog.csdn.net/fengrx/article/details/4069088

忘记是从哪里整理的一个类了,但非常好用,可以将其放在自己的项目中实现不同进程间数据的通信。

 

头文件:

[cpp] view plaincopy
  1. /****************************************************************** 
  2. ++  File Name :   FFMClass.h 
  3. ++  Description: 共享內存類 
  4. --------------------------------------------------------------- 
  5. ++  Author:  Fei ZhaoDong 
  6. ++  Create time: 2004/3/25 上午 10:00:00 
  7. ++  Version:     1.1 
  8. ++  Modifier:   
  9. ++  Activities:     
  10. ++  Update List: 2004/3/30 下午 02:59:45 
  11. *******************************************************************/  
  12. // FFMClass.h: interface for the CFFMClass.  
  13. //  
  14. //////////////////////////////////////////////////////////////////////  
  15. #ifndef FZD_FFMCLASS_H  
  16. #define FZD_FFMCLASS_H  
  17. //#include <Winbase.h>  
  18. #include <aclapi.h>  
  19.   
  20. //////////////////////////////////////////////////////////////////////  
  21. // Macro definition  
  22. // 以下為共享內存定義  
  23. #define DEFAULT_FILENAME NULL    // 默認的文件名  
  24. #define DEFAULT_MAPNAME  "Local//_FZD_MAP_"   // 默認的共享內存名  
  25. #define DEFAULT_MAPSIZE  (0xFFFF + 1)  // 默認的共享內存大小  
  26. const DWORD NETRGUSER_CFM_CODE = 0x1211DBFF; // 校驗碼, 用於命令數據  
  27. const DWORD NETRGUSER_CMD_NONE = 0;   // 初始化指令碼, 無指令  
  28. // 以下為錯誤碼定義  
  29. #define ERROR_LEN    256    // 錯誤描述長度  
  30. #define ERROR_INVALID_CMDCODE 0xE00001FF  // 已經存在完全一樣的共享內存  
  31. #define ERROR_NO_MAPFILE             0xE00002FF  // 未分配共享內存文件  
  32. #define ERROR_INVALID_CFMCODE 0xE00003FF  // 校驗碼不匹配  
  33. //////////////////////////////////////////////////////////////////////  
  34. // 內存文件格式定義  
  35. #pragma pack(1)  
  36. // 用於存儲命令數據的內存文件格式  
  37. typedef struct _tagDATA_HEADER  
  38. {  
  39.     DWORD dwConfirmCode; // 校驗碼  
  40.     DWORD nCommandCode;  // 指令識別碼  
  41.     DWORD dwDataSize;  // 數據的大小  
  42.     BYTE  dwReserved[19]; // 保留  
  43.     BYTE  bInfo[1];   // 數據起始地址  
  44.     _tagDATA_HEADER()  
  45.     {  
  46.         dwConfirmCode = NETRGUSER_CFM_CODE;  
  47.         nCommandCode = NETRGUSER_CMD_NONE;  
  48.         dwDataSize = 0;  
  49.         ZeroMemory(dwReserved, 19);  
  50.         ZeroMemory(bInfo, 1);  
  51.     }  
  52. }DATA_HEADER, *LPDATA_HEADER;  
  53. typedef DWORD (WINAPI *PSetEntriesInAcl)(ULONG, PEXPLICIT_ACCESS, PACL, PACL*);  
  54. // 用於存儲應答數據的共享內存文件格式 (暫不用)  
  55. typedef struct _tagANS_HEADER  
  56. {  
  57. }ANS_HEADER, *LPANS_HEADER;  
  58.   
  59. #pragma pack()  
  60.   
  61. //////////////////////////////////////////////////////////////////////  
  62. // 類定義,共享內存服務端  
  63. class CFFMServer    
  64. {  
  65. public:  
  66.     CFFMServer();  
  67.     virtual ~CFFMServer();  
  68.     CFFMServer(char *szFileName, char *szMapName, DWORD dwSize);  
  69. protected:  
  70.     PSetEntriesInAcl m_fnpSetEntriesInAcl;  
  71.     HANDLE m_hFile;   // 映射文件句柄  
  72.     HANDLE m_hFileMap;   // 內存文件句柄  
  73.     LPVOID m_lpFileMapBuffer; // 緩衝區指針  
  74.     char *m_pFileName;  // 映射文件名  
  75.     char *m_pMapName;  // 內存文件名  
  76.     DWORD m_dwSize;   // 緩衝區大小  
  77.     BOOL m_bCreateFlag;  // 是否已創建共享內存  
  78.     DWORD   m_dwLastError;  // 錯誤代碼  
  79. private:  
  80.     void _Init();    // 初始化參數  
  81.     BOOL _IsWinNTLater();  // 判斷當前操作系統  
  82. public:  
  83.     BOOL Create(char *szFileName = DEFAULT_FILENAME,  
  84.         char *szMapName = DEFAULT_MAPNAME,  
  85.         DWORD dwSize = DEFAULT_MAPSIZE); // 新建共享內存  
  86.     LPVOID GetBuffer();      // 獲取內存文件指針  
  87.     DWORD GetSize();      // 獲取內存文件大小  
  88.     void Destory();       // 銷毀已有的共享內存  
  89.     BOOL WriteCmdData(      // 寫入命令數據  
  90.         DWORD nCommandCode,  
  91.         DWORD dwDataSize,  
  92.         const LPVOID pBuf);  
  93. };  
  94. //////////////////////////////////////////////////////////////////////  
  95. // 類定義,共享內存客戶端  
  96. class CFFMClient    
  97. {  
  98. public:  
  99.     CFFMClient();  
  100.     virtual ~CFFMClient();  
  101.     CFFMClient(DWORD dwAccess, char *szMapName, DWORD dwSize);  
  102. protected:  
  103.     HANDLE m_hFileMap;   // 內存文件句柄  
  104.     LPVOID m_lpFileMapBuffer; // 內存文件指針  
  105.     char *m_pMapName;  // 內存文件名  
  106.     DWORD m_dwSize;   // 緩衝區大小  
  107.     BOOL m_bOpenFlag;  // 是否已經打開了一個內存文件  
  108.     DWORD   m_dwLastError;  // 錯誤代碼  
  109. private:  
  110.     void _Init();    // 初始化參數  
  111. public:  
  112.     BOOL Open(DWORD dwAccess = FILE_MAP_READ | FILE_MAP_WRITE,  
  113.         char *szMapName = DEFAULT_MAPNAME,  
  114.         DWORD dwSize = 0);      // 打開一個內存文件  
  115.     LPVOID GetBuffer();       // 獲取當前內存文件的指針  
  116.     void Destory();        // 關閉當前對內存文件的訪問  
  117.     DWORD GetSize();      // 獲取內存文件大小  
  118.     BOOL GetCmdDataSize(DWORD *pDataSize);  // 讀取命令數據大小  
  119.     BOOL ReadCmdData(       // 讀取命令數據  
  120.         DWORD dwCommandCode,  
  121.         DWORD dwBufSize,  
  122.         LPVOID pOutBuf);  
  123.     BOOL WriteCmdData(      // 寫入命令數據  
  124.         DWORD memSize,   
  125.         DWORD nCommandCode,  
  126.         DWORD dwDataSize,  
  127.         const LPVOID pBuf);  
  128. };  
  129. #endif // FZD_FFMCLASS_H  

实现文件:

[cpp] view plaincopy
  1. /****************************************************************** 
  2. ++  File Name : FFMClass.cpp 
  3. ++  Description: 共享內存類 
  4. --------------------------------------------------------------- 
  5. ++  Author:  Fei ZhaoDong 
  6. ++  Create time: 2004/3/25 上午 10:00:00 
  7. ++  Version:     1.0 
  8. ++  Modifier:   
  9. ++   Activities:     
  10. ++  Update List: 2004/3/29 下午 02:59:45 
  11. *******************************************************************/  
  12. // FFMClass.cpp: implementation of the CFFMClass.  
  13. //  
  14. //////////////////////////////////////////////////////////////////////  
  15. #include "stdafx.h"  
  16. #include "FFMClass.h"  
  17. //#include <aclapi.h>  
  18. //#include <windows.h>  
  19. //#include <aclapi.h>  
  20. //#include <lmerr.h>  
  21. //  
  22. //#include <stdio.h>  
  23. //////////////////////////////////////////////////////////////////////  
  24. // CFFMServer  
  25. //////////////////////////////////////////////////////////////////////  
  26. CFFMServer::CFFMServer()  
  27. {  
  28.     m_dwLastError = 0;  
  29.     m_fnpSetEntriesInAcl = NULL;  
  30.     _Init();  
  31. }  
  32. CFFMServer::~CFFMServer()  
  33. {  
  34.     Destory();  
  35. }  
  36. CFFMServer::CFFMServer(char *szFileName, char *szMapName, DWORD dwSize)  
  37. {  
  38.     // 以自定義設置創建共享內存塊  
  39.     _Init();  
  40.     Create(szFileName, szMapName, dwSize);  
  41. }  
  42. // 初始化各個參數  
  43. void CFFMServer::_Init()  
  44. {  
  45.     m_hFile = NULL;  
  46.     m_hFileMap = NULL;  
  47.     m_lpFileMapBuffer = NULL;  
  48.     m_pFileName = NULL;  
  49.     m_pMapName = NULL;  
  50.     m_dwSize = 0;  
  51.     m_bCreateFlag = FALSE;  
  52. }  
  53. // 判斷是否NT4.0以上操作系統  
  54. BOOL CFFMServer::_IsWinNTLater()  
  55. {  
  56.     OSVERSIONINFO Ver;  
  57.     BOOL bAbleVersion = FALSE;  
  58.     Ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);  
  59.     if (GetVersionEx(&Ver))  
  60.     {  
  61.         if (Ver.dwPlatformId == VER_PLATFORM_WIN32_NT  
  62.             && Ver.dwMajorVersion >= 4)  
  63.         {  
  64.             bAbleVersion = TRUE;  
  65.   
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。