zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Windows进程间通信方法——共享内存

Windows方法进程 间通信 共享内存
2023-09-11 14:22:29 时间

1. 概述

Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。

2. 编码

2.1 发送端

发送端相比内存映射文件,少了创建文件句柄这一部分,直接将0xFFFFFFFF替换了原来的文件句柄。

 

// MemoryMapSender.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

using std::cout;
using std::endl;

HANDLE m_hFile;				//文件句柄
HANDLE m_hMapping;			//内存映射句柄
void* m_pBase = nullptr;	//内存映射的地址

bool CreateMemoryMapping();	//创建内存映射
void my_FileMappingWriteData();	//写内容
bool ClearMapping();		//关闭内存映射

int _tmain(int argc, _TCHAR* argv[])
{
	system("color f0");
	if (!CreateMemoryMapping()) return -1;
	my_FileMappingWriteData();
	system("pause");
	ClearMapping();
	return 0;
}

//************************************************************************
// 函数名称:    	CreateMemoryMapping
// 访问权限:    	public 
// 创建日期:		2017/06/06
// 创 建 人:		
// 函数说明:		创建内存映射
// 返 回 值:   	bool
//************************************************************************
bool CreateMemoryMapping()
{
	m_hMapping = CreateFileMapping((HANDLE)0xffffffff, NULL, PAGE_READWRITE, 0, 0x1000, _T("my_app"));
	//检查有效性
	if (INVALID_HANDLE_VALUE == m_hMapping)
	{
		cout << "initial file mapping Handel failed," << endl;
		CloseHandle(m_hMapping);
		CloseHandle(m_hFile);
		return false;
	}
	//将文件映射到进程的地址空间中	
	if (!(m_pBase = MapViewOfFile(m_hMapping, FILE_MAP_READ|FILE_MAP_WRITE, NULL, NULL, NULL)))
	{
		cout << "将文件映射到进程的地址空间中 failed," << endl;
		CloseHandle(m_hMapping);
		CloseHandle(m_hFile);
		return false;
	}

	return true;
}


//************************************************************************
// 函数名称:    	ClearMapping
// 访问权限:    	public 
// 创建日期:		2017/06/06
// 创 建 人:		
// 函数说明:		关闭内存文件映射
// 返 回 值:   	bool
//************************************************************************
bool ClearMapping()
{
	if (!UnmapViewOfFile(m_pBase))
	{
		cout << "unmapping failed" << endl;
	}
	CloseHandle(m_hMapping);
	CloseHandle(m_hFile);
	m_pBase = nullptr;

	return true;
}

//************************************************************************
// 函数名称:    	my_FileMappingWriteData
// 访问权限:    	public 
// 创建日期:		2017/06/06
// 创 建 人:		
// 函数说明:		写内容
// 返 回 值:   	void
//************************************************************************
void my_FileMappingWriteData()
{
	m_pBase = (LPTSTR)MapViewOfFile(m_hMapping, FILE_MAP_WRITE, 0, 0, 0);
	if (!m_pBase)
	{
		cout << "映射文件读取 failed," << endl;
		CloseHandle(m_hMapping);
		return;
	}
	LPTSTR str = _T("hello client");
	lstrcpy((LPTSTR)m_pBase, str);
}

 

2.2 接收端

发送端几乎没有什么修改的地方,可以参考前一篇文章