|
Send 中最关键的3句:
m_hMapObject = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL, PAGE_READWRITE, 0, 0x1000, _TEXT("shared_memory"));
m_pszMapView = (LPSTR)MapViewOfFile(m_hMapObject,FILE_MAP_WRITE, 0, 0, 0);
strcpy(m_pszMapView,m_strSend);
Receive 中最关键的3句:
m_hMapObject = OpenFileMapping(FILE_MAP_READ,FALSE,_TEXT("shared_memory"));
m_pszMapView = (LPSTR)MapViewOfFile(m_hMapObject,FILE_MAP_READ, 0, 0, 0);
m_strText = m_pszMapView;
1.调用CreateFile打开您想要映射的文件;
2.调用CreateFileMapping,创建一个内存映射对象;
3.调用MapViewOfFile,将文件的全部或部分映射进内存;
4.调用UnmapViewOfFile来解除文件映射;
5.调用CloseHandle来关闭内存映射文件;
6.调用CloseHandle来关闭文件。
本程序用的是页面文件,而且并没有解除文件映射,而是在 Timer 事件里不断地读取 Send 改变的内存。
4GB是每个进程的虚拟地址空间,当程序运行的时候,会由操作系统以分页的方式,部分映射到物理内存。
所有统统的函数都是操作的虚拟内存,就是那默认的那4GB,就连内核方式下的也如此.物理内存对用户是不可见的,也是不可操作的
内存映射文件和虚拟内存相似,只是不同的是,虚拟内存是系统的页文件,而内存映射文件是物理磁盘文件.它的工作方式是以文件的某一段为映射的起始和终点, 比如文件大小为100KB,我从开头映射到末尾,就是100*1024*1024个字节,那么我们可以在虚拟的内存中间内保留一个地址空间,比如说为0x12345(首) ----> ?(尾),在需要的时候我们可以把磁盘文件提交到那个区域里面, 那么我们就可以在这段内存里面来操作文件..dll和.exe就是按这个方式来加载起来的. 所以说,所有函数都不是直接操作物理内存的.
1. 内存映射文件简单概述
内存文件映射也是Windows的一种内存管理方法,提供了一个统一的内存管理特征,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问。通过文件映射这种使磁盘文件的全部或部分内容与进程虚拟地址空间的某个区域建立映射关联的能力,可以直接对被映射的文件进行访问,而不必执行文件I/O操作也无需对文件内容进行缓冲处理。内存文件映射的这种特性是非常适合于用来管理大尺寸文件的。
2. 使用内存映射文件的一般流程
在某些特殊行业,经常要面对十几GB乃至几十GB容量的巨型文件,而一个32位进程所拥有的虚拟地址空间只有232 = 4GB,显然不能一次将文件映像全部映射进来。对于这种情况只能依次将大文件的各个部分映射到进程中的一个较小的地址空间。这需要对上面的一般流程进行适当的更改:
1)映射文件开头的映像;
2)对该映像进行访问;
3)取消此映像;
4)映射一个从文件中的一个更深的位移开始的新映像;
5)重复步骤2,直到访问完全部的文件数据。
[ 本帖最后由 VBProFan 于 2009-1-12 09:52 编辑 ] |
|