MapViewOfFileEx函数将文件的视图映射到调用进程的地址空间。此扩展功能允许调用进程为映射视图指定建议的内存地址。
此函数仅适用于基于Win32的应用程序。
LPVOID MapViewOfFileEx(
HANDLE 【hFileMappingObject】, | //文件映射对象映射到地址空间 |
DWORD 【dwDesiredAccess】, | //访问模式 |
DWORD 【dwFileOffsetHigh】, | //高位32位的文件偏移量 |
DWORD 【dwFileOffsetLow】, | //低位32位的文件偏移量 |
DWORD 【dwNumberOfBytesToMap】, | //要映射的字节数 |
LPVOID 【lpBaseAddress】 | //建议映射视图的起始地址 |
); |
参数
【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】为零,则映射整个文件。
【lpBaseAddress】
指向调用进程的地址空间中的映射应该开始的内存地址。这必须是系统内存分配粒度的倍数,否则功能失败。使用填写SYSTEM_INFO结构成员的GetSystemInfo函数来获取系统的内存分配粒度。如果指定地址的地址空间不足,则该函数失败。
如果【lpBaseAddress】为NULL,则操作系统将选择映射地址。在这种情况下,此函数相当于MapViewOfFile功能。
返回值
如果函数成功,则返回值是映射视图的起始地址。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
备注
映射文件使文件的指定部分在调用进程的地址空间中可见。
如果提供了建议的映射地址,则如果指定地址上有足够的地址空间,则文件将映射到指定的地址(向下舍入到最接近的64K边界)。如果没有,功能失败。
通常,建议的地址用于指定在多个进程中应将文件映射到相同的地址。这需要地址空间区域在所有涉及的进程中可用。没有其他内存分配,包括使用VirtualAlloc功能来保留内存,可以在用于映射的区域中进行。
Windows 95:如果【lpBaseAddress】参数指定了基本偏移量,则只有在所有其他32位进程中内存映射文件的内存区域相同的情况下,该函数才会成功。
Windows NT:如果【lpBaseAddress】参数指定了基本偏移量,则如果调用进程尚未使用给定的内存区域,该函数将成功执行。该系统【不】保证在其他32位进程中的内存映射文件可以使用相同的内存区域。
文件(或文件映射对象及其映射文件)的多个视图如果在指定时间包含相同的数据,则称为“一致”。如果文件视图是从相同的文件映射对象导出的,则会发生这种情况。一个进程可以通过使用DuplicateHandle函数将文件映射对象句柄复制到另一个进程中,或者另一个进程可以使用OpenFileMapping函数按名称打开文件映射对象。
文件的映射视图不能保证与ReadFile或WriteFile功能访问的文件保持一致。
也可以看看
CreateFileMapping, DuplicateHandle, GetSystemInfo, MapViewOfFile, OpenFileMapping, ReadFile, UnmapViewOfFile, SYSTEM_INFO, VirtualAlloc, WriteFile