Windows核心编程学习笔记--第17章

17章内存映射文件

还是优缺点。然后用途。怎么用。

17.1内存文件原理及用途

17.2使用内存映射文件

17.3用内存映射文件在进程间共享数据

17.1内存文件原理及用途

         与虚拟内存相似,内存映射文件允许开发人员预订一块地址空间区域并给区域调拨物理存储器。不同之处在于,内存映射文件的物理存储器来自磁盘上已有的文件,而不是来自系统的页交换文件。一旦把文件映射到地址空间,我们就可对它进行访问,就像整个文件都已被载入内存一样。

内存映射文件主要用于以下三种情况:

1)  系统使用内存映射文件来载入并运行.exeDLL文件。节省了页交换文件的空间及应用程序启动的实际。(系统自动,不关注)

2)  开发人员可用内存映射文件来访问磁盘上的数据文件。可避免直接对文件进行I/O操作和对文件内容进行缓存。

3)  同一机器的不同进程间共享数据。

17.2使用内存映射文件

1)创建或打开一个文件内核对象。CreateFile

2)创建一个文件映射内核对象来告诉系统文件的大小及我们打算如何访问文件。

3)告诉系统把文件映射对象映射到进程的地址空间中。

用完内存映射文件后,分两步清理

4)  告诉系统从进程地址空间中取消对文件映射内核对象的映射。

5)  关闭文件映射对象和文件对象。

 

         //Open the file for reading and writing
         HANDLE hFile = CreateFile(pszPathname, GENERIC_WRITE | GENERIC_READ, 0, 
		NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (INVALID_HANDLE_VALUE == hFile)
	{
		AfxMessageBox(_T("File could not be opened."));
		return FALSE;
	}
	
	//Create the file-mapping object.
	DWORD dwFileSize = GetFileSize(hFile, NULL);
	HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 
		0, dwFileSize + sizeof(TCHAR), NULL);
	if (NULL == hFileMap)
	{
		AfxMessageBox(_T("File map could not be opened."));
		CloseHandle(hFile);
		return FALSE;
	}

	//Get the address where the first byte of the file is mapped into memory.
	PVOID pvFile = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);
	if (NULL == pvFile)
	{
		AfxMessageBox(_T("Could not map view of file"));
		CloseHandle(hFileMap);
		CloseHandle(hFile);
		return FALSE;
	}

	//Clean up everything before exiting.
	UnmapViewOfFile(pvFile);
	CloseHandle(hFileMap);

	SetFilePointer(hFile, dwFileSize, NULL, FILE_BEGIN);
	SetEndOfFile(hFile);
	CloseHandle(hFile);

	return TRUE;


17.3用内存映射文件在进程间共享数据

         进程间共享数据的方式(或者说进程间通信方式)windows消息、内存映射文件、剪贴板、邮件槽、管道、信号量、套接字等。

         用法:与上述相同。注意三点:

Ø  A进程执行完上述步骤后,B进程可直接访问(也可执行同样步骤)

Ø  用内存映射文件来共享数据时,多个进程必须用相同的内存映射文件名。

Ø  若仅为了共享数据,则不需CreateFile,只需将INVALID_HANDLE_VALUE传入CreateFileMappinghFile。更专业的说法:这样创建的文件映射对象的物理存储器不是磁盘上的文件,而是希望系统从页交换文件中调拨物理存储器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值