共享內存的申請和釋放


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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM