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 接收端
发送端几乎没有什么修改的地方,可以参考前一篇文章
相关文章
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
- Windows环境下32位汇编语言程序设计(典藏版)
- c# 在windows服务中 使用定时器
- windows7 照片查看器无法打开图片, windows提示因为可用内存不足,但我的内存4G?
- 怎样使windows上的javaWEB项目公布到Centos上
- windows单机环境下配置tomcat集群
- C#【必备技能篇】windows 的时钟精度是多少?怎么提高
- Win7系统windows script host无法找到脚本文件的解决方法
- Linux挂载读取Windows分区文件及PVE 下挂载到虚拟机和LXC容器方法
- Windows: User Variables & System Variables
- Kibana:Windows下安装和运行Kibana
- Windows还能这么玩❔开机自动念情书、DOS窗口变透明加上炫酷的命令特效,撩妹变得如此简单❕❕❕
- 【Kafka】Windows环境配置测试
- 《Python数据可视化编程实战》—— 1.5 在Windows上安装matplotlib
- 在 Windows(NVIDIA 和 AMD)上使用 Stable Diffusion 的快速简便方法,使用 AUTOMATIC1111 稳定的扩散网络 UI 在您自己的计算机上制作免费的 AI 艺术
- windows 解压文件出现乱码 7zip解压文件中文乱码 解决方法
- Windows下80端口被进程System&PID=4占用的解决方法
- 二、seata + nacos 配置(windows)
- 服务器的windows server 2012 r2 自带的.NET 4.5卸载了,重启服务器黑屏的解决方法
- [记录]使用Gitblit 在windows 上安装Git Server
- paip.windows io监控总结
- 微软Windows新战略:拉拢苹果 对抗谷歌
- 针对Windows零日漏洞,微软是不是太过“无作为”了?
- 黑莓WP版BBM即时通信应用突然下架Windows Store
- Windows 7环境下网站性能测试小工具 Apache Bench 和 Webbench使用和下载