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

头文件:
#ifndef __SharedMemory_H__
#define __SharedMemory_H__


class SharedMemory
ExpandedBlockStart.gif {
public:
ExpandedSubBlockStart.gif    /// 访问模式
    enum AccessMode
ExpandedSubBlockStart.gif    {
ExpandedSubBlockStart.gif        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:
ExpandedSubBlockStart.gif    /// 共享内存的起始指针
    char* begin() const;

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

ExpandedSubBlockStart.gif    /// 共享内存的名字
    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
ExpandedSubBlockStart.gif{
    return m_address;
}

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

inline std::string SharedMemory::name() const
ExpandedSubBlockStart.gif
    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)
ExpandedBlockStart.gif {
    if (mode == SharedMemory::AM_WRITE)
ExpandedSubBlockStart.gif    {
        m_mode = PAGE_READWRITE;
    }

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

    if (!m_memHandle)
ExpandedSubBlockStart.gif    {
        //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)
ExpandedBlockStart.gif {
    DWORD shareMode = FILE_SHARE_READ;
    DWORD fileMode  = GENERIC_READ;

    if (mode == SharedMemory::AM_WRITE)
ExpandedSubBlockStart.gif    {
        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)
ExpandedSubBlockStart.gif    {
        //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)
ExpandedSubBlockStart.gif    {
        ::CloseHandle(m_fileHandle);
        m_fileHandle = INVALID_HANDLE_VALUE;
        //throw SystemException("Cannot map file into shared memory", m_name);
    }
    map();
}

SharedMemory::~SharedMemory()
ExpandedBlockStart.gif {
    unmap();
    close();
}

void SharedMemory::map()
ExpandedBlockStart.gif {
    DWORD access = FILE_MAP_READ;
    if (m_mode == PAGE_READWRITE)
ExpandedSubBlockStart.gif    {
        access = FILE_MAP_WRITE;
    }
    LPVOID addr = ::MapViewOfFile(m_memHandle, access, 0, 0, m_size);
    if (!addr)
ExpandedSubBlockStart.gif    {
        //throw SystemException("Cannot map shared memory object", m_name);
    }

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

void SharedMemory::unmap()
ExpandedBlockStart.gif {
    if (m_address)
ExpandedSubBlockStart.gif    {
        ::UnmapViewOfFile(m_address);
        m_address = 0;
        return;
    }
}

void SharedMemory::close()
ExpandedBlockStart.gif {
    if (m_memHandle != INVALID_HANDLE_VALUE)
ExpandedSubBlockStart.gif    {
        ::CloseHandle(m_memHandle);
        m_memHandle = INVALID_HANDLE_VALUE;
    }

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

示例代码
    LPCTSTR szFilePath = TEXT("E:\xxx.zip");
    SharedMemory sharedMemory(szFilePath, SharedMemory::AM_READ);
     char* pFileBegin = sharedMemory.begin();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值