MapViewOfFile函数将文件的视图映射到调用进程的地址空间。
LPVOID MapViewOfFile(
HANDLE 【hFileMappingObject】, | //文件映射对象映射到地址空间 |
DWORD 【dwDesiredAccess】, | //访问模式 |
DWORD 【dwFileOffsetHigh】, | //高位32位的文件偏移量 |
DWORD 【dwFileOffsetLow】, | //低位32位的文件偏移量 |
DWORD 【dwNumberOfBytesToMap】 | //要映射的字节数 |
); |
参数
【hFileMappingObject】
标识文件映射对象的打开句柄。CreateFileMapping和OpenFileMapping函数返回此句柄。
【dwDesiredAccess】
指定对文件视图的访问类型,以及对文件映射的页面的保护。此参数可以是以下值之一:
值 | 含义 |
FILE_MAP_WRITE | 读写访问。必须使用PAGE_READWRITE保护创建【hFileMappingObject】参数。映射文件的读写视图。 |
FILE_MAP_READ | 只读访问。必须使用PAGE_READWRITE或PAGE_READONLY保护创建【hFileMappingObject】参数。映射文件的只读视图。 |
FILE_MAP_ALL_ACCESS | 与FILE_MAP_WRITE相同。 |
FILE_MAP_COPY | 复制写入权限。如果您使用PAGE_WRITECOPY创建地图,并且使用FILE_MAP_COPY创建视图,则会收到一个文件视图。如果你写信给你,这些页面是可以自动交换的,你所做的修改将不会转到原始的数据文件。 Windows 95:您必须将PAGE_WRITECOPY传递给CreateFileMapping;否则将返回错误。 如果您使用DuplicateHandle或OpenFileMapping共享多个进程之间的映射,并且一个进程写入视图,则修改将传播到另一个进程。原始文件不更改。 Windows NT:关于如何创建【hFileMappingObject】参数没有任何限制。写入复制对任何类型的视图都有效。 如果您使用DuplicateHandle或OpenFileMapping共享多个进程之间的映射,并且一个进程写入视图,那么修改不会传播到另一个进程。原始文件不更改。 |
【dwFileOffsetHigh】
指定要开始映射的文件偏移量的高位32位。
【dwFileOffsetLow】
指定要开始映射的文件偏移量的低32位。高和低偏移量的组合必须指定文件中与系统内存分配粒度相匹配的偏移量,否则功能失败。也就是说,偏移量必须是分配粒度的倍数。使用填充SYSTEM_INFO结构成员的GetSystemInfo函数来获取系统的内存分配粒度。
【dwNumberOfBytesToMap】
指定要映射的文件的字节数。如果【dwNumberOfBytesToMap】为零,则映射整个文件。
返回值
如果函数成功,则返回值是映射视图的起始地址。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
备注
映射文件使文件的指定部分在调用进程的地址空间中可见。
文件(或文件映射对象及其映射文件)的多个视图如果在指定时间包含相同的数据,则称为“一致”。如果文件视图是从相同的文件映射对象导出的,则会发生这种情况。一个进程可以通过使用DuplicateHandle函数将文件映射对象句柄复制到另一个进程中,或者另一个进程可以使用OpenFileMapping函数按名称打开文件映射对象。
文件的映射视图不能保证与ReadFile或WriteFile功能访问的文件保持一致。
Windows 95: MapViewOfFile可能要求交换文件增长。如果交换文件不能增长,则该函数失败。
Windows NT: If the file-mapping object is backed by the paging file (handle = 0xFFFFFFFF), the paging file must be large enough to hold the entire mapping. If it is not, MapViewOfFile fails.
也可以看看
CreateFileMapping, DuplicateHandle, GetSystemInfo, MapViewOfFileEx, OpenFileMapping, UnmapViewOfFile, SYSTEM_INFO