''=(+
''&0$2"14
!"函数负责把文件数据映射到进程的地址空间,参数
- 2<, 为 返回的文件映像对象句柄。参数
',, 则再次指定了对文件数据的访问方式,而且同样要与
函数所设置的保护属性相匹配。虽然这里一再对保护属性进行重复
设置看似多余,但却可以使应用程序能更多的对数据的保护属性实行有效控
制。!"函数允许全部或部分映射文件,在映射时,需要指定数据文件的偏
移地址以及待映射的长度。其中,文件的偏移地址由 '' 型的参数
=% - 和 =( 组成的 9: 位值来指定,而且必须是操作系统的
分配粒度的整数倍,对于 操作系统,分配粒度固定为 9:>。当然,也可以通
过如下代码来动态获取当前操作系统的分配粒度:
*.*)/&"4
*1$"?"4
'',01@"A,014
参数 &0$2"1 指定了数据文件的映射长度,这里需要特别指出的
是,对于 B6 操作系统,如果 !"无法找到足够大的区域来存放
整个文件映射对象,将返回空值(&#(();但是在 CCC
下,!"只需要为必要的视图找到足够大的一个区域即可,而无须考虑整个
文件映射对象的大小。
在完成对映射到进程地址空间区域的文件处理后,需要通过函数
#$!"完成对文件数据映像的释放,该函数原型声明如下:
(#$!"(!'4
唯一的参数 lpBaseAddress 指定了返回区域的基地址,必须将其设定为
MapViewOfFile()的返回值。在使用了函数 MapViewOfFile()之后,必须要有对应的
UnmapViewOfFile()调用,否则在进程终止之前,保留的区域将无法释放。除此之外,前面
还曾由 CreateFile()和 CreateFileMapping()函数创建过文件内核对象和文件映射内核对象,
在进程终止之前有必要通过 CloseHandle()将其释放,否则将会出现资源泄漏的问题。
除了前面这些必须的 API 函数之外,在使用内存映射文件时还要根据情况来选用其他
一些辅助函数。例如,在使用内存映射文件时,为了提高速度,系统将文件的数据页面进
行高速缓存,而且在处理文件映射视图时不立即更新文件的磁盘映像。为解决这个问题可
以考虑使用 FlushViewOfFile()函数,该函数强制系统将修改过的数据部分或全部重新写入
磁盘映像,从而可以确保所有的数据更新能及时保存到磁盘。