Windows环境下使用共享内存实现进程间通讯

Windows环境下使用共享内存实现进程间通讯

创建共享内存

bool SharedMemory::CreateMemory()
{			   
	m_hFileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, m_memoryName.c_str())
	if (nullptr == m_hFileMap)
   	{
   		if (m_fileName != "")
  		{
			m_hFile = CreateFile(m_fileName.c_str(),
    				GENERIC_READ | GENERIC_WRITE,
   				FILE_SHARE_READ | FILE_SHARE_WRITE,
    				nullptr,
    				OPEN_ALWAYS,
    				0,
    				nullptr);
    			if (INVALID_HANDLE_VALUE == m_hFile)
    				return false;
		}
		m_hFileMap = CreateFileMapping(
  	 		m_hFile,                
   			nullptr,                 
   			PAGE_READWRITE,       
   			0,                    
   			m_memorySize,          
   			m_memoryName.c_str());
 
		if (INVALID_HANDLE_VALUE == m_hFileMap)
			return false;
   	}
   	m_address = (unsigned char *)MapViewOfFile(m_hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, m_memorySize);
 	if (nullptr == m_address)
  	return false;
}

写入共享内存

bool SharedMemory::WriteMemory(size_t offset, void* data, size_t length )
{
	if (!m_address)	return false;
 	memcpy(m_address + offset, data, length);
 	return true;
}

读取共享内存

bool SharedMemory::ReadMemory(size_t offset, void * data, size_t length)
{
 	if (!m_address)  return false;	
	memcpy(data, m_address + offset, length);
 	return true;
}

清理共享内存

void SharedMemory::ClearMemory(size_t offset, size_t length)
{
 	if (!m_address)  return;
 	memset(m_address + offset, 0, length);
}

SharedMemory.hpp

class SharedMemory
{
public//构造函数中调用创建共享内存
 	SharedMemory(std::string memoryName, std::string fileName, size_t memorySize);
 	//析构函数中需要将地址置位空,句柄也置位无效句柄
 	~SharedMemory();
 	//第一个参数指的是地址偏移量
 	//第二个参数是需要处理的数据
 	//第三个参数是长度
 	bool WriteMemory(size_t offset, void* data, size_t length = 0);
 	bool ReadMemory(size_t offset, void* data, size_t length = 0);
 	void ClearMemory(size_t offset, size_t length = 0);
private:
 	bool CreateMemory();
private:
	//内存的名字
 	std::string m_memoryName;
 	//文件名字
 	std::string m_fileName;
 	//内存大小
 	size_t m_memorySize;
 	HANDLE m_hFileMap = INVALID_HANDLE_VALUE;
 	HANDLE m_hFile = INVALID_HANDLE_VALUE;
 	//内存地址
 	unsigned char *m_address = nullptr;
};

应用

//定义了一个测试用的结构体
typedef struct TestData
{
 INT32  a = 0;  
 INT32  b = 0;
}TestData;
//在程序A中创建共享内存并写入
 SharedMemory *m_SM = nullptr;
 m_SM = new SharedMemory("TestSM", "test.dat", sizeof(TestData));
 m_SM->ClearMemory(0, sizeof(TestData));
 TestData testData;
 testData.a = 10;
 testData.b = 20;
 while (true)
 {
  Sleep(500);
  m_SM->WriteMemory(0, &testData, sizeof(TestData));
 }
//程序B中读取共享内存中数据
 SharedMemory *m_SM = nullptr;
 m_SM = new SharedMemory("TestSM", "test.dat", sizeof(TestData));
 TestData testData;
 m_SM->ReadMemory(0, &testData, sizeof(TestData));

注意

读取的内容是内存块,所以需要保证程序AB使用的结构体一致,不然会解析错误,获取不到需要的数据。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值