函数功能:
创建或打开指定文件的命名或未命名的文件映射对象。
指定物理内存 NUMA 节点,请参见 CreateFileMappingNuma。
API 函数原型:
注释:_In_ 说明该参数是输入的,_In_opt_ 说明参数是输入的,同时是可选的。
HANDLE WINAPI CreateFileMapping( _In_ HANDLE hFile, _In_opt_ LPSECURITY_ATTRIBUTES lpAttributes, _In_ DWORD flProtect, _In_ DWORD dwMaximumSizeHigh, _In_ DWORD dwMaximumSizeLow, _In_opt_ LPCTSTR lpName );
参数解析:
|
参数 |
含义 |
||||||||||||||||||||||||||||||
|
hFile |
1. 指定被用来创建文件映射对象的文件句柄 |
||||||||||||||||||||||||||||||
|
lpAttributes |
1. 指向 SECURITY_ATTRIBUTES 结构的指针,并且该结构指明返回的句柄是否可以被子进程所继承,SECURITY_ATTRIBUTES 结构的 lpSecurityDescriptor 成员指定一个新文件映射对象的安全描述符 |
||||||||||||||||||||||||||||||
|
flProtect |
1. 指定文件映射对象的页面保护。对象的所有映射视图必须与此保护兼容
|
||||||||||||||||||||||||||||||
|
dwMaximumSizeHigh |
文件映射对象最大大小的高 32 位 |
||||||||||||||||||||||||||||||
|
dwMaximumSizeLow |
1. 文件映射对象最大大小的低32位 |
||||||||||||||||||||||||||||||
|
lpName |
1. 文件映射对象的名称 |
返回值:
1. 如果函数执行成功,返回值是新创建的文件映射对象的句柄。。
2. 如果在函数调用之前,该对象存在,函数将返回现有对象的句柄(并且是对象现有的大小而不是调用函数时指定的大小),并且 GetLastError 函数返回 ERROR_ALREADY_EXISTS
3. 如果函数失败,则返回值为 NULL
想要获取更多错误有关信息,请调用 GetLastError
备注:
1. 创建一个文件映射对象后,文件大小必须不超过该文件映射对象的大小;否则,并不是所有的文件内容都可以共享。
2. 如果一个应用程序指定一个文件映射对象的大小大于磁盘上的实际命名文件的大小,并且如果页面保护允许写入访问权限(也就是说,flProtect 参数指定了 PAGE_READWRITE 或 PAGE_EXECUTE_READWRITE),那么磁盘上的文件会增加大小到文件映射对象的大小。如果文件被扩展,文件旧的尾端和文件的新的尾端之间的文件的内容不保证为零,这个行为由文件系统来定义。如果磁盘上的文件不能够被扩展,那么 CreateFileMapping 函数调用失败,并且 GetLastError 函数返回 ERROR_DISK_FULL。
3. 操作系统分页文件支持的文件映射对象中的页的初始内容为0。
4. CreateFileMapping 函数返回的句柄对那个新的文件映射对象具有完全的访问权限,并且能够被任何需要文件映射对象句柄的函数所使用。
5. 多进程可以通过使用单个共享文件映射对象或创建单独的文件映射对象来共享同一文件的视图。一个文件映射对象能够被多个进程共享,通过在创建进程时继承句柄,复制句柄或通过名字打开一个文件映射对象。更多信息,请参考 CreateProcess, DuplicateHandle 和 OpenFileMapping 函数。
6. 创建一个文件映射对象并没有将视图映射到一个进程地址空间。MapViewOfFile 和 MapViewOfFileEx 函数才映射一个文件的视图到进程地址空间。
7. 在一个重要的例外情况下,来自同一文件的任何文件映射对象的文件视图在特定时间内是一致的或相同的。在一个进程中的视图和被不同进程映射的视图才能保证一致性。
8. 唯一的例外是与远程文件相联系。虽然 CreateFileMapping 函数能够处理远程文件,但是并不能保证他们的一致性。例如,如果两台电脑都将一个文件映射为可写的,并且同时改变相同的页面,每台电脑只看到他们自己对那个页面所做的修改。所以当数据在磁盘上更新的时候,并没有合并他们的内容。
9. 一个映射的文件和一个通过输入和输出(I/O)函数(ReadFile 和 WriteFile)访问的文件并不需要保持一致性。
10. 一个文件映射对象的映射视图维持着对象的内部引用,直到所有的引用被释放,文件映射对象才能够被关闭。因此,要想完全关闭一个文件映射对象,应用程序必须通过调用 UnmapViewOfFile 来解除文件映射对象的所有映射视图,并且通过调用 CloseHandle 来关闭文件映射对象的句柄。这些函数能够以任意的顺序被调用。
11. 当通过映射的视图修改文件时,最后的修改时间戳可能不能够自动更新。如果需要自动更新,可以使用 SetFileTime 来设置一个时间戳。
12. 在全局命名空间中从一个会话而不是会话 0 中来创建一个文件映射对象需要 SeCreateGlobalPrivilege 特权。注意这个特权被限制在创建文件映射对象的时候使用,而不能应用于打开一个已经存在的对象。例如,如果一个服务或者系统在全局命名空间中创建了一个文件映射对象,在任何会话中运行的任何进程都可以访问该文件映射对象,该对象提供了该调用方具有所需的访问权限。
13. Windows XP:在前几段中通过 Windows Server 2003 和 Windows XP 介绍了需求描述。
14. 使用结构化异常处理来保护写入或读取文件视图的任何代码。更多信息,请参见 Reading and Writing From a File View。
15. 为了有可执行权限的映射,应用程序必须调用 CreateFileMapping 函数,并且设置 PAGE_EXECUTE_READWRITE 或 PAGE_EXECUTE_READ。然后调用 MapViewOfFile 函数,并且设置 FILE_MAP_EXECUTE | FILE_MAP_WRITE 或 FILE_MAP_EXECUTE | FILE_MAP_READ。
16. Windows Server 2012 中,这个功能是通过以下技术支持。
|
技术 |
支持 |
|
Server Message Block (SMB) 3.0 protocol |
Yes |
|
SMB 3.0 Transparent Failover (TFO) |
Yes |
|
SMB 3.0 with Scale-out File Shares (SO) |
Yes |
|
Cluster Shared Volume File System (CsvFS) |
Yes |
|
Resilient File System (ReFS) |
Yes |
需求:
|
Minimum supported client |
Windows XP [仅桌面应用程序] |
|
Minimum supported server |
Windows 2003 [仅桌面应用程序] |
|
Header |
Winuser.h (包含于 Windows.h) |
|
Library |
User32.lib |
|
DLL |
User32.dll |
|
Unicode and ANSI names |
AppendMenuW (Unicode) 和 AppendMenuA (ANSI) |




