天天看点

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

头文件:

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

#ifndef __SharedMemory_H__

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

#define __SharedMemory_H__

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

class SharedMemory

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

{

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

public:

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

    /// 访问模式

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

    enum AccessMode

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

    {

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

        AM_READ = 0,    ///< 读

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

        AM_WRITE        ///< 写

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

    };

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

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

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

    SharedMemory(const std::string& fileName, SharedMemory::AccessMode mode, const void* addrHint = 0);

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

    ~SharedMemory();

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

    /// 共享内存的起始指针

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

    char* begin() const;

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

    /// 共享内存的尾部指针

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

    char* end() const;

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

    /// 共享内存的名字

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

    std::string name() const;

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

protected:

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

    void map();

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

    void unmap();

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

    void close();

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

private:

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

    SharedMemory();

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

    SharedMemory(const SharedMemory&);

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

    SharedMemory& operator = (const SharedMemory&);

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

    std::string    m_name;

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

    HANDLE        m_memHandle;

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

    HANDLE        m_fileHandle;

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

    DWORD        m_size;

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

    DWORD        m_mode;

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

    char*        m_address;

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

};

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

inline char* SharedMemory::begin() const

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

    return m_address;

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

}

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

inline char* SharedMemory::end() const

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

    return m_address + m_size;

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

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

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

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

    return m_name; 

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

#endif

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

实现文件

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

#include "stdafx.h"

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

#include "SharedMemory.h"

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

SharedMemory::SharedMemory(const std::string& name, 

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

                           std::size_t size, 

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

                           SharedMemory::AccessMode mode, 

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

                           const void* addrHint, 

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

                           bool)

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

                           : m_name(name)

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

                           , m_memHandle(INVALID_HANDLE_VALUE)

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

                           , m_fileHandle(INVALID_HANDLE_VALUE)

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

                           , m_size(static_cast<DWORD>(size))

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

                           , m_mode(PAGE_READONLY)

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

                           , m_address(0)

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

    if (mode == SharedMemory::AM_WRITE)

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

        m_mode = PAGE_READWRITE;

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

    }

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

    m_memHandle = ::CreateFileMapping(INVALID_HANDLE_VALUE,

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

        NULL, 

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

        m_mode, 

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

        0, 

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

        m_size, 

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

        m_name.c_str());

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

    if (!m_memHandle)

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

        //throw SystemException("Cannot create shared memory object", m_name);

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

    map();

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

SharedMemory::SharedMemory( const std::string& fileName, AccessMode mode, const void* addrHint )

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

: m_name(fileName)

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

, m_memHandle(INVALID_HANDLE_VALUE)

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

, m_fileHandle(INVALID_HANDLE_VALUE)

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

, m_size(0)

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

, m_mode(PAGE_READONLY)

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

, m_address(0)

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

    DWORD shareMode = FILE_SHARE_READ;

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

    DWORD fileMode  = GENERIC_READ;

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

        fileMode |= GENERIC_WRITE;

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

    m_fileHandle = ::CreateFile(m_name.c_str(), 

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

        fileMode, 

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

        shareMode,

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

        NULL,

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

        OPEN_EXISTING, 

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

        FILE_ATTRIBUTE_NORMAL,

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

        NULL);

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

    if (m_fileHandle == INVALID_HANDLE_VALUE)

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

        //throw OpenFileException("Cannot open memory mapped file", m_name);

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

        return;

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

    m_size = ::GetFileSize(m_fileHandle, NULL);

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

    m_memHandle = ::CreateFileMapping(m_fileHandle, NULL, m_mode, 0, 0, NULL);

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

        ::CloseHandle(m_fileHandle);

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

        m_fileHandle = INVALID_HANDLE_VALUE;

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

        //throw SystemException("Cannot map file into shared memory", m_name);

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

SharedMemory::~SharedMemory()

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

    unmap();

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

    close();

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

void SharedMemory::map()

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

    DWORD access = FILE_MAP_READ;

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

    if (m_mode == PAGE_READWRITE)

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

        access = FILE_MAP_WRITE;

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

    LPVOID addr = ::MapViewOfFile(m_memHandle, access, 0, 0, m_size);

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

    if (!addr)

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

        //throw SystemException("Cannot map shared memory object", m_name);

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

    m_address = static_cast<char*>(addr);

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

void SharedMemory::unmap()

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

    if (m_address)

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

        ::UnmapViewOfFile(m_address);

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

        m_address = 0;

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

void SharedMemory::close()

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

    if (m_memHandle != INVALID_HANDLE_VALUE)

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

        ::CloseHandle(m_memHandle);

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

        m_memHandle = INVALID_HANDLE_VALUE;

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

    if (m_fileHandle != INVALID_HANDLE_VALUE)

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

示例代码

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

    LPCTSTR szFilePath = TEXT("E:\xxx.zip");

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

    SharedMemory sharedMemory(szFilePath, SharedMemory::AM_READ);

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

    char* pFileBegin = sharedMemory.begin();

继续阅读