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

来源:互联网 发布:沭阳美工招聘信息 编辑:程序博客网 时间:2024/04/30 01:06

转载:http://blog.csdn.net/hzqhbc/article/details/24408399

本文转自: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.         }  
  66.     }  
  67.     else  
  68.     {  
  69.         m_dwLastError = GetLastError();  
  70.     }  
  71.     return bAbleVersion;  
  72. }  
  73. // 釋放當前共享內存,並重新初始化參數  
  74. void CFFMServer::Destory()  
  75. {  
  76.     if (m_lpFileMapBuffer != NULL)  
  77.     {  
  78.         UnmapViewOfFile(m_lpFileMapBuffer);  
  79.         m_lpFileMapBuffer = NULL;  
  80.     }  
  81.     if (m_hFileMap != NULL)  
  82.     {  
  83.         CloseHandle(m_hFileMap);  
  84.         m_hFileMap = NULL;  
  85.     }  
  86.     if (m_hFile && m_hFile != INVALID_HANDLE_VALUE)  
  87.     {  
  88.         CloseHandle(m_hFile);  
  89.         m_hFile = NULL;  
  90.     }  
  91.     if (m_pFileName != NULL)  
  92.     {  
  93.         free(m_pFileName);  
  94.         m_pFileName = NULL;  
  95.     }  
  96.     if (m_pMapName != NULL)  
  97.     {  
  98.         free(m_pMapName);  
  99.         m_pMapName = NULL;  
  100.     }  
  101.     _Init();  
  102. }  
  103. static void FreeSidEx(PSID oSID)  
  104. {  
  105.     try  
  106.     {  
  107.         FreeSid(oSID);  
  108.     }  
  109.     catch(...)  
  110.     {  
  111.     }  
  112. }  
  113. // 創建共享內存塊  
  114. BOOL CFFMServer::Create(char *szFileName, char *szMapName, DWORD dwSize)  
  115. {  
  116.     // 釋放已有的共享內存塊  
  117.     if (m_bCreateFlag)  
  118.     {  
  119.         Destory();  
  120.     }  
  121.     // 拷貝各個參數  
  122.     if (szFileName)  
  123.     {  
  124.         m_pFileName = _strdup(szFileName);  
  125.     }  
  126.     if (szMapName)  
  127.     {  
  128.         m_pMapName = _strdup(szMapName);  
  129.     }  
  130.     else  
  131.     {  
  132.         m_pMapName = _strdup(DEFAULT_MAPNAME);  
  133.     }  
  134.     if (dwSize > 0)  
  135.     {  
  136.         m_dwSize = dwSize;  
  137.     }  
  138.     else  
  139.     {  
  140.         m_dwSize = DEFAULT_MAPSIZE;  
  141.     }  
  142.     // 以下創建共享內存  
  143.     if (m_pFileName)  
  144.     {  
  145.         m_hFile = CreateFile(  
  146.             m_pFileName,  
  147.             GENERIC_READ|GENERIC_WRITE,  
  148.             FILE_SHARE_READ|FILE_SHARE_WRITE,  
  149.             NULL,  
  150.             OPEN_ALWAYS,  
  151.             FILE_ATTRIBUTE_NORMAL,  
  152.             NULL  
  153.             );  
  154.     }  
  155.     else  
  156.     {  
  157.         // 默認情況下,在頁面文件中創建共享內存  
  158.         m_hFile = INVALID_HANDLE_VALUE;  
  159.     }  
  160.     if (_IsWinNTLater())  
  161.     {  
  162.         // Set DACL  
  163.         const int NUM_ACES = 2;   // number if ACEs int DACL  
  164.         // evryone -- read  
  165.         // creator -- full access  
  166.         // 初始化參數  
  167.         PSID pEveryoneSID        = NULL; // everyone群組SID  
  168.         PSID pCreatorSID   = NULL; // creator群組SID  
  169.         PACL pFileMapACL         = NULL; // 準備新內存文件的DACL  
  170.         PSECURITY_DESCRIPTOR  pSD = NULL; // 內存文件的SD  
  171.         SECURITY_ATTRIBUTES   saFileMap; // 內存文件的SA  
  172.         EXPLICIT_ACCESS    ea[NUM_ACES]; // 外部訪問結構   
  173.         BOOL bHasErr   = FALSE; // 返回值  
  174.         // 以下創建SID  
  175.         SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;  
  176.         SID_IDENTIFIER_AUTHORITY SIDAuthCreator = SECURITY_CREATOR_SID_AUTHORITY;  
  177.         // Evryone  
  178.         if (!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID,  
  179.             0, 0, 0, 0, 0, 0, 0, &pEveryoneSID))  
  180.         {  
  181.             bHasErr = TRUE;  
  182.             goto Finish;  
  183.         }  
  184.         // Creator  
  185.         if (!AllocateAndInitializeSid(&SIDAuthCreator, 1, SECURITY_CREATOR_OWNER_RID,  
  186.             0, 0, 0, 0, 0, 0, 0, &pCreatorSID))  
  187.         {  
  188.             bHasErr = TRUE;  
  189.             goto Finish;  
  190.         }  
  191.         // 填充ACE  
  192.         ZeroMemory(&ea, NUM_ACES * sizeof(EXPLICIT_ACCESS));  
  193.         // S-1-1-0 evryone, 唯讀權限  
  194.         ea[0].grfAccessPermissions = GENERIC_READ | GENERIC_WRITE;  
  195.         ea[0].grfAccessMode = SET_ACCESS;  
  196.         ea[0].grfInheritance= NO_INHERITANCE;  
  197.         ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;  
  198.         ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;  
  199.         ea[0].Trustee.ptstrName  = (LPTSTR) pEveryoneSID;  
  200.         // S-1-3-0 creator owner, 完全權限  
  201.         ea[1].grfAccessPermissions = STANDARD_RIGHTS_ALL;  
  202.         ea[1].grfAccessMode = SET_ACCESS;  
  203.         ea[1].grfInheritance= NO_INHERITANCE;  
  204.         ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;  
  205.         ea[1].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;  
  206.         ea[1].Trustee.ptstrName  = (LPTSTR) pCreatorSID;  
  207.         // 創建並填充ACL  
  208.         if(NULL == m_fnpSetEntriesInAcl)  
  209.         {  
  210.             HINSTANCE hLib = ::LoadLibrary("Advapi32.dll");  
  211.             if(NULL != hLib)  
  212.             {  
  213.                 m_fnpSetEntriesInAcl = (PSetEntriesInAcl)GetProcAddress(hLib,"SetEntriesInAclA");  
  214.                 ::FreeLibrary(hLib);  
  215.                 hLib = NULL;  
  216.             }  
  217.         }  
  218.         if (ERROR_SUCCESS != m_fnpSetEntriesInAcl(NUM_ACES, ea, NULL, &pFileMapACL))  
  219.         {  
  220.             bHasErr = TRUE;  
  221.             goto Finish;  
  222.         }  
  223.         // 創建並初始化SD  
  224.         pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);   
  225.         if (NULL == pSD)  
  226.         {  
  227.             bHasErr = TRUE;  
  228.             goto Finish;  
  229.         }   
  230.         if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))   
  231.         {  
  232.             bHasErr = TRUE;  
  233.             goto Finish;  
  234.         }  
  235.         // 添加ACL到SD中去  
  236.         if (!SetSecurityDescriptorDacl(pSD,  
  237.             TRUE,     // fDaclPresent flag     
  238.             pFileMapACL,   
  239.             FALSE))   // not a default DACL   
  240.         {  
  241.             bHasErr = TRUE;  
  242.             goto Finish;  
  243.         }  
  244.         // 設置SA  
  245.         saFileMap.nLength = sizeof(SECURITY_ATTRIBUTES);  
  246.         saFileMap.bInheritHandle = FALSE;  
  247.         saFileMap.lpSecurityDescriptor = pSD;  
  248.         // 創建共享內存文件  
  249.         if (m_hFile != NULL)  
  250.         {  
  251.             m_hFileMap = CreateFileMapping(  
  252.                 m_hFile,  
  253.                 &saFileMap,  
  254.                 PAGE_READWRITE,  
  255.                 0,  
  256.                 m_dwSize,  
  257.                 m_pMapName);  
  258.             if (NULL == m_hFileMap)  
  259.             {  
  260.                 m_hFileMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,  
  261.                     TRUE, m_pMapName);  
  262.                 if (NULL == m_hFileMap)  
  263.                 {  
  264.                     m_dwLastError = GetLastError();   
  265.                     Destory();  
  266.                     goto Finish;  
  267.                 }  
  268.             }  
  269.         }  
  270. Finish:  
  271.         //if (pSD != NULL)  
  272.         //{  
  273.         //  LocalFree(pSD);  
  274.         //}       
  275.         pSD = NULL;  
  276.         if (pFileMapACL != NULL)  
  277.         {  
  278.             LocalFree(pFileMapACL);  
  279.             pFileMapACL = NULL;  
  280.         }  
  281.         if (pEveryoneSID != NULL)  
  282.         {  
  283.             FreeSidEx(pEveryoneSID);  
  284.             pEveryoneSID = NULL;  
  285.         }  
  286.         if (pCreatorSID != NULL)  
  287.         {  
  288.             FreeSidEx(pCreatorSID);  
  289.             pCreatorSID = NULL;  
  290.         }  
  291.         if (bHasErr)   
  292.         {  
  293.             m_dwLastError = GetLastError();  
  294.             return FALSE;  
  295.         }  
  296.     }  
  297.     else  
  298.     {  
  299.         // 創建共享內存文件  
  300.         if (m_hFile)  
  301.         {  
  302.             m_hFileMap = CreateFileMapping(  
  303.                 m_hFile,  
  304.                 NULL,  
  305.                 PAGE_READWRITE,  
  306.                 0,  
  307.                 m_dwSize,  
  308.                 m_pMapName);  
  309.             if (NULL == m_hFileMap)  
  310.             {  
  311.                 m_dwLastError = GetLastError();  
  312.                 Destory();  
  313.                 return FALSE;  
  314.             }  
  315.         }  
  316.     }  
  317.     // 映射文件指針到用戶  
  318.     if (m_hFileMap)  
  319.     {  
  320.         m_lpFileMapBuffer = MapViewOfFile(  
  321.             m_hFileMap,  
  322.             FILE_MAP_ALL_ACCESS,  
  323.             0,  
  324.             0,  
  325.             m_dwSize);  
  326.         if (NULL == m_lpFileMapBuffer)  
  327.         {  
  328.             m_dwLastError = GetLastError();  
  329.             Destory();  
  330.             return FALSE;  
  331.         }  
  332.     }  
  333.     m_bCreateFlag = TRUE;  
  334.     return TRUE;  
  335. }  
  336. // 獲取內存文件指針  
  337. LPVOID CFFMServer::GetBuffer()  
  338. {  
  339.     return (m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL);  
  340. }  
  341. // 獲取內存文件大小  
  342. DWORD CFFMServer::GetSize()  
  343. {  
  344.     return m_dwSize;  
  345. }  
  346. BOOL CFFMServer::WriteCmdData(DWORD nCommandCode, DWORD dwDataSize, const LPVOID pBuf)  
  347. {  
  348.     // 檢驗數據的合理性  
  349.     if (NULL == GetBuffer())  
  350.     {  
  351.         m_dwLastError = ERROR_NO_MAPFILE;  
  352.         SetLastError(ERROR_NO_MAPFILE);  
  353.         return FALSE;  
  354.     }  
  355.     if (NETRGUSER_CMD_NONE == nCommandCode)  
  356.     {  
  357.         m_dwLastError = ERROR_INVALID_CMDCODE;  
  358.         SetLastError(ERROR_INVALID_CMDCODE);  
  359.         return FALSE;  
  360.     }  
  361.     if (dwDataSize > 0 && pBuf == NULL)  
  362.     {  
  363.         m_dwLastError = ERROR_INVALID_USER_BUFFER;  
  364.         SetLastError(ERROR_INVALID_USER_BUFFER);  
  365.         return FALSE;  
  366.     }  
  367.     if (dwDataSize + sizeof(DATA_HEADER) > GetSize())  
  368.     {  
  369.         m_dwLastError = ERROR_BUFFER_OVERFLOW;  
  370.         SetLastError(ERROR_BUFFER_OVERFLOW);  
  371.         return FALSE;  
  372.     }  
  373.     // 填寫數據結構  
  374.     // 文件頭  
  375.     DATA_HEADER dataHeader;  
  376.     dataHeader.nCommandCode = nCommandCode;  
  377.     dataHeader.dwDataSize = dwDataSize;  
  378.     ZeroMemory(GetBuffer(), GetSize());  
  379.     memcpy(GetBuffer(), &dataHeader, sizeof(DATA_HEADER));  
  380.     // 數據塊  
  381.     LPDATA_HEADER pData = (LPDATA_HEADER)GetBuffer();  
  382.     memcpy(pData->bInfo, pBuf, dwDataSize);  
  383.     return TRUE;  
  384. }  
  385. //////////////////////////////////////////////////////////////////////  
  386. // CFFMClient  
  387. //////////////////////////////////////////////////////////////////////  
  388. CFFMClient::CFFMClient()  
  389. {  
  390.     m_dwLastError = 0;  
  391.     _Init();  
  392. }  
  393. CFFMClient::~CFFMClient()  
  394. {  
  395.     Destory();  
  396. }  
  397. CFFMClient::CFFMClient(DWORD dwAccess, char *szMapName, DWORD dwSize)  
  398. {  
  399.     _Init();  
  400.     if (!Open(dwAccess, szMapName, dwSize))  
  401.     {  
  402.         Destory();  
  403.     }  
  404. }  
  405. // 初始化參數  
  406. void CFFMClient::_Init()  
  407. {  
  408.     m_hFileMap = NULL;  
  409.     m_lpFileMapBuffer = NULL;  
  410.     m_pMapName = NULL;  
  411.     m_bOpenFlag = FALSE;  
  412. }  
  413. // 關閉當前對內存文件的訪問  
  414. void CFFMClient::Destory()  
  415. {  
  416.     if (m_lpFileMapBuffer)  
  417.     {  
  418.         UnmapViewOfFile(m_lpFileMapBuffer);  
  419.         m_lpFileMapBuffer = NULL;  
  420.     }  
  421.     if (m_hFileMap)  
  422.     {  
  423.         CloseHandle(m_hFileMap);  
  424.         m_hFileMap = NULL;  
  425.     }  
  426.     if (m_pMapName)  
  427.     {  
  428.         free(m_pMapName);  
  429.         m_pMapName = NULL;  
  430.     }  
  431.     _Init();  
  432. }  
  433. // 打開一個內存文件  
  434. BOOL CFFMClient::Open(DWORD dwAccess, char *szMapName, DWORD dwSize)  
  435. {  
  436.     if (m_bOpenFlag)  
  437.     {  
  438.         Destory();  
  439.     }  
  440.     if (szMapName != NULL)  
  441.     {  
  442.         m_pMapName = _strdup(szMapName);  
  443.     }  
  444.     else  
  445.     {  
  446.         m_pMapName = _strdup(DEFAULT_MAPNAME);  
  447.     }  
  448.     m_hFileMap = OpenFileMapping(dwAccess, TRUE, m_pMapName);  
  449.     if (NULL == m_hFileMap)  
  450.     {  
  451.         m_dwLastError = GetLastError();  
  452.         Destory();  
  453.         return FALSE;  
  454.     }  
  455.     m_lpFileMapBuffer = MapViewOfFile(m_hFileMap, dwAccess, 0, 0, dwSize);  
  456.     if (NULL == m_lpFileMapBuffer)  
  457.     {  
  458.         m_dwLastError = GetLastError();  
  459.         Destory();  
  460.         return FALSE;  
  461.     }  
  462.     m_bOpenFlag = TRUE;  
  463.     return TRUE;  
  464. }  
  465. // 獲取當前內存文件的指針  
  466. LPVOID CFFMClient::GetBuffer()  
  467. {  
  468.     return (m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL);  
  469. }  
  470. // 讀取命令數據大小  
  471. BOOL CFFMClient::GetCmdDataSize(DWORD *pDataSize)  
  472. {  
  473.     _ASSERT(pDataSize != NULL);  
  474.     *pDataSize = 0;  
  475.     LPDATA_HEADER pHeader = (LPDATA_HEADER)GetBuffer();  
  476.     if (NULL == pHeader)  
  477.     {  
  478.         m_dwLastError = ERROR_NO_MAPFILE;  
  479.         SetLastError(ERROR_NO_MAPFILE);  
  480.         return FALSE;  
  481.     }  
  482.     if (NETRGUSER_CFM_CODE != pHeader->dwConfirmCode)  
  483.     {  
  484.         m_dwLastError = ERROR_INVALID_CFMCODE;  
  485.         SetLastError(ERROR_INVALID_CFMCODE);  
  486.         return FALSE;  
  487.     }  
  488.     if (NETRGUSER_CMD_NONE == pHeader->nCommandCode)  
  489.     {  
  490.         m_dwLastError = ERROR_INVALID_CMDCODE;  
  491.         SetLastError(ERROR_INVALID_CMDCODE);  
  492.         return FALSE;  
  493.     }  
  494.     *pDataSize = pHeader->dwDataSize;  
  495.     return TRUE;  
  496. }  
  497. // 讀取命令數據  
  498. BOOL CFFMClient::ReadCmdData(DWORD dwCommandCode, DWORD dwBufSize, LPVOID pOutBuf)  
  499. {  
  500.     _ASSERT (pOutBuf != NULL);  
  501.     LPDATA_HEADER pHeader = (LPDATA_HEADER)GetBuffer();  
  502.     if (NULL == pHeader)  
  503.     {  
  504.         m_dwLastError = ERROR_NO_MAPFILE;  
  505.         SetLastError(ERROR_NO_MAPFILE);  
  506.         return FALSE;  
  507.     }  
  508.     if (NETRGUSER_CFM_CODE != pHeader->dwConfirmCode)  
  509.     {  
  510.         m_dwLastError = ERROR_INVALID_CFMCODE;  
  511.         SetLastError(ERROR_INVALID_CFMCODE);  
  512.         return FALSE;  
  513.     }  
  514.     if (NETRGUSER_CMD_NONE == pHeader->nCommandCode)  
  515.     {  
  516.         m_dwLastError = ERROR_INVALID_CMDCODE;  
  517.         SetLastError(ERROR_INVALID_CMDCODE);  
  518.         return FALSE;  
  519.     }  
  520.     if (pHeader->dwDataSize > dwBufSize)  
  521.     {  
  522.         m_dwLastError = ERROR_BUFFER_OVERFLOW;  
  523.         SetLastError(ERROR_BUFFER_OVERFLOW);  
  524.         return FALSE;  
  525.     }  
  526.     if (pHeader->nCommandCode != dwCommandCode)  
  527.     {  
  528.         m_dwLastError = ERROR_INVALID_CMDCODE;  
  529.         SetLastError(ERROR_INVALID_CMDCODE);  
  530.         return FALSE;  
  531.     }  
  532.     ZeroMemory(pOutBuf, dwBufSize);  
  533.     // 拷貝數據到緩衝區  
  534.     memcpy(pOutBuf, pHeader->bInfo, pHeader->dwDataSize);  
  535.     return TRUE;  
  536. }  
  537. BOOL CFFMClient::WriteCmdData(DWORD memSize, DWORD nCommandCode, DWORD dwDataSize, const LPVOID pBuf)  
  538. {  
  539.     if(!memSize)  
  540.         memSize = DEFAULT_MAPSIZE;    
  541.     m_dwSize = memSize;  
  542.     // 檢驗數據的合理性  
  543.     if (NULL == GetBuffer())  
  544.     {  
  545.         m_dwLastError = ERROR_NO_MAPFILE;  
  546.         SetLastError(ERROR_NO_MAPFILE);  
  547.         return FALSE;  
  548.     }  
  549.     if (NETRGUSER_CMD_NONE == nCommandCode)  
  550.     {  
  551.         m_dwLastError = ERROR_INVALID_CMDCODE;  
  552.         SetLastError(ERROR_INVALID_CMDCODE);  
  553.         return FALSE;  
  554.     }  
  555.     if (dwDataSize > 0 && pBuf == NULL)  
  556.     {  
  557.         m_dwLastError = ERROR_INVALID_USER_BUFFER;  
  558.         SetLastError(ERROR_INVALID_USER_BUFFER);  
  559.         return FALSE;  
  560.     }  
  561.     if (dwDataSize + sizeof(DATA_HEADER) > GetSize())  
  562.     {  
  563.         m_dwLastError = ERROR_BUFFER_OVERFLOW;  
  564.         SetLastError(ERROR_BUFFER_OVERFLOW);  
  565.         return FALSE;  
  566.     }  
  567.     // 填寫數據結構  
  568.     // 文件頭  
  569.     DATA_HEADER dataHeader;  
  570.     dataHeader.nCommandCode = nCommandCode;  
  571.     dataHeader.dwDataSize = dwDataSize;  
  572.     ZeroMemory(GetBuffer(), GetSize());  
  573.     memcpy(GetBuffer(), &dataHeader, sizeof(DATA_HEADER));  
  574.     // 數據塊  
  575.     LPDATA_HEADER pData = (LPDATA_HEADER)GetBuffer();  
  576.     memcpy(pData->bInfo, pBuf, dwDataSize);  
  577.     return TRUE;  
  578. }  
  579. // 獲取內存文件大小  
  580. DWORD CFFMClient::GetSize()  
  581. {  
  582.     return m_dwSize;  
  583. }  

1

0 0
原创粉丝点击