VS C++ 共享内存 CreateFileMapping

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youshijian99/article/details/80438492
创建共享内存
HANDLE CreateFileMapping(
  HANDLE hFile,              // handle to file to map
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // optional security attributes, 是否被继承
  DWORD flProtect,           // protection for mapping object
  DWORD dwMaximumSizeHigh,   // high-order 32 bits of object size
  DWORD dwMaximumSizeLow,    // low-order 32 bits of object size
  LPCTSTR lpName             // name of file-mapping object
);
hFile // (HANDLE)0xFFFFFFFF 不指定共享内存句柄
lpFileMappingAttributes // 是否被继承
flProtect // 读写权限
dwMaximumSizeHigh // 
dwMaximumSizeLow // 共享内存大小
lpName // 名字
返回值:
成功:共享内存句柄

失败:GetLastError function returns ERROR_ALREADY_EXISTS;或 NULL。

映射共享内存地址空间
LPVOID MapViewOfFile(
  HANDLE hFileMappingObject,  // file-mapping object to map into address space
  DWORD dwDesiredAccess,      // access mode
  DWORD dwFileOffsetHigh,     // high-order 32 bits of file offset
  DWORD dwFileOffsetLow,      // low-order 32 bits of file offset
  DWORD dwNumberOfBytesToMap  // number of bytes to map
);
hFileMappingObject : CreateFileMapping 和 OpenFileMapping 返回的句柄
dwDesiredAccess : 存取模式
返回值:
成功:返回映射的地址

失败:GetLastError function returns ERROR_ALREADY_EXISTS;或 NULL。

解除映射
BOOL UnmapViewOfFile(
  LPCVOID lpBaseAddress   // address where mapped view begins ,MapViewOfFile 的句柄 
);
返回值:
成功:返回非0

失败:返回0

关闭打开的句柄
BOOL CloseHandle(
  HANDLE hObject   // handle to object to close

);

例程  创建共享内存

#include <Windows.h>  
#include <cstdio>  
  
static HANDLE hShareMem = INVALID_HANDLE_VALUE;
static void * pRawShareAddr = NULL;

int main(int argc, char **argv)  
{  
	int nMemSize = 1024;
	hShareMem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, nMemSize, NULL); 
	if( (hShareMem != INVALID_HANDLE_VALUE) && (hShareMem != NULL) )
	{
		 pRawShareAddr = (void *)MapViewOfFile(hShareMem, FILE_MAP_ALL_ACCESS, 0, 0, 0);
		 memset(pRawShareAddr, 0, nMemSize);	// 清空数据
	}

	UnmapViewOfFile(pRawShareAddr);	 // 解除映射
	pRawShareAddr=NULL;

	CloseHandle(hShareMem);		// 关闭句柄
    hShareMem=INVALID_HANDLE_VALUE;
  
    getchar();  
    return 0;  
}  
打开一个有名的共享内存
HANDLE OpenFileMapping(  
DWORD dwDesiredAccess,  // access mode
BOOL bInheritHandle,    // inherit flag
LPCTSTR lpName          // pointer to name of file-mapping object
); 
返回值:
成功:返回打开 lpName 名字的共享内存地址

失败:GetLastError function returns ERROR_ALREADY_EXISTS;或 NULL。

例程  获取共享内存

#include <Windows.h>  
#include <cstdio>  
  
static HANDLE hShareMem = INVALID_HANDLE_VALUE;
static void * pRawShareAddr = NULL;

int main(int argc, char **argv)  
{  
	int nMemSize = 1024;
	char sShareMemName[] = "shareMemName";
	hShareMem = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, (LPCTSTR)sShareMemName);
	if( (hShareMem != INVALID_HANDLE_VALUE) && (hShareMem != NULL) )
	{
		 pRawShareAddr = (void *)MapViewOfFile(hShareMem, FILE_MAP_ALL_ACCESS, 0, 0, 0);
		 if (pRawShareAddr != NULL) 
		 {
				unsigned long long tempaddr=(unsigned long long)pRawShareAddr; 
				printf("get_share_mem: windows shm addr=0x%08x\r\n",tempaddr);
		 }
	}
	
	UnmapViewOfFile(pRawShareAddr);	 // 解除映射
	pRawShareAddr=NULL;

	CloseHandle(hShareMem);		// 关闭句柄
    hShareMem=INVALID_HANDLE_VALUE;
  
    getchar();  
    return 0;  
}  

猜你喜欢

转载自blog.csdn.net/youshijian99/article/details/80438492