共享内存源码

来源:互联网 发布:人性的枷锁 知乎 编辑:程序博客网 时间:2024/05/01 16:23

FileMapping.h

#pragma once#define WIN32_LEAN_AND_MEAN #include <windows.h>class FileMapping{public:FileMapping();~FileMapping();enum OpenMode { FMOM_READ, FMOM_READ_WRITE };BOOL Open(LPCTSTR pchsMappingName, LPSTR* ppchsBuf, DWORD openMode, DWORD fileSize, DWORD dwOffset = 0);void CloseFileMapping();private:struct _FM{HANDLE hFileMapping;LPSTR pFileBuf;};_FM m_p_fm[1];};

FileMapping.cpp

#include "FileMapping.h"FileMapping::FileMapping(){ZeroMemory(m_p_fm, sizeof(_FM));}FileMapping::~FileMapping(){CloseFileMapping();}BOOL FileMapping::Open(LPCTSTR pchsMappingName, LPSTR* ppchsBuf, DWORD openMode, DWORD fileSize, DWORD dwOffset /*= 0*/){DWORD protect, desiredAccess;if ( openMode == FMOM_READ ){protect = PAGE_READONLY;desiredAccess = FILE_MAP_READ;}else if ( openMode == FMOM_READ_WRITE ){protect = PAGE_READWRITE;desiredAccess = FILE_MAP_WRITE;}else{return FALSE;}m_p_fm->hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, protect, 0, fileSize, pchsMappingName);if ( m_p_fm->hFileMapping ){m_p_fm->pFileBuf = (LPSTR) MapViewOfFile(m_p_fm->hFileMapping, desiredAccess, 0, dwOffset, fileSize);*ppchsBuf = m_p_fm->pFileBuf;}return *ppchsBuf != NULL;}void FileMapping::CloseFileMapping(){if ( m_p_fm->pFileBuf ){if ( UnmapViewOfFile(m_p_fm->pFileBuf) )m_p_fm->pFileBuf = NULL;}if ( m_p_fm->hFileMapping ){if ( CloseHandle(m_p_fm->hFileMapping) )m_p_fm->hFileMapping = NULL;}}

使用:

进程1

FileMapping fm;char* pTmp = NULL;if (fm.Open(GET_DIR_MEMORY_NAME_U, (LPSTR*) &pTmp, FileMapping::FMOM_READ_WRITE, bufLen/*分配空间长度*/)){//通知进程2写入数据        //保存数据strcpy_s(csDir,nDirLen,pTmp);fm.CloseFileMapping();}



进程2

//收到写数据请求FileMapping fm;char *pBuf = NULL;if ( fm.Open(GET_DIR_MEMORY_NAME_U, &pBuf, FileMapping::FMOM_READ_WRITE, bufLen/*分配空间长度*/) ){//写入数据memcpy(pBuf,"12345",MAX_PATH);fm.CloseFileMapping();}


0 0
原创粉丝点击