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();
}