首页 > 系统相关 >Windows进程通信之共享内存通信(C++)

Windows进程通信之共享内存通信(C++)

时间:2022-12-29 16:04:00浏览次数:71  
标签:hFileMap Handle Windows 通信 INPUT 共享内存 SIZE define


首先是概念:​​https://baike.baidu.com/item/%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98/2182364?fr=aladdin​

这是比较官方的解释

在我的理解,共享内存通信指的是,一个进程开辟一块内存,并且设定内存的读取方式,并且存放数据,然后另一个进程通过一个特定的key值来访问,并且读取里面的值。

接下来是我做的一个简单的客户端和服务端通信,

环境是VisualStudio2019 C++控制台程序

首先是服务器端,负责创建共享内存地址空间和放数据进去

// ServerProcess.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <Windows.h>

#define INPUT_SIZE 4096 //内存空间的大小
#define PROCESS_NAME L"MemoryShare" //访问地址的标志,类似于字典中的key
#define _CRT_SECURE_NO_WARNINGS

using namespace std;

int main()
{
char input_str[] = "test data";//存放的数据
//1.创建共享内存
HANDLE hFileMap_Handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE, 0, INPUT_SIZE, PROCESS_NAME);
//2.得到共享内存的指针
LPVOID share_memory_ptr = MapViewOfFile(hFileMap_Handle,FILE_MAP_ALL_ACCESS,0,0,INPUT_SIZE);
//3.把需要客户端读取的数据放在共享内存的地址上
strcpy((char*)share_memory_ptr,input_str);

Sleep(5000000);//设置等待时间,即为内存的存放时间,等待完就释放

//4.解除映射
UnmapViewOfFile(share_memory_ptr);
//5.关闭句柄
CloseHandle(hFileMap_Handle);

cout << "访问结束"<<endl;
}

接下来是客户端,做的事是,打开这个空间,并且读取里面的数据:

// ClientProcess.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <Windows.h>
#define INPUT_SIZE 4096 //内存地址的大小
#define PROCESS_NAME L"MemoryShare"
#define _CRT_SECURE_NO_WARNINGS
using namespace std;

int main()
{
//打开共享的文件对象
HANDLE hFileMap_Handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL, PROCESS_NAME);
//判断句柄是否存在
if (hFileMap_Handle)
{
LPVOID lpBase = MapViewOfFile(hFileMap_Handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
char szBuffer[INPUT_SIZE] = { 0 };
strcpy(szBuffer, (char*)lpBase);
cout <<"读取的数据为:" <<szBuffer<<endl;

//解除映射
UnmapViewOfFile(lpBase);
//关闭句柄
CloseHandle(hFileMap_Handle);
}

}

运行结果如下:

Windows进程通信之共享内存通信(C++)_共享内存

 


希望对大家有用。

标签:hFileMap,Handle,Windows,通信,INPUT,共享内存,SIZE,define
From: https://blog.51cto.com/u_15906863/5978176

相关文章