VC,MFC,C++内存映射类,使用模板

来源:互联网 发布:数据库建设方案 编辑:程序博客网 时间:2024/06/11 17:43
//头文件#ifndef SN_TEMPLATE_CLASS#define SN_TEMPLATE_CLASS//内存映射类template <class Type_MemoryMap>class SR_DEF_EXPORT_CLASS CMemoryMap{public:CMemoryMap();~CMemoryMap(void);Type_MemoryMap* TemplateMemoryMap();//根据模板类型返回类型指针LPVOIDMemoryMap();//返回映射内存指针BOOLOpenMap(LPCSTR lpcMapName,DWORD dwMapSize);//创建(打开)内存映射(指定映射大小)BOOLOpenMap(LPCSTR lpcMapName);//创建(打开)内存映射(以模板类型大小)voidCloseMap();//关闭内存映射BOOL Lock(DWORD dwTimeout=INFINITE);//进程互斥锁定BOOL UnLock();//进程互斥解锁private:HANDLEm_hMapFile;//内存映射文件句柄Type_MemoryMap*     m_pMemoryMap;//内存指针CMutex*             m_pMutex;//内存互斥对象};template <class Type_MemoryMap>BOOL CMemoryMap<Type_MemoryMap>::UnLock(){return m_pMutex->Unlock();}template <class Type_MemoryMap>BOOL CMemoryMap<Type_MemoryMap>::Lock( DWORD dwTimeout/*=INFINITE*/ ){return m_pMutex->Lock(dwTimeout);}template <class Type_MemoryMap>BOOL CMemoryMap<Type_MemoryMap>::OpenMap( LPCSTR lpcMapName ){return OpenMap(lpcMapName,sizeof(Type_MemoryMap));}template <class Type_MemoryMap>LPVOID CMemoryMap<Type_MemoryMap>::MemoryMap(){return (LPVOID)m_pMemoryMap;}template <class Type_MemoryMap>CMemoryMap<Type_MemoryMap>::~CMemoryMap( void ){CloseMap();}template <class Type_MemoryMap>CMemoryMap<Type_MemoryMap>::CMemoryMap(){m_hMapFile=NULL;m_pMemoryMap=NULL;m_pMutex=NULL;}template <class Type_MemoryMap>Type_MemoryMap* CMemoryMap<Type_MemoryMap>::TemplateMemoryMap(){return m_pMemoryMap;}template <class Type_MemoryMap>BOOL CMemoryMap<Type_MemoryMap>::OpenMap( LPCSTR lpcMapName,DWORD dwMapSize){CHAR szTmpName[128]={0};sprintf(szTmpName,"SilenceRet-Map:%s",lpcMapName);//打开(创建)内存文件映射句柄m_hMapFile=OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE,szTmpName);if(!m_hMapFile){m_hMapFile=::CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, dwMapSize,szTmpName);if(!m_hMapFile){CloseMap();return FALSE;}}//映射内存文件m_pMemoryMap=(Type_MemoryMap *)::MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);if(!m_pMemoryMap){CloseMap();return FALSE;}//创建互斥对象sprintf(szTmpName,"SilenceRet-Mutex:%s",lpcMapName);m_pMutex=new CMutex(FALSE,szTmpName);return TRUE;}template <class Type_MemoryMap>void CMemoryMap<Type_MemoryMap>::CloseMap(){if (m_pMemoryMap){::UnmapViewOfFile(m_pMemoryMap);m_pMemoryMap=NULL;}if (m_hMapFile){::CloseHandle(m_hMapFile);m_hMapFile=NULL;}if (m_pMutex){delete m_pMutex;m_pMutex=NULL;}}#endif

            //使用方法struct tagTestMemoryMap{int x;int y;};CMemoryMap<tagTestMemoryMap> map;            map.OpenMap("映射名");map.Lock();//锁定map.TemplateMemoryMap()->x=1;map.UnLock();//解锁


原创粉丝点击