CreateFileMapping函数为指定的文件创建一个命名或未命名的文件映射对象。
手柄CreateFileMapping(
HANDLE 【HFILE】, | //处理文件进行映射 |
LPSECURITY_ATTRIBUTES 【lpFileMappingAttributes】, | //可选的安全属性 |
DWORD 【//访问类型保护】, | //保护映射对象 |
DWORD 【dwMaximumSizeHigh】, | //对象大小的高32位 |
DWORD 【dwMaximumSizeLow】, | //对象大小的低位32位 |
LPCTSTR 【lpName】 | //文件映射对象的名称 |
); |
参数
【HFILE】
标识要从中创建映射对象的文件。该文件必须以与【//访问类型保护】参数指定的保护标志兼容的访问模式打开。建议尽管不需要,您打算映射的文件被打开以进行独占访问。
如果【HFILE】为(HANDLE)0xFFFFFFFF,则调用进程还必须在【dwMaximumSizeHigh】和【dwMaximumSizeLow】参数中指定映射对象大小。该函数创建由操作系统页面文件支持的指定大小的文件映射对象,而不是文件系统中的命名文件。文件映射对象可以通过重复,继承或者名称共享。
【lpFileMappingAttributes】
指向SECURITY_ATTRIBUTES结构的指针,用于确定返回的句柄是否可由子进程继承。如果【lpFileMappingAttributes】为NULL,则不能继承该句柄。
Windows NT:结构的lpSecurityDescriptor成员指定新文件映射对象的安全描述符。如果【lpFileMappingAttributes】为NULL,文件映射对象将获得默认安全描述符。
Windows 95:结构的lpSecurityDescriptor成员将被忽略。
【//访问类型保护】
当文件被映射时,指定文件视图所需的保护。此参数可以是以下值之一:
值 | 描述 |
PAGE_READONLY | 给予承诺的页面区域的只读访问权限。尝试写入或执行承诺的区域导致访问冲突。必须使用GENERIC_READ访问创建由【HFILE】参数指定的文件。 |
PAGE_READWRITE | 向承诺的页面区域提供读写访问权限。必须使用GENERIC_READ和GENERIC_WRITE访问创建【HFILE】指定的文件。 |
PAGE_WRITECOPY | 在写入访问页面的承诺区域时提供副本。必须使用GENERIC_READ和GENERIC_WRITE访问创建【HFILE】参数指定的文件。 |
此外,应用程序可以通过将以下部分属性值中的一个或多个与前一页保护值之一组合(使用按位OR运算符)来指定某些段属性:
值 | 描述 |
SEC_COMMIT | 在存储器或磁盘上的页面文件中分配部分的所有页面的物理存储。这是默认设置。 |
SEC_IMAGE | 为部分文件映射指定的文件是可执行映像文件。因为映像信息和文件保护是从图像文件中获得的,所以没有其他属性对SEC_IMAGE有效。 |
SEC_NOCACHE | 部分的所有页面都将设置为不可缓存。此属性适用于需要将各种锁定结构置于内存中的结构,从而不会将其提取到处理器中。在80x86和MIPS机器上,使用这些结构的缓存只会降低性能,因为硬件保持缓存一致。某些设备驱动程序需要非缓存数据,以便程序可以写入物理内存。SEC_NOCACHE要求也可以设置SEC_RESERVE或SEC_COMMIT。 |
SEC_RESERVE | 保留部分的所有页面,而不分配物理存储。任何其他分配操作的页面的保留范围在其被释放之前都不能被使用。在后续调用VirtualAlloc功能时,可以提交保留的页面。该属性仅在【HFILE】参数为(HANDLE)0xFFFFFFFF时有效;即由操作系统页面文件支持的文件映射对象。 |
【dwMaximumSizeHigh】
指定文件映射对象的最大大小的高32位。
【dwMaximumSizeLow】
指定文件映射对象的最大大小的低32位。如果此参数和【dwMaximumSizeHig】为零,则文件映射对象的最大大小等于由【HFILE】标识的文件的当前大小。
【lpName】
指向一个以null结尾的字符串,指定映射对象的名称。该名称可以包含除反斜杠字符(\\)之外的任何字符。
如果此参数与现有命名映射对象的名称相匹配,则该函数将请求访问具有【//访问类型保护】指定的保护的映射对象。
如果此参数为NULL,则创建映射对象而不使用名称。
返回值
如果函数成功,则返回值是文件映射对象的句柄。如果对象在函数调用之前存在,则GetLastError函数返回ERROR_ALREADY_EXISTS,返回值是现有文件映射对象(其当前大小,而不是新指定大小)的有效句柄。如果映射对象不存在,GetLastError返回零。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
备注
创建文件映射对象后,文件大小不得超过文件映射对象的大小;如果是,则并非所有文件的内容都可以共享。
如果应用程序指定文件映射对象的大小大于磁盘上实际命名文件的大小,则会增加磁盘上的文件以匹配文件映射对象的指定大小。
CreateFileMapping返回的句柄可以完全访问新的文件映射对象。它可以与需要文件映射对象的句柄的任何函数一起使用。文件映射对象可以通过进程创建,通过句柄重复或名称来共享。有关复制句柄的信息,请参阅DuplicateHandle.有关按名称打开文件映射对象的信息,请参阅OpenFileMapping.
Windows 95:用于创建文件映射对象的文件句柄必须在随后调用文件I / O功能(例如ReadFile和WriteFile)时使用。一般来说,如果在成功调用CreateFileMapping函数中使用了一个文件句柄,除非先关闭相应的文件映射对象,否则不要使用该句柄。
创建文件映射对象可以创建映射文件的视图,但不映射视图。MapViewOfFile和MapViewOfFileEx函数将文件的视图映射到进程的地址空间。
有一个重要的例外,从单个文件映射对象导出的文件视图在给定时间是一致的或相同的。如果多个进程具有相同文件映射对象的句柄,则当数据映射文件的视图时,它们会看到数据的一致视图。
异常与远程文件有关。虽然CreateFileMapping与远程文件配合使用,但它并不保持一致。例如,如果两台计算机都将文件映射为可写入,并且两者都改变??了同一页面,则每台计算机只会看到自己对该页面的写入。当数据在磁盘上更新时,它不会合并。
通过输入和输出(I / O)功能(ReadFile和WriteFile)访问的映射文件和文件不一定一致。
要完全关闭文件映射对象,应用程序必须通过调用UnmapViewOfFile取消映射文件映射对象的所有映射视图,并通过调用CloseHandle关闭文件映射对象句柄。调用这些功能的顺序并不重要。调用UnmapViewOfFile是必要的,因为文件映射对象的映射视图维护对象的内部打开句柄,并且文件映射对象将不会关闭,直到其关闭所有打开的句柄。
例
要实现映射对象创建功能,如果该对象已存在,则该应用程序可以使用以下代码。
hMap = CreateFileMapping(...);
if (hMap != NULL && GetLastError() == ERROR_ALREADY_EXISTS) {
CloseHandle(hMap);
hMap = NULL;
}
return hMap;
也可以看看
CloseHandle, DuplicateHandle, MapViewOfFile, MapViewOfFileEx, OpenFileMapping, ReadFile, SECURITY_ATTRIBUTES, UnmapViewOfFile, VirtualAlloc, WriteFile