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


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

    ^_^

    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_FILE
    static 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);
    }

  • 相关阅读:
    Java理论-Java高级
    Java理论-Java基础
    Java理论-JVM
    Nginx的使用总结
    修改tomcat端口号
    测试目录
    常用的设计模式汇总,超详细!
    Java高级程序员(5年左右)面试的题目集
    集合类--最详细的面试宝典--看这篇就够用了(java 1.8)
    Java面试宝典(2020版)
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314619.html
Copyright © 2020-2023  润新知