一个操作共享内存的类!可以方面的添加,删除数据,包括各种结构体!

    技术2022-05-11  65

    一个操作共享内存的容器类!可使用各种数据结构!但是没有写进程间通讯的部分!可方便扩充!

    ^_^

    class CShareMem  {public:    CShareMem(LPCTSTR lpcszMemName = _T("ShareMemSection"));    CShareMem(int cCount, size_t cSize, LPCTSTR lpcszMemName = _T("ShareMemSection"));        virtual ~CShareMem();        BOOL InitializeMem(int cCount, size_t cSize );        size_t GetDataSize() {return m_cDataSize;};    int  GetDataCount() {return m_cDataCount;};          BOOL Clear() ;    BOOL Lock(DWORD dwMilliSeconds = INFINITE);    BOOL Unlock();        LPVOID GetData(int nIndex = 0);    BOOL GetData(int nIndex, LPVOID lpvData, size_t cSize);    BOOL AddData(LPVOID lpvData, size_t cSize);    BOOL SetData(int nIndex, LPVOID lpvData, size_t cSize);    BOOL Delete(int nIndex );protected:    LPVOID      m_lpvData;              //数据指针    size_t      m_cDataSize;            //数据元素大小(BYTE)    int         m_cDataCount;           //数据元素个数    BOOL        m_fInit;                //是否初始化成功    HANDLE      m_hMutant;              //互斥量    HANDLE      m_hSharedMemoryFile;    //共享内存核心文件句柄    CString     m_strMutantName;        //互斥量名字    CString     m_strShareMemName;      //共享内存区域名字    BOOL        m_fExist ;              //是否已存在    };

    #endif // !defined// ShareMem.cpp: implementation of the CShareMem class.////

    #include "stdafx.h"#include "ShareMem.h"

    #ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif

    //// Construction/Destruction//

    CShareMem::CShareMem(LPCTSTR lpcszMemName){    m_cDataCount = 0;    m_cDataSize = 0;    m_fInit = FALSE;    m_fExist = FALSE;    m_lpvData = NULL;    m_hSharedMemoryFile = NULL;    //m_strMutantName = L"ShareMemMutant";    //m_strShareMemName = L"ShareMemSection";    m_strShareMemName = lpcszMemName;    m_strMutantName = lpcszMemName + _T("Mutant");}CShareMem::CShareMem(int cCount, size_t cSize, LPCTSTR lpcszMemName){    m_cDataCount = cCount;    m_cDataSize = cSize;    m_fInit = FALSE;    m_lpvData = NULL;    m_hSharedMemoryFile = NULL;    m_fExist = FALSE;    //m_strMutantName = L"ShareMemMutant";    //m_strShareMemName = L"ShareMemSection";    m_strShareMemName = lpcszMemName;    m_strMutantName = lpcszMemName + _T("Mutant");    }

    CShareMem::~CShareMem(){    if (m_fInit) //    {        UnmapViewOfFile(m_lpvData);        CloseHandle(m_hSharedMemoryFile);    }}////  清除所有共享内存区域的数据//BOOL CShareMem::Clear(){    try    {        memset((PBYTE)m_lpvData, 0, m_cDataSize * m_cDataCount);        return TRUE;    }    catch(...)    {        return FALSE;    }}

    ////  取得nIndex位置上的数据指针//LPVOID CShareMem::GetData(int nIndex ){    if (m_fInit)    {        if (nIndex < 0 || nIndex >= m_cDataCount)            return NULL;        return (PBYTE)m_lpvData + nIndex * m_cDataSize;    }    else    {        return NULL;    }}////  取得nIndex位置上的数据//BOOL CShareMem::GetData(int nIndex,LPVOID lpvData,size_t cSize){    if (m_fInit)    {        if (nIndex < 0 || nIndex >= m_cDataCount)            return FALSE;        if (cSize != m_cDataSize )        {            return FALSE;        }        memcpy(lpvData,(PBYTE)m_lpvData + nIndex * m_cDataSize,cSize);        return TRUE;    }    else    {        return FALSE;    }}////  删除 nIndex位置的数据//BOOL CShareMem::Delete(int nIndex){    if (m_fInit)    {        if (nIndex < 0 || nIndex >= m_cDataCount)            return FALSE;        int nLeft = m_cDataCount - nIndex - 1;        PBYTE pbBuff = new BYTE[nLeft * m_cDataSize];        //删除头        if (0== nIndex )         {            memcpy(pbBuff,(PBYTE)m_lpvData + m_cDataSize ,(m_cDataCount -1)*m_cDataSize);            memset(m_lpvData,0,m_cDataCount * m_cDataSize);            memcpy(m_lpvData,pbBuff,(m_cDataCount -1)*m_cDataSize);        }        //删除尾        else if ((m_cDataCount -1) == nIndex )         {            memset((PBYTE)m_lpvData + (nIndex *m_cDataSize),0 ,m_cDataSize);        }        else        {            memcpy(pbBuff,(PBYTE)m_lpvData + (nIndex + 1)*m_cDataSize,nLeft * m_cDataSize);             memset((PBYTE)m_lpvData + (nIndex )*m_cDataSize,0,(m_cDataCount - nIndex) * m_cDataSize);             memcpy((PBYTE)m_lpvData + (nIndex )*m_cDataSize,pbBuff,nLeft *m_cDataSize);        }        delete [] pbBuff;        m_cDataCount --;        return TRUE;    }    else    {        return FALSE;    }}////  添加数据到数据尾//BOOL CShareMem::AddData(LPVOID lpvData,size_t cSize){    try    {        //        if ((m_cDataSize!= 0 && m_cDataSize != cSize))        {            return FALSE;        }        if (!m_fInit)        {            return FALSE;        }        //        //if (m_cDataCount == 0)        memcpy((PBYTE)m_lpvData + (m_cDataCount )*m_cDataSize, lpvData,cSize);        m_cDataCount ++ ;        return TRUE;    }    catch(CMemoryException *memE)    {        memE->ReportError();        memE->Delete();        return FALSE;    }    catch(...)    {        return FALSE;    }}////  设置nIndex位置上的数据//BOOL CShareMem::SetData(int nIndex,LPVOID lpvData,size_t cSize){    if (m_fInit)    {        if (nIndex < 0 || nIndex >= m_cDataCount)            return FALSE;        if (m_cDataSize != cSize)        {            TRACE(_T("数据大小不匹配!!!/n"));            return FALSE;        }        memset((PBYTE)m_lpvData + nIndex * m_cDataSize,0,cSize);        memcpy((PBYTE)m_lpvData + nIndex * m_cDataSize,lpvData,cSize);        return TRUE;    }    else    {        return FALSE;    }}////  初始化 共享内存和各个变量//BOOL CShareMem::InitializeMem(int cCount,size_t cSize){    m_hMutant = CreateMutex(NULL,FALSE,m_strMutantName);    m_cDataSize = cSize;    m_cDataCount = cCount;        //创建一内存映射文件,设定共享内存区域    m_hSharedMemoryFile = ::CreateFileMapping(        (HANDLE)0xFFFFFFFF,  // 文件句柄        NULL,                // 安全属性(WIN95忽略)        PAGE_READWRITE,      // 文件的保护属性        0,                   // 使用页面文件        1<<16,               // 共享内存大小        m_strShareMemName.GetBuffer(0));// 共享内存名称    m_strShareMemName.ReleaseBuffer();    if(m_hSharedMemoryFile == NULL)    {        m_fExist = FALSE;         m_fInit = FALSE;        return FALSE;    }    else    {        if(GetLastError() == ERROR_ALREADY_EXISTS)            m_fExist = TRUE;    }    m_lpvData = ::MapViewOfFile(        m_hSharedMemoryFile,        // 核心对象的文件HANDLE        FILE_MAP_ALL_ACCESS,        // Read/Write        0,                          // 使用页面文件        0,                          // 映射整个共享内存区域        0);                         // 映射整个空间    if(m_lpvData == NULL)    {        m_fInit = FALSE;        CloseHandle(m_hSharedMemoryFile);        return FALSE;    }    else        m_fInit = TRUE;    return TRUE; }////  互斥锁定共享内存//BOOL CShareMem::Lock(DWORD dwMilliSeconds ){    if( WaitForSingleObject(m_hMutant,dwMilliSeconds) == WAIT_OBJECT_0)        return TRUE;    return FALSE;}////  互斥解锁共享内存//BOOL CShareMem::Unlock(){    return ReleaseMutex(m_hMutant);}

     


    最新回复(0)