共享内存的申请和释放

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 }

猜你喜欢

转载自www.cnblogs.com/hanhandaren/p/11146257.html
今日推荐