首先是概念: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);
}
}
运行结果如下:
希望对大家有用。
标签:hFileMap,Handle,Windows,通信,INPUT,共享内存,SIZE,define From: https://blog.51cto.com/u_15906863/5978176