posts - 495,comments - 227,trackbacks - 0
          http://blog.chinaunix.net/u1/59687/showart_496412.html

          本文介紹一個共享內存封裝類,使共享內存的使用更簡單化,特別適合更懶的程序員使用:-)

          一、實現目標:簡單化使用共享內存

          二、使用說明

          1. 創建共享內存CSFMServer對象, 需要為CSFMServer對象指定專用的名字,只要
          系統中存在一個這樣的對象,就可以在其他程序中簡單方便地使用該共享內存。
          CSFMServer(char *szFileName, char *szMapName, DWORD dwSize);
          Create(char *szFileName, char *szMapName, DWORD dwSize); 
          參數1:NULL或指定的文件(將創建或打開并讀寫/麻煩)
          參數2:要創建的共享內存對象名
          參數3:要創建的共享內存對象大小

          例如
          m_SFMS.Create(NULL, "_ZZZ_OBJ_", 1);
          2. 本地使用共享內存
          使用 LPVOID GetBuffer() 返回共享內存地址,例如
          char *p = (char*)m_SFMS.GetBuffer();
          if (p)
          strcpy(p, "1234567890");
          3. 創建共享內存CSFMClient對象,也需要為CSFMClient對象指定專用的名字(上一步使用的那個),即可使用共享內存。
          CSFMClient(DWORD dwAccess, char *szMapName);
          Open(DWORD dwAccess, char *szMapName);
          
          參數1:共享內存對象訪問方式(FILE_MAP_READ|FILE_MAP_WRITE)
          參數2:共享內存對象名

          例如:
          CSFMClient *pCSFMC = new CSFMClient(FILE_MAP_READ, "_OBJ_ZZZ_");
          4. 本地使用共享內存
          使用 LPVOID GetBuffer() 返回共享內存地址,例如
          char *p = (char*)pCSFMC->GetBuffer();
          if (p) strcpy(p, "1234567890");
          

          三、該類的具體實現代碼如下:

          //------------------------------------------------
          // 2002/07/05
          // awzzz
          // SFMMem.h: interface for the CSFMServer class.
          //------------------------------------------------
          #if !defined(AFX_SFMSERVER_H__2D76A439_6388_4B07_AE7A_C82F458642ED__INCLUDED_)
          #define AFX_SFMSERVER_H__2D76A439_6388_4B07_AE7A_C82F458642ED__INCLUDED_
          #if _MSC_VER > 1000
          #pragma once
          #endif // _MSC_VER > 1000
          #define DEFAULT_FILENAME NULL
          #define DEFAULT_MAPNAME  "_SFM_OBJ_"
          #define DEFAULT_MAPSIZE  (0xFFFF + 1)
          
          // Shared FileMap Server
          class CSFMServer
          {
          public:
          CSFMServer();
          virtual ~CSFMServer();
          CSFMServer(char *szFileName, char *szMapName, DWORD dwSize);
          protected:
          HANDLE m_hFile;
          HANDLE m_hFileMap;
          LPVOID m_lpFileMapBuffer;
          char *m_pFileName;
          char *m_pMapName;
          DWORD m_dwSize;
          int  m_iCreateFlag;
          private:
          void _Init();
          void _Destory();
          public:
          void Create(char *szFileName, char *szMapName, DWORD dwSize);
          LPVOID GetBuffer();
          DWORD GetSize();
          };
          
          // Shared FileMap Client
          class CSFMClient
          {
          public:
          CSFMClient();
          virtual ~CSFMClient();
          CSFMClient(DWORD dwAccess, char *szMapName);
          protected:
          HANDLE m_hFileMap;
          LPVOID m_lpFileMapBuffer;
          char *m_pMapName;
          int  m_iOpenFlag;
          private:
          void _Init();
          void _Destory();
          public:
          void Open(DWORD dwAccess, char *szMapName);
          LPVOID GetBuffer();
          DWORD GetSize();
          };
          #endif // !defined(AFX_SFMSERVER_H__2D76A439_6388_4B07_AE7A_C82F458642ED__INCLUDED_)
          
          //------------------------------------------------------
          // SFMMem.cpp: implementation of the CSFMServer class.
          //------------------------------------------------------

          #include "stdafx.h"
          #include "SFMMem.h"
          #ifdef _DEBUG
          #undef THIS_FILE
          static char THIS_FILE[]=__FILE__;
          #define new DEBUG_NEW
          #endif
          // Construction/Destruction
          CSFMServer::CSFMServer()
          {
          _Init();
          //
          Create(DEFAULT_FILENAME, DEFAULT_MAPNAME, DEFAULT_MAPSIZE);
          }
          CSFMServer::~CSFMServer()
          {
          _Destory();
          }
          CSFMServer::CSFMServer(char *szFileName, char *szMapName, DWORD dwSize)
          {
          _Init();
          //
          Create(szFileName, szMapName, dwSize);
          }
          void CSFMServer::_Init()
          {
          m_hFile = NULL;
          m_hFileMap = NULL;
          m_lpFileMapBuffer = NULL;
          m_pFileName = NULL;
          m_pMapName = NULL;
          m_dwSize = 0;
          m_iCreateFlag = 0;
          }
          void CSFMServer::_Destory()
          {
          if (m_lpFileMapBuffer)
          {
          UnmapViewOfFile(m_lpFileMapBuffer);
          m_lpFileMapBuffer = NULL;
          }
          if (m_hFileMap)
          {
          CloseHandle(m_hFileMap);
          m_hFileMap = NULL;
          }
          if (m_hFile && m_hFile != INVALID_HANDLE_VALUE)
          {
          CloseHandle(m_hFile);
          m_hFile = NULL;
          }
          if (m_pFileName)
          {
          free(m_pFileName);
          m_pFileName = NULL;
          }
          if (m_pMapName)
          {
          free(m_pMapName);
          m_pMapName = NULL;
          }
          _Init();
          }
          void CSFMServer::Create(char *szFileName, char *szMapName, DWORD dwSize)
          {
          if (m_iCreateFlag)
          _Destory();
          if (szFileName)
          m_pFileName = _strdup(szFileName);
          //else m_pFileName = NULL;
          if (szMapName)
          m_pMapName = _strdup(szMapName);
          else m_pMapName = _strdup(DEFAULT_MAPNAME);
          if (dwSize > 0)
          m_dwSize = dwSize;
          else m_dwSize = DEFAULT_MAPSIZE;
          if (m_pFileName)
          {
          // file
          m_hFile = CreateFile(
          m_pFileName,
          GENERIC_READ|GENERIC_WRITE,
          FILE_SHARE_READ|FILE_SHARE_WRITE,
          NULL,
          OPEN_ALWAYS,//OPEN_EXISTING,
          FILE_ATTRIBUTE_NORMAL,
          NULL
          );
          }
          else
          {
          // system
          m_hFile = (HANDLE)0xFFFFFFFF;
          }
          if (m_hFile)
          {
          m_hFileMap = CreateFileMapping(
          m_hFile,
          NULL,
          PAGE_READWRITE,
          0,
          m_dwSize,
          m_pMapName
          );
          //使只有一個CSFMServer對象能操作內存對象
          //if (m_hFileMap != NULL && ERROR_ALREADY_EXISTS == GetLastError())
          //{
          // CloseHandle(m_hFileMap);
          // m_hFileMap = NULL;
          //}
          }
          if (m_hFileMap)
          {
          m_lpFileMapBuffer = MapViewOfFile(
          m_hFileMap,
          FILE_MAP_ALL_ACCESS,//FILE_MAP_WRITE|FILE_MAP_READ,
          0,
          0,
          m_dwSize
          );
          }
          m_iCreateFlag = 1;
          }
          LPVOID CSFMServer::GetBuffer()
          {
          return (m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL);
          }
          DWORD CSFMServer::GetSize()
          {
          return m_dwSize;
          }
          // Construction/Destruction
          CSFMClient::CSFMClient()
          {
          _Init();
          //
          Open(FILE_MAP_READ, DEFAULT_MAPNAME);
          }
          CSFMClient::~CSFMClient()
          {
          _Destory();
          }
          CSFMClient::CSFMClient(DWORD dwAccess, char *szMapName)
          {
          _Init();
          //
          Open(dwAccess, szMapName);
          }
          void CSFMClient::Open(DWORD dwAccess, char *szMapName)
          {
          if (m_iOpenFlag)
          _Destory();
          if (szMapName)
          m_pMapName = _strdup(szMapName);
          else m_pMapName = _strdup(DEFAULT_MAPNAME);
          m_hFileMap = OpenFileMapping(
          dwAccess,
          TRUE,
          m_pMapName
          );
          if (m_hFileMap)
          {
          m_lpFileMapBuffer = MapViewOfFile(
          m_hFileMap,
          dwAccess,
          0,
          0,
          0
          );
          }
          m_iOpenFlag = 1;
          }
          void CSFMClient::_Init()
          {
          m_hFileMap = NULL;
          m_lpFileMapBuffer = NULL;
          m_pMapName = NULL;
          m_iOpenFlag = 0;
          }
          void CSFMClient::_Destory()
          {
          if (m_lpFileMapBuffer)
          {
          UnmapViewOfFile(m_lpFileMapBuffer);
          m_lpFileMapBuffer = NULL;
          }
          if (m_hFileMap)
          {
          CloseHandle(m_hFileMap);
          m_hFileMap = NULL;
          }
          if (m_pMapName)
          {
          free(m_pMapName);
          m_pMapName = NULL;
          }
          _Init();
          }
          LPVOID CSFMClient::GetBuffer()
          {
          return (m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL);
          }
          DWORD CSFMClient::GetSize()
          {
          // unnable use
          return 0;
          }
          
          測試環境:Win2K+VC6+普通應用程序
          未對服務程序/ISAPI等其他應用進行測試,應該也是可以的
          posted on 2008-05-16 10:36 SIMONE 閱讀(789) 評論(0)  編輯  收藏 所屬分類: C++
          主站蜘蛛池模板: 仁怀市| 隆子县| 饶河县| 临猗县| 富锦市| 德令哈市| 武邑县| 伊川县| 巴马| 安徽省| 宜兰县| 泸州市| 游戏| 诏安县| 资源县| 天祝| 霍林郭勒市| 靖远县| 星子县| 赤壁市| 理塘县| 获嘉县| 惠东县| 远安县| 休宁县| 肥西县| 霸州市| 交口县| 泸水县| 宁陵县| 新巴尔虎左旗| 宁明县| 台前县| 清河县| 韩城市| 桐城市| 武穴市| 民勤县| 巴林右旗| 微山县| 旌德县|