对Windows下的File Mapping一个简单的封装

简介:
头文件:
#ifndef __SharedMemory_H__
#define __SharedMemory_H__


class SharedMemory
{
public:
    /// 访问模式
    enum AccessMode
    {
        AM_READ = 0,    ///< 读
        AM_WRITE        ///< 写
    };


public:
    SharedMemory(const std::string& name, std::size_t size, AccessMode mode, const void* addrHint = 0, bool server = true);
    SharedMemory(const std::string& fileName, SharedMemory::AccessMode mode, const void* addrHint = 0);
    ~SharedMemory();

public:
    /// 共享内存的起始指针
    char* begin() const;

    /// 共享内存的尾部指针
    char* end() const;

    /// 共享内存的名字
    std::string name() const;

protected:
    void map();

    void unmap();

    void close();

private:
    SharedMemory();
    SharedMemory(const SharedMemory&);
    SharedMemory& operator = (const SharedMemory&);

    std::string    m_name;
    HANDLE        m_memHandle;
    HANDLE        m_fileHandle;
    DWORD        m_size;
    DWORD        m_mode;
    char*        m_address;
}
;


inline char* SharedMemory::begin() const
{
    return m_address;
}


inline char* SharedMemory::end() const
{
    return m_address + m_size;
}


inline std::string SharedMemory::name() const

    return m_name; 
}



#endif

实现文件

#include "stdafx.h"
#include "SharedMemory.h"

SharedMemory::SharedMemory( const std:: string& name, 
                           std::size_t size, 
                           SharedMemory::AccessMode mode, 
                            const  void* addrHint, 
                            bool)
                           : m_name(name)
                           , m_memHandle(INVALID_HANDLE_VALUE)
                           , m_fileHandle(INVALID_HANDLE_VALUE)
                           , m_size(static_cast<DWORD>(size))
                           , m_mode(PAGE_READONLY)
                           , m_address(0)
{
    if (mode == SharedMemory::AM_WRITE)
    {
        m_mode = PAGE_READWRITE;
    }


    m_memHandle = ::CreateFileMapping(INVALID_HANDLE_VALUE,
        NULL, 
        m_mode, 
        0, 
        m_size, 
        m_name.c_str());

    if (!m_memHandle)
    {
        //throw SystemException("Cannot create shared memory object", m_name);
    }


    map();
}


SharedMemory::SharedMemory(  const std:: string& fileName, AccessMode mode,  const  void* addrHint )
: m_name(fileName)
, m_memHandle(INVALID_HANDLE_VALUE)
, m_fileHandle(INVALID_HANDLE_VALUE)
, m_size(0)
, m_mode(PAGE_READONLY)
, m_address(0)
{
    DWORD shareMode = FILE_SHARE_READ;
    DWORD fileMode  = GENERIC_READ;

    if (mode == SharedMemory::AM_WRITE)
    {
        m_mode = PAGE_READWRITE;
        fileMode |= GENERIC_WRITE;
    }


    m_fileHandle = ::CreateFile(m_name.c_str(), 
        fileMode, 
        shareMode,
        NULL,
        OPEN_EXISTING, 
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    if (m_fileHandle == INVALID_HANDLE_VALUE)
    {
        //throw OpenFileException("Cannot open memory mapped file", m_name);
        return;
    }


    m_size = ::GetFileSize(m_fileHandle, NULL);

    m_memHandle = ::CreateFileMapping(m_fileHandle, NULL, m_mode, 0, 0, NULL);
    if (!m_memHandle)
    {
        ::CloseHandle(m_fileHandle);
        m_fileHandle = INVALID_HANDLE_VALUE;
        //throw SystemException("Cannot map file into shared memory", m_name);
    }

    map();
}


SharedMemory::~SharedMemory()
{
    unmap();
    close();
}


void SharedMemory::map()
{
    DWORD access = FILE_MAP_READ;
    if (m_mode == PAGE_READWRITE)
    {
        access = FILE_MAP_WRITE;
    }

    LPVOID addr = ::MapViewOfFile(m_memHandle, access, 0, 0, m_size);
    if (!addr)
    {
        //throw SystemException("Cannot map shared memory object", m_name);
    }


    m_address = static_cast<char*>(addr);
}


void SharedMemory::unmap()
{
    if (m_address)
    {
        ::UnmapViewOfFile(m_address);
        m_address = 0;
        return;
    }

}


void SharedMemory::close()
{
    if (m_memHandle != INVALID_HANDLE_VALUE)
    {
        ::CloseHandle(m_memHandle);
        m_memHandle = INVALID_HANDLE_VALUE;
    }


    if (m_fileHandle != INVALID_HANDLE_VALUE)
    {
        ::CloseHandle(m_fileHandle);
        m_fileHandle = INVALID_HANDLE_VALUE;
    }

}


示例代码
    LPCTSTR szFilePath = TEXT("E:\xxx.zip");
    SharedMemory sharedMemory(szFilePath, SharedMemory::AM_READ);
     char* pFileBegin = sharedMemory.begin();
目录
相关文章
|
编解码 Ubuntu 编译器
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译
|
5月前
|
存储 Linux Windows
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
|
5月前
|
Linux Python Windows
【Azure 环境】Windows中安装Python azure-eventhub-checkpointstoreblob-aio模块时出错 ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:
【Azure 环境】Windows中安装Python azure-eventhub-checkpointstoreblob-aio模块时出错 ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:
|
8月前
|
存储 文件存储 数据安全/隐私保护
Windows部署开源文件管理器File Browser并实现远程访问本地文件
Windows部署开源文件管理器File Browser并实现远程访问本地文件
265 1
|
8月前
|
监控 安全 虚拟化
深入浅出:NSSM封装Windows服务工具的使用与介绍
深入浅出:NSSM封装Windows服务工具的使用与介绍
308 3
|
安全 搜索推荐 虚拟化
windows系统封装介绍
windows系统封装介绍
248 0
|
存储 程序员 编译器
windows下的串口编程,串口操作类封装
windows下的串口编程,串口操作类封装
|
Windows
太阳当空照-Windows服务化方式脚本封装sc指令(下)
太阳当空照-Windows服务化方式脚本封装sc指令(下)
122 0
|
Windows
太阳当空照-Windows服务化方式脚本封装sc指令(上)
太阳当空照-Windows服务化方式脚本封装sc指令
158 0
|
网络协议 Linux 编译器
C/C++封装:Windows/Linux下封装.lib/.so文件
这里提供了两个C/C++中服务器与客户端之间通讯的两个程序,程序中封装了通信之间的函数方法,我们以这个程序为例进行封装。
329 0