windows sdk编程系列文章11 ---- 内存映射文件.doc

windows sdk编程系列文章11 ---- 内存映射文件.doc

ID:52199600

大小:47.50 KB

页数:11页

时间:2020-03-24

windows sdk编程系列文章11 ---- 内存映射文件.doc_第1页
windows sdk编程系列文章11 ---- 内存映射文件.doc_第2页
windows sdk编程系列文章11 ---- 内存映射文件.doc_第3页
windows sdk编程系列文章11 ---- 内存映射文件.doc_第4页
windows sdk编程系列文章11 ---- 内存映射文件.doc_第5页
资源描述:

《windows sdk编程系列文章11 ---- 内存映射文件.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、windowssdk编程系列文章----内存映射文件2008-04-1319:40本课中我们将要讲解内存映射文件并且演示如何运用它。您将会发现使用内存映射文件是非常简单的。理论:如果您仔细地研究了前一课的例子,就会发现它有一个严重的缺陷:如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字符串刚好超过内存块的边界又该如何处理?对于第一个问题,您也许会说,只要不断地读就不解决了吗。至于第二个问题,您又会说在内存块的边界处做一些特别的处理,譬如放上一些标志位就可以了。原理上确实是行得通,但是这随问

2、题复杂程度加深而显得非常难以处理。其中的第二个问题是有名的边界判断问题,程序中许许多多的错误都是由此引起。想一想,如果我们能够分配一个能够容纳整个文件的大内存块该多好啊,这样这两个问题不都迎刃而解了吗?是的,WIN32的内存映射文件确实允许我们分配一个装得下现实中可能存在的足够大的文件的内存。利用内存映射文件您可以认为操作系统已经为您把文件全部装入了内存,然后您只要移动文件指针进行读写即可了。这样您甚至不需要调用那些分配、释放内存块和文件输入/输出的API函数,另外您可以把这用作不同的进程之间共享数据

3、的一种办法。运用内存映射文件实际上没有涉及实际的文件操作,它更象为每个进程保留一个看得见的内存空间。至于把内存映射文件当成进程间共享数据的办法来用,则要加倍小心,因为您不得不处理数据的同步问题,否则您的应用程序也许很可能得到过时或错误的数据甚至崩溃。本课中我们将主要讲述内存映射文件,将不涉及进程间的同步。WIN32中的内存映射文件应用非常广泛,譬如:即使是系统的核心模块---PE格式文件装载器也用到了内存映射文件,因为PE格式的文件并不是一次性加载到内存中来的,譬如他它在首次加载时只加载必需加载的部分

4、,而其他部分在用到时再加载,这正好可以利用到内存映射文件的长处。实际中的大多数文件存取都和PE加载器类似,所以您在处理该类问题时也应该充分利用内存映射文件。内存映射文件本身还是有一些局限性的,譬如一旦您生成了一个内存映射文件,那么您在那个会话期间是不能够改变它的大小的。所以内存映射文件对于只读文件和不会影响其大小的文件操作是非常有用的。当然这并不意味着对于会引起改变其大小的文件操作就一定不能用内存影射文件的方法,您可以事先估计操作后的文件的可能大小,然后生成这么大小一块的内存映射文件,然后文件的长度就

5、可以增长到这么一个大小。我们的解释够多的了,接下来我们就看看实现的细节:1.调用CreateFile打开您想要映射的文件。2.调用CreateFileMapping,其中要求传入先前CreateFile返回的句柄,该函数生成一个建立在CreateFile函数创建的文件对象基础上的内存映射对象。1.调用MapViewOfFile函数映射整个文件的一个区域或者整个文件到内存。该函数返回指向映射到内存的第一个字节的指针。2.用该指针来读写文件。3.调用UnmapViewOfFile来解除文件映射。4.调用C

6、loseHandle来关闭内存映射文件。注意必须传入内存映射文件的句柄。5.调用CloseHandle来关闭文件。注意必须传入由CreateFile创建的文件的句柄。例子:见光盘FirstWindow11下面的例子允许用户通过“打开文件”对话框来打开一个文件,然后用内存映射文件来打开该文件,如果成功,窗口的标题条会显示打开的文件的名称,您可以通过选择“File/Save”菜单项来把换名保存。该程序将会把打开的文件的内容存到新文件中去。注意,这整个过程您根本就没有用到GlobalAlloc这样的分配内存

7、的函数。#include"Windows.h"#include"tchar.h"TCHARClassName[]=_T("Win32FileMappingClass");TCHARAppName[]=_T("Win32FileMappingExample");TCHARMenuName[]=_T("FirstMenu");HINSTANCEg_hInstance;#defineIDM_OPEN1#defineIDM_SAVE2#defineIDM_EXIT3#defineMAXSIZE260OPENF

8、ILENAMEg_ofn;TCHARFilterString[]=_T("AllFiles*.*TextFiles*.txt");TCHARbuffer[MAXSIZE];HANDLEhMapFile;HANDLEhFileRead;HANDLEhFileWrite;HMENUhMenu;void*pMemory;DWORDSizeWritten;voidCloseMapFile(){   CloseHandle(hMapFile);  

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。