C++共享内存类

来源:互联网 发布:高考状元辱骂同胞知乎 编辑:程序博客网 时间:2024/05/22 15:59
// 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     "TestShareMemory"#define DEFAULT_MAPSIZE     (0x0FFF + 1) // Shared FileMap Server// 使用说明// 1.// 创建CSFMServer对象// CSFMServer(char *szFileName, char *szMapName, DWORD dwSize);// Create(char *szFileName, char *szMapName, DWORD dwSize);// 参数1:NULL或指定的文件(将创建或打开并读写/麻烦)// 参数2:要创建的共享内存对象名// 参数3:要创建的共享内存对象大小// 2.// 本地使用内存// LPVOID GetBuffer()// 返回共享内存地址//// 自动销毁class CSFMServer      {    public:        CSFMServer();        virtual ~CSFMServer();        CSFMServer(char *szFileName, char *szMapName, DWORD dwSize);        HANDLE  m_hMutex;    protected:        HANDLE  m_hFile;        HANDLE  m_hFileMap;        LPVOID  m_lpFileMapBuffer;        string  m_strMutexName;         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// 使用说明// 1.// 创建CSFMClient对象// CSFMClient(DWORD dwAccess, char *szMapName);// Open(DWORD dwAccess, char *szMapName);// 参数1:共享内存对象访问方式(FILE_MAP_READ|FILE_MAP_WRITE)// 参数2:共享内存对象名// 2.// 本地使用内存// LPVOID GetBuffer()// 返回共享内存地址//// 自动销毁class CSFMClient      {    public:        CSFMClient();        virtual ~CSFMClient();        CSFMClient(DWORD dwAccess, char *szMapName,DWORD size);        HANDLE  m_hMutex;    protected:        HANDLE  m_hFileMap;        LPVOID  m_lpFileMapBuffer;              string  m_strMutexName;         char    *m_pMapName;        DWORD   m_dwSize;//共享缓冲区的大小        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_FILEstatic 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);    //Create(DEFAULT_FILENAME, DEFAULT_MAPNAME, DEFAULT_MAPSIZE);    } 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)        {        if (!UnmapViewOfFile(m_lpFileMapBuffer))            {            printf("Server UnmapViewOfFile失败!rn");            }               m_lpFileMapBuffer = NULL;        }     if (m_hFileMap)        {        if (!CloseHandle(m_hFileMap))            {            printf("Server CloseHandle  关闭映射文件句柄失败!rn");            }        m_hFileMap = NULL;        }     if (m_hFile && m_hFile != INVALID_HANDLE_VALUE)        {        if (!CloseHandle(m_hFile))            {            printf("Server CloseHandle 关闭互斥体句柄失败!rn");            }               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);        m_strMutexName=szMapName;        m_strMutexName+="mutex";        }    else        {        m_pMapName = _strdup(DEFAULT_MAPNAME);        m_strMutexName=DEFAULT_MAPNAME;        m_strMutexName+="mutex";        }    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;        }    DWORD error;    //OutputDebugString((LPCSTR)m_hFile);    //error=GetLastError();    if (m_hFile)        {        m_hFileMap = CreateFileMapping(            m_hFile,            NULL,            PAGE_READWRITE,            0,            m_dwSize,            m_pMapName            );        //OutputDebugString((LPCSTR)m_hFile);        //使只有一个CSFMServer对象能操作内存对象(郝兴峰修改)        if (m_hFileMap != NULL)            {            error=GetLastError();            if ( ERROR_ALREADY_EXISTS == error)//如果已经存在了,就不要创建操作了。                {                               m_hMutex=OpenMutex(SYNCHRONIZE,FALSE,m_strMutexName.c_str());                }               else                {                m_hMutex=CreateMutex(NULL,FALSE,m_strMutexName.c_str());                }                   }        else            {            printf("Server CreateFileMapping失败!rn");            }        }    else        {        printf("Server CreateFile 失败!rn");        }    if (m_hFileMap)        {        m_lpFileMapBuffer = MapViewOfFile(            m_hFileMap,            FILE_MAP_ALL_ACCESS,//FILE_MAP_WRITE|FILE_MAP_READ,            0,            0,            0//m_dwSize改成0,在这里把它改为0,和读取写入的程序一样。郝兴峰修改09.11.13            );        if (NULL==m_lpFileMapBuffer)            {            printf("Server MapViewOfFile 失败!rn");            }        }    memset(m_lpFileMapBuffer,'',m_dwSize);//设置共享内存中的数据为0    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_ALL_ACCESS, DEFAULT_MAPNAME);    } CSFMClient::~CSFMClient()    {    Destory();    } CSFMClient::CSFMClient(DWORD dwAccess, char *szMapName,DWORD isizemap)    {    Init();    m_dwSize=isizemap;    //打开共享缓冲区    Open(dwAccess, szMapName);    } void CSFMClient::Open(DWORD dwAccess, char *szMapName)    {    if (m_iOpenFlag)        Destory();     if (szMapName)        {        m_pMapName = _strdup(szMapName);        m_strMutexName=szMapName;        m_strMutexName+="mutex";        }    else        {        m_pMapName = _strdup(DEFAULT_MAPNAME);        m_strMutexName=DEFAULT_MAPNAME;        m_strMutexName+="mutex";        }    try        {         m_hFileMap = OpenFileMapping(            FILE_MAP_ALL_ACCESS,            FALSE,            m_pMapName            );         if (m_hFileMap)            {            m_lpFileMapBuffer = MapViewOfFile(                m_hFileMap,                FILE_MAP_ALL_ACCESS,                0,                0,                0//hxf修改,把0改成m_dwSize。把m_dwSize改成0,和上面的创建性质一样、郝兴峰,09.11.13                );            if (NULL==m_lpFileMapBuffer)                {                printf("Client MapViewOfFile失败!rn");                }            m_hMutex=OpenMutex(SYNCHRONIZE,FALSE,m_strMutexName.c_str());            }        else            {            printf("Client OpenFileMapping失败!rn");            }        }     catch (exception &e)        {        printf("Client MapViewOfFile或者Client OpenFileMapping异常rn");        printf("%srn",e.what());        }    m_iOpenFlag = 1;    } void CSFMClient::Init()    {    m_hFileMap = NULL;    m_lpFileMapBuffer = NULL;    m_hMutex=NULL;     m_pMapName = NULL;    m_dwSize=0;    m_iOpenFlag = 0;     } void CSFMClient::Destory()    {    if (m_lpFileMapBuffer)        {        if (!UnmapViewOfFile(m_lpFileMapBuffer))            {            printf("Client UnmapViewOfFile 失败!rn");            }        m_lpFileMapBuffer = NULL;        }     if (m_hFileMap)        {        if(!CloseHandle(m_hFileMap))            {            printf("Client 关闭映射文件句柄失败!rn");            }        m_hFileMap = NULL;        }    if (m_pMapName)        {        free(m_pMapName);        m_pMapName = NULL;        }    if (m_hMutex)        {        if (!CloseHandle(m_hMutex))            {            printf("Client 关闭互斥体句柄失败!rn");            }        m_hMutex=NULL;        }    Init();    } LPVOID CSFMClient::GetBuffer()    {    return (m_lpFileMapBuffer)?(m_lpFileMapBuffer):(NULL);    }//这里可能有点问题DWORD CSFMClient::GetSize()    {    // unnable use    return m_dwSize;    }


原创粉丝点击