进程通信-内存共享
这里我们要写两个程序 第一个程序用来创建一片内存 第二个程序用来读取那片内存
第一 创建内存
#include<iostream>
#include<Windows.h>
using namespace std;int main()
{//第一步创建一个文件映射HANDLE hFileMaping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL,PAGE_READWRITE, 0, 256, "ZHAO");if (!hFileMaping){cout << GetLastError() << endl;}//第二步将文件映射转换到内存中//返回值为文件映射到的那片内存的起始地址 如果失败了就返回NULL//第一个参数为你想要映射的文件句柄 第二个是权限 第三个和第四个决定了起始位置 第五个参数是要映射的大小LPVOID lMapView = MapViewOfFile(hFileMaping,FILE_MAP_ALL_ACCESS,0, 0, 256);if (!lMapView){cout << GetLastError() << endl;}//第三步为前面映射出来的内存赋值memcpy(lMapView, "fuckyouhahaha", strlen("fuckyouhahaha") + 1);system("pause");CloseHandle(hFileMaping);UnmapViewOfFile(lMapView);
}
第一步使用API:CreatFileMappingA来创建一个文件映射
这个函数可以创建或者打开一个文件映射 当第一个参数为INVALID_HANDLE_VALUE时就是创建一个文件映射 第二个参数选择是否继承 第三个参数是创建的这个文件的权限 第四个为最大尺寸的高32位通常为0第五个是低32位 我们通过改低32位的数值即可控制文件的大小 最后一个参数为你这个文件映射的名称(另一个程序读取的时候会用到它)
第二步使用API:MapViewFile将文件映射转换到内存当中
MapViewFile这个函数的第一个参数为被转换的文件映射的句柄 第二个参数为内存的权限 第三个和第四个分别为映射文件起始位置的高32位和低32位 我们都写为0他俩组合结果就为0所以我们从文件的开头转换 最后一个为我们要转换的大小
第三步为我们创建出来的内存写入数据 这里我写了一个字符串
最后记得关闭文件映射并释放内存
下面来写第二个程序----读取第一个程序创建的内存
#include<iostream>
using namespace std;
#include<Windows.h>int main()
{//第一步通过映射来的内存名称来获取它的句柄HANDLE hFileMapping = OpenFileMappingA(FILE_MAP_ALL_ACCESS, 0, "ZHAO");if (!hFileMapping){cout << GetLastError()<<endl;}LPVOID lpFileBuffer = MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 256);if (!lpFileBuffer){cout << GetLastError() << endl;}
}
第一步使用OpenFileMappingA来获取叫做"ZHAO"这个文件映射的句柄 打开权限为FILE_MAP_ALL_ACCESS
第二步还是将文件映射转换到内存中
执行查看lpFileBuffer对应的内存发现和刚刚我们写入的字符串一样