原文链接 -> 传送门
函数功能:
MapViewOfFile 函数用于将一个文件映射视图映射到一个正在被调用的进程的地址空间中。
如果想要为该视图指定一个建议的基地址,可以使用 MapViewOfFileEx 函数。但是,不推荐这种做法。
API 函数原型:
注释:_In_ 说明该参数是输入的
LPVOID WINAPI MapViewOfFile( _In_ HANDLE hFileMappingObject, _In_ DWORD dwDesiredAccess, _In_ DWORD dwFileOffsetHigh, _In_ DWORD dwFileOffsetLow, _In_ SIZE_T dwNumberOfBytesToMap );
参数解析:
|
参数 |
含义 |
||||||||||||||
|
hFileMappingObject |
1. 该参数指定一个文件映射对象句柄 |
||||||||||||||
|
dwDesiredAccess |
1. 该参数指定一个文件映射对象的访问类型,该访问类型决定了要保护的页面
|
||||||||||||||
|
dwFileOffsetHigh |
该参数表示视图开始处的高阶的双字节的文件偏移量 |
||||||||||||||
|
dwFileOffsetLow |
1. 该参数表示视图开始处的低阶的双字节的文件偏移量 |
||||||||||||||
|
dwNumberOfBytesToMap |
1. 该值表示映射到视图的文件映射的字节数 |
返回值:
1. 如果该函数调用成功,则返回值是映射视图的起始地址;
2. 如果该函数调用失败,则返回值是 NULL。
获取有关错误的更多信息,请调用 GetLastError 函数。
备注:
1. 映射一个文件让一个文件的指定部分在当前调用进程的地址空间内可见。
2. 对于比地址空间还大的文件,你只能一次性映射该文件数据的一小部分。当第一个映射完成后,你以可以取消该映射并且映射一个新的视图。
3. 想要获得一个视图的大小,可以使用 VirtualQuery 函数。
4. 在一个基于页面文件的的文件映射对象的原始页面内容为 0(zero)。
5. 通常,被建议的地址是被用于指定一个在众多进程中映射应该被映射在相同的地址中的文件。这要求该地址空间区域在所有参与的进程中都可用。其它的内存分配不能发生在该区域,该区域只能用于映射,包括用 VirtualAlloc 函数或VirtualAllocEx 函数去备份内存。
6. 如果 IpBaseAddress 参数指定了一个基础偏移量,如果指定的内存区域并没有已经被调用进程使用,那么该函数能运行成功。系统不会保证相同的内存区域对其它的 32 位进程中的内存映射文件可用。
7. 一个文件的大量视图(或者一个文件映射对象和他的映射文件)是一致的,如果他们在一个指定的时间包含相同的数据。如果文件视图是来源于任何一个被相同的文件支持的文件映射对象时上述情况会发生。通过使用 DuplicateHandle 函数一个进程可以复制一个文件映射对象句柄到另一个进程中或者可以通过使用 OpenFileMapping 函数让一个进程能够通过名字打开一个文件映射对象。
8. 一个重要的特例,在一个特定的时间,来源于任何一个被相同的文件支持的文件映射对象是一致的或者是相同的。对于一个进程中的视图和一个被不同的进程映射的视图来说一致性是有保证的。
9. 该特例与远程文件有关。尽管 MapViewOfFileEx 函数适用于远程文件,但是该函数不会保持他们的一致性。例如,如果两个电脑都映射一个文件为可写,并且这两个电脑都改变相同的页面,但是每一个电脑只能看见它在该页写的内容。当数据在硬盘上更新时,它没有被合并。
10. 一个文件的映射视图不被保证与被 ReadFile 函数或 WriteFile 函数访问的文件的一致性。
11. 存储时不要将指针存储于内存中的映射文件,而是存储以文件映射为基础的偏移量,以便于映射能够在任何地址都可以用。
12. 为了避免 EXCEPTION_IN_PAGE_ERROR 异常的发生,可以用结构化异常处理去保护任何写入的或者从一个文件的内存映射视图而不是页面文件读取的代码。更多信息,请参照 Reading and Writing From a File View。
13. 当通过一个映射视图修改一个文件时,最后的修改时间戳可能不会自动跟新。如果有需要,调用者应该使用SetFileTime 函数去设置时间戳。
14. 想要有一个带有可执行许可的文件,一个应用必须调用带有 PAGE_EXECUTE_READWRITE 或 PAGE_EXECUTE_READ 值中的任何一个的
CreateFileMapping 函数,并且之后调用带有 FILE_MAP_EXECUTE | FILE_MAP_WRITE 或 FILE_MAP_EXECUTE | FILE_MAP_READ 值的 MapViewOfFile 函数。
15. 在Windows Server 2012中,该函数由以下技术支持:
|
技术 |
是否支持 |
|
Server Message Block (SMB) 3.0 protocol |
是 |
|
SMB 3.0 Transparent Failover (TFO) |
是 |
|
SMB 3.0 with Scale-out File Shares (SO) |
是 |
|
Cluster Shared Volume File System (CsvFS) |
是 |
|
Resilient File System (ReFS) |
是 |
当 CsvFs 被暂停,该调用可能失败,并且该失败标志着此处有一个锁冲突。
需求:
|
Minimum supported client |
Windows XP [仅桌面应用程序] |
|
Minimum supported server |
Windows 2003 服务器版 [仅桌面应用程序] |
|
Header |
WinBase.h (包含于 Windows.h) |
|
Library |
Kernel32.lib |
|
DLL |
Kernel32.dll |




