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 接收端
发送端几乎没有什么修改的地方,可以参考前一篇文章