内存文件映射应用举例『转』

news/2024/7/10 0:21:32 标签: null, file, attributes, 磁盘, access, byte

 

下面这些函数被应用于文件内存映射中:

1) CreateFileMapping
2) FlushViewOfFile
3) MapViewOfFile
4) MapViewOfFileEx
5) MapViewOfFileVlm
6) OpenFileMapping
7) UnmapViewOfFile  
8) UnmapViewOfFileVlm

函数详细说明:『见本页末』

 

一、CreateFileMapping 为指定文件创建一个有名或无名的文件映象;
HANDLE CreateFileMapping(
HANDLE hFile,              // 映射文件的句柄
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
                             // 安全描述符指针
DWORD flProtect,           // 对映射对象的保护
DWORD dwMaximumSizeHigh,   // 对象最大长度的高32位
DWORD dwMaximumSizeLow,    // 对象最大长度的低32位
LPCTSTR lpName             // 文件内存映射对象的名字
);

注意:
hFile:映射文件的句柄,文件的打开模式必须与flProtect参数指定的相一致;如果这个参数值为0xFFFFFFFF,那 么必须在dwMaximumSizeHigh和dwMaximumSizeLow参数中指定映射对象的大小。并且将在操作系统虚拟内存页面替换文件中创建 文件映射对象,而不是使用磁盘文件,同时必须给出这个映射对象的大小。文件映射对象通过副本,遗传或名字来共享。
lpFileMappingAttributes:安全描述符指针,决定返回句柄是否能被子进程继承,如果是NULL,那么子进程不能继承。WinNt中,如果是NULL,那么文件映射对象得到一个默认的安全描述符。
flProtect:为得到的文件试图指定保护模式,可以被设置为下列值:
PAGE_READONLY :只读属性,并且hFile对应的文件必须以GENERIC_READ形式打开。
PAGE_READWRITE:可读可写属性,并且hFile对应的文件必须以GENERIC_READ 和 GENERIC_WRITE形式打开。
PAGE_WRITECOPY:对可写区域复制后操作,并且hFile对应的文件必须以GENERIC_READ 和 GENERIC_WRITE形式打开。
dwMaximumSizeHigh,dwMaximumSizeLow:如果这两个参数为0,则文件映射对象的最大长度等于hFile指定的文件长度。
lpName: 文件映射对象的名字,如果这个名字已存在,则按照flProtect指定的来处理映射对象。如果此参数为空,则创建一个无名字的文件映射对象。如果此参数 的名字与系统事件的名字相同,则函数执行失败,GetLastError返回 ERROR_INVALID_HANDLE;

返回值:函数调用成功返回文件映射对象的句柄,如果文件映射对象已经存在则返回原有映射对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS。函数执行失败返回Null。

二、FlushViewOfFile 把文件映射视图中的修改的内容或全部写回到磁盘文件中
BOOL FlushViewOfFile(
LPCVOID lpBaseAddress,       // 修改内容的起始地址
DWORD dwNumberOfBytesToFlush // 修改的字节数目
);
函数执行成功返回非零。

三、MapViewOfFile 在调用进程的地址空间映射一个文件视图
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // 已创建的文件映射对象句柄
DWORD dwDesiredAccess,      // 访问模式
DWORD dwFileOffsetHigh,     // 文件偏移的高32位
DWORD dwFileOffsetLow,      // 文件偏移的低32位
DWORD dwNumberOfBytesToMap // 映射视图的大小
);
注意:
hFileMappingObject: 由CreateFileMapping 或 OpenFileMapping 返回的文件映射对象句柄。
dwDesiredAccess:映射视图的访问模式,与创建文件映射对象的保护模式flProtect有关,可以被设置为下列值:
FILE_MAP_WRITE:一个可读写属性的文件视图被创建,保护模式为PAGE_READWRITE
FILE_MAP_READ :一个只读属性的文件视图被创建,保护模式为PAGE_READWRITE 或 PAGE_READONLY
FILE_MAP_ALL_ACCESS:与FILE_MAP_WRITE模式相同
FILE_MAP_COPY:保护模式为PAGE_WRITECOPY时,得到一个视图文件,当你对视图文件写操作时,页面自动交换,并且你所做的修改不会损坏原始数据资料。
dwNumberOfBytesToMap:映射文件部分的大小,如果为0,则映射整个文件。
返回值:
如果成功返回返回映射视图的起始地址,如果失败返回NULL。

四、MapViewOfFileEx 在调用进程的地址空间映射一个文件视图,并且允许调用进程为映射视图指定特殊的内存地址
LPVOID MapViewOfFileEx(
HANDLE hFileMappingObject, // 文件映射对象的句柄
DWORD dwDesiredAccess,      // 访问模式
DWORD dwFileOffsetHigh,     // 文件偏移的高32位
DWORD dwFileOffsetLow,      // 文件偏移的低32位
DWORD dwNumberOfBytesToMap, // 映射视图的大小
LPVOID lpBaseAddress        // 指定映射视图的其实内存地址
);
注意:
与MapViewOfFile用法相同,但是如果指定的内存地址空间大小不够,则函数执行失败。
五、OpenFileMapping 打开一个已命名的文件映射对象
HANDLE OpenFileMapping(
DWORD dwDesiredAccess, // 访问模式
BOOL bInheritHandle,    // 继承标志
LPCTSTR lpName          // 文件映射对象名指针
);
注意:
dwDesiredAccess:访问模式与MapViewOfFile中的访问模式相同。
bInheritHandle:继承标志,是否可以被一个新的进程继承使用,如果为TRUE,就可以被一个新进程继承句柄。
返回值:
成功返回一个已命名的文件映射对象,失败返回NULL。

六、UnmapViewOfFile 删除文件的映射视图
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress   // 映射视图起始地址
);
注意:
lpBaseAddress:映射视图起始地址,由 MapViewOfFile 函数 MapViewOfFileEx产生。
返回值:
如果调用成功返回非零,并且所有指定地址内的脏页面会被写入硬盘。调用失败返回零。

例子:
/*****************************************************/
/*                                                                               */
/*这个例子创建了文件映射视图,并通过这个映射     */
/*视图来操作文件内容。                                            */
/*                                                                               */
/****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
HFILE hFile;
OFSTRUCT opBuf;
HANDLE hMapfile;
HANDLE hMapview;
BYTE *recv;
hFile=OpenFile(".//map.test",&opBuf,OF_READWRITE);
if (hFile==HFILE_ERROR)
{
   printf("open file failed!/n");
   return 1;
}
hMapfile=CreateFileMapping((HANDLE)hFile,NULL,PAGE_READWRITE,0,0,"MapTest");
if(hMapfile==NULL)
{
   printf("mapping file failed!/n");
   return 1;
}
CloseHandle((HANDLE)hFile);
hFile=0;
hMapview=MapViewOfFile(hMapfile,FILE_MAP_WRITE,0,0,0);
if(hMapview==NULL)
{
   printf("mapping view failed!/n");
   return 1;
}
recv=(BYTE *)hMapview;
printf("Mapping view's content is :%.10s /n",recv);
recv[0]='s';
printf("Mapping view's content is :%.10s /n",recv);
UnmapViewOfFile(hMapview);
return 0;
}


http://www.niftyadmin.cn/n/1536266.html

相关文章

javascript表单的Ajax 提交插件的使用

Ajax 提交插件 form.js 表单的下载地址&#xff1a;官方网站&#xff1a;http://malsup.com/jquery/form/ form.js 插件有两个核心方法&#xff1a;ajaxForm()和ajaxSubmit()&#xff0c;它们集合了从控制表单元素到决定如何管理提交进行的功能。 //ajaxForm 提交方式 $(#reg).…

Android内存泄漏检测利器:LeakCanary

Android内存泄漏检测利器&#xff1a;LeakCanary MAR 28TH, 2016 是什么&#xff1f; 一言以蔽之&#xff1a;LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary&#xff1f; 因为它简单&#xff0c;易于发现问题&#xff0c;人人可参与。 简单&#x…

TIF格式图像文件初探

作者&#xff1a;三辰卡通集团技术部 刘晖 下载源代码 http://www.vckbase.com/document/viewdoc/?id1569 一、前言  因工作需要&#xff0c;本人经常接触一些图像方面的编程工作。目前图像领域中的格式很多且大部分官方说明都是英文文档&#xff0c;实在令人头疼&#x…

React设置antd3x自定义主题,TypeError: this.getOptions is not a function的解决方法

React设置antd3x自定义主题&#xff0c;TypeError: this.getOptions is not a function的解决方法 提示&#xff1a;主要使用&#xff1a;react-app-rewired 和 customize-cra实现antd3x版本自定义主题 问题 报错图片 分析&#xff1a; 1. 由于引入less-loader(第三方库)时&a…

虚函数与纯虚函数区别

虚函数为了重载和多态的需要&#xff0c;在基类中是由定义的&#xff0c;即便定义是空&#xff0c;所以子类中可以重写也可以不写基类中的函数&#xff01; 纯虚函数在基类中是没有定义的&#xff0c;必须在子类中加以实现&#xff0c;很像java中的接口函数&#xff01; 虚函…

Java学习之Iterator(迭代器)的一般用法 (转)

迭代器&#xff08;Iterator&#xff09; 迭代器是一种设计模式&#xff0c;它是一个对象&#xff0c;它可以遍历并选择序列中的对象&#xff0c;而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象&#xff0c;因为创建它的代价小。 Java中的Iterator功能…

globalThis指向浏览器和Node.js环境下的全局对象(window/global)

文章目录一、globalThis是什么&#xff1f;二、使用步骤1. globalThis为全局变量&#xff0c;直接使用三、特点&#xff1a;一、globalThis是什么&#xff1f; globalThis 提供了一个标准的方式来获取不同环境下的全局 this 对象&#xff08;也就是全局对象自身&#xff09; …

图元文件

Windows 窗体编程图像、位图和图元文件Image 类是抽象基类&#xff0c;它提供了处理光栅图像&#xff08;位图&#xff09;和矢量图像&#xff08;图元文件&#xff09;的方法。Bitmap 类和 Metafile 类都继承自 Image 类。Bitmap 类提供了用于加载、保存和处理光栅图像的更多方…