内存储器映射文件使用详解

内存映射文件使用详解

下午修改个程序,需要在同一个解决方案下的不同的项目下通讯。同事提到了内存映射文件。原来是个挺好的类。

只要访问同一个内存映射文件即可实现通讯。不同的项目都可以访问(据说文件内存中有存储打开次数的标志-Num,每打开一次,增加一,如果为0,自动释放内存)。应用程序终止的时候,映射文件的内存被自动释放。

内存映射文件,顾名思义,是个文件。从最简单的文件操作入手。

HANDLE  hMapFile; //映射文件句柄
LPVOID  pMapFile;//文件偏移地址

文件的创建:

CreateFileMapping(INVALID_HANDLE_VALUE,NULL,	PAGE_READWRITE,	0,sizeof(MyhssUser),Mystrfile);

参数详解:

   HANDLE CreateFileMapping(
  HANDLE hFile, //物理文件句柄
  LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
  DWORD flProtect, //保护设置
  DWORD dwMaximumSizeHigh, //高位文件大小
  DWORD dwMaximumSizeLow, //低位文件大小
  LPCTSTR lpName //共享内存名称
  );

返回值:HANDLE

写文件:

if( pMapFile != NULL ) 
{
	m_WriteFile = (MyhssUser *)pMapFile;//m_MyWriteFile是自定义的结构体
	strcpy(m_WriteFile->m_ID ,"1");
strcpy(m_WriteFile->m_pwd , "1");
}

打开文件:

hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,Mystrfile);
参数说明:
  dwDesiredAccess Long,带有前缀FILE_MAP_???的一个常数。参考下个解释。
  bInheritHandle Long,如这个函数返回的句柄能由当前进程启动的新进程继承,则这个参数为TRUE。
  lpName String,指定要打开的文件映射对象名称
MapViewOfFile函数dwDesiredAccess参数的说明
  
hFileMappingObject Long,文件映射对象的句柄。
  dwDesiredAccess Long,下述常数之一:
  FILE_MAP_WRITE 映射可读可写。文件映射对象必须通过PAGE_READWRITE访问创建。
  FILE_MAP_READ 映射只读。文件映射对象必须通过PAGE_READ 或 PAGE_READWRITE访问创建。
  FILE_MAP_ALL_ACCESS 与FILE_MAP_WRITE相同。
  FILE_MAP_COPY 映射时保留写操作的副本。文件映射对象必须用PAGE_WRITECOPY访问在win95下创建
  dwFileOffsetHigh Long,文件中映射起点的高32位地址。
  dwFileOffsetLow Long,文件中映射起点的低32位地址。
  dwNumberOfBytesToMap Long,文件中要映射的字节数。用零映射整个文件映射对象。
  lpBaseAddress Long,指定映射文件映射对象的地址。如这个地址处没有足够的内存空间,那么对MapViewOfFileEx的调用会失效。零表示允许windows寻找一个地址。

读文件:

	pMapFile = MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);//将一个文件映射对象映射到当前应用程序的地址空间
	if( pMapFile != NULL ) 
	{
		m_ReadFile = (MyhssUser*)pMapFile;
		m_ReadFile->m_ID="1";
}

关闭文件:

	UnmapViewOfFile(pMapFile);
	CloseHandle(hMapFile);