共享内存源码

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值