共享内存的申请和释放
1.通过映射来申请内存
物理页可以在多个进程中共享;
CreateFileMapping函数用于创建一个文件映射内核对象。
HANDLE CreateFileMapping(
HANDLE hFile, //物理文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
DWORD flProtect, //保护设置
DWORD dwMaximumSizeHigh, //高位文件大小
DWORD dwMaximumSizeLow, //低位文件大小
LPCTSTR lpName //共享内存名称
);
MapViewOfFile是计算机函数,功能是将一个文件映射对象映射到当前应用程序的地址空间。MapViewOfFileEx允许我们指定一个基本地址来进行映射。
LPVOID WINAPI MapViewOfFile(
__in HANDLE hFileMappingObject, // 为CreateFileMapping()返回的文件映像对象句柄。
__in DWORD dwDesiredAccess, //映射对象的文件数据的访问方式
__in DWORD dwFileOffsetHigh, //表示文件映射起始偏移的高32位.
__in DWORD dwFileOffsetLow, //表示文件映射起始偏移的低32位.(64KB对齐不是必须的)
__in SIZE_T dwNumberOfBytesToMap //指定映射文件的字节数.
);
需要和
//关闭映射
UnmapViewOfFile(g_lpBuff);
配套使用;
1 // 共享内存的申请.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <windows.h> 6 #define MapFileName "共享内存" 7 #define BUF_SIZE 0x1000 8 9 HANDLE g_hMapFile; 10 LPTSTR g_lpBuff; 11 12 int main() 13 { 14 getchar(); 15 //内核对象:物理页,准备好物理页还没建立关联 16 g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE,(LPCWSTR) MapFileName); 17 //将物理页与线性地址进行映射,进行关联 18 //映射时候如果创建的物理页只读,但是映射时权限设置成可写,则函数失败 19 g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile, FILE_MAP_WRITE, 0, 0, BUF_SIZE); 20 21 22 23 *(PDWORD)g_lpBuff = 0x12345678; 24 printf("%p", g_lpBuff); 25 26 getchar(); 27 28 //关闭映射 29 UnmapViewOfFile(g_lpBuff); 30 //关闭句柄 31 CloseHandle(g_hMapFile); 32 getchar(); 33 34 return 0; 35 }