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 }