回,在调用该函数时需要根据是否需要数据读写和文件的共享方式来设置参数dwdesiredaccess和dwsharemode,错误的参数设置将会导致相应操作时的失败。
handle createfilemapping(handle hfile,
lpsecurity_attributes lpfilemappingattributes,
dword flprotect,
dword dwmaximumsizehigh,
dword dwmaximumsizelow,
lpctstr lpname);
createfilemapping()函数创建一个文件映射内核对象,通过参数hfile指定待映射到进程地址空间的文件句柄(该句柄由createfile()函数的返回值获取)。由于内存映射文件的物理存储器实际是存储于磁盘上的一个文件,而不是从系统的页文件中分配的内存,所以
系统不会主动为其保留地址空间区域,也不会自动将文件的存储空间映射到该区域,为了让系统能够确定对页面采取何种保护属性,需要通过参数flprotect来设定,保护属性page_readonly、page_readwrite和page_writecopy分别表示文件映射对象被映射后,可以读取、读写文件数据。在使用page_readonly时,必须确保createfile()采用的是generic_read参数;page_readwrite则要求createfile()采用的是generic_read|generic_write参数;至于属性page_writecopy则只需要确保createfile()采用了generic_read和generic_write其中之一即可。dword型的参数dwmaximumsizehigh和dwmaximumsizelow也是相当重要的,指定了文件的最大字节数,由于这两个参数共64位,因此所支持的最大文件长度为16eb,几乎可以满足任何大数据量文件处理场合的要求。
lpvoid mapviewoffile(handle hfilemappingobject,
dword dwdesiredaccess,
dword dwfileoffsethigh,
d
word dwfileoffsetlow,
dword dwnumberofbyt
estomap);
mapviewoffile()函数负责把文件数据映射到进程的地址空间,参数hfilemappingobject为createfilemapping()返回的文件映像对象句柄。参数dwdesiredaccess则再次指定了对文件数据的访问方式,而且同样要与createfilemapping()函数所设置的保护属性相匹配。虽然这里一再对保护属性进行重复设置看似多余,但却可以使应用程序能更多的对数据的保护属性实行有效控制。mapviewoffile()函数允许全部或部分映射文件,在映射时,需要指定数据文件的偏移地址以及待映射的长度。其中,文件的偏移地址由dword型的参数dwfileoffsethigh和dwfileoffsetlow组成的64位值来指定,而且必须是操作系统的分配粒度的整数倍,对于windows操作系统,分配粒度固定为64kb。当然,也可以通过如下代码来动态获取当前操作系统的分配粒度:
system_info sinf;
getsysteminfo(&sinf);
dword dwallocationgranularity = sinf.dwallocationgranularity;
参数dwnumberofbytestomap指定了数据文件的映射长度,这里需要特别指出的是,对于windows 9x操作系统,如果mapviewoffile()无法找到足够大的区域来存放整个文件映射对象,将返回空值(null);但是在windows 2000下,mapviewoffile()只需要为必要的视图找到足够大的一个区域即可,而无须考虑整个文件映射对象的大小。
在完成对映射到进程地址空间区域的文件处理后,需要通过函数unmapviewoffile()完成对文件数据映像的释放,该函数原型声明如下:
bool unmapviewoffile(lpcvoid lpbaseaddress);
唯一的参数lpbaseaddress指定了返回区域的基地址,必须将其设定为mapviewoffile()的返回值。在使用了函数mapviewoffile()之后,必须要有对应的unmapviewoffile()调用,否则在进程终止之前,保留的区域将无法释放。除此之外,前面还曾由createfile()和createfilemapping()函数创建过文件内核对象和文件映射内核对象,在进程终止之前有必要通过closehandle()将其释放,否则将会