关于内存映射文件的一点小问题,看在盐的面子上进来吧。。。。

yiruirui0507 2011-03-18 12:28:47
RT:当映射整个文件的时候没问题,把那几个参数设置成0就OK了。
贴一下测试代码吧
#include "windows.h"
#include<tchar.h>
#include <iostream>

using namespace std;



int _tmain(int argc, _TCHAR* argv[])

{

// Open the file that we want to map.

// 注意请在c盘,自己创建一个data.txt文件,并写入内容

HANDLE hFile = ::CreateFile("C:\\data.txt",

GENERIC_READ | GENERIC_WRITE,

0,

NULL,

OPEN_ALWAYS,

FILE_ATTRIBUTE_NORMAL,

NULL);



// Create a file-mapping object for the file.

HANDLE hFileMapping = ::CreateFileMapping(hFile,

NULL,

PAGE_WRITECOPY,

0, 0,//映射对象的大小,这个大小不晓得有什么作用,麻烦知道的告诉一下,不胜感激,我也改过10等等一些数字,发现无论改多少都不行,必须为0才行,什么情况呢?

NULL);




PBYTE pbFile = (PBYTE)::MapViewOfFile(hFileMapping, FILE_MAP_COPY, 0,64*1024, 0);//这里很关键,如果改成0,0(最后两个参数)表示起始映射偏移为0,映射整个文件,我这里设置为64*1024是为了验证这个参数必须是系统分配内存粒度的整数倍,从而达到对齐的效果,这也是MSDN中规定的,当然大家测试的时候可以写成0就行,否则你还得找个大于64K的txt文件来测试,挺累的,哈哈,当我把最后那个参数改成8,也就是我只是想映射8个字节,但是运行出错,IDE VC6.0,麻烦大家测试一下,谢谢了先

//cout << pbFile << endl;
FILE *fp;
fp=fopen("xx.txt","w");

//fscanf(fp,"%s",pbFile);
fputs((char *)pbFile,fp);//为了看到结果我故意把输出到了文件中,大家测试的时候可以根据情况
fclose(fp);

::UnmapViewOfFile(pbFile);



::CloseHandle(hFileMapping);

::CloseHandle(hFile);



return 0;

}

问题已经放在代码注释中了,基本上算是2个问题吧,想映射部分(比如8个字节)该如何实现?
文件映射对象的大小有什么作用?为什么我改了好多数都不行呢?MSDN中也没查出个所以然,
其实我把createfilemapping当成是申请内存空间这么理解大家认为对吗,大家是如何理解的,这个映射坦白说看的稀里糊涂的,茫然一片。。。。。。
所以来论坛求助大家,3Q,double !回答者奖励盐一袋。。。。。
...全文
127 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiruirui0507 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huangcheng90 的回复:]
第一个问题,传递两个0是为了在补改变文件的大小的情况下访问文件。如果你磁盘上的文件大小为0字节,CreateFileMapping就会出错。

你那个想法是对的,创建一个内存映射文件,相当于预订一块地址空间,然后将空间区域调拨给物理存储器
[/Quote]

我对内存映射文件的理解:
一个是(磁盘)文件,一个是视图VIEW(在内存上)
这两个之间需要建立联系,用的就是HMAPFILE文件映射对象建立联系的对吧
比如说磁盘文件内容是 1 2 3 4 5 6
我想映射的内容是 3 4 5
那此时文件映射对象的内容是什么?
他是如何把3 4 5映射到内存中的?这里的内存其实不一定是物理内存了,是进程的地址空间罢了,进程的地址空间都有4G,其中2G是OS的,其他2G才是用户的,那我的内存就1G,那其他的空间也会模仿虚拟空间那样放到磁盘上吧,那如果我这个文件是3G大,全部映射也需要3G的空间,而进程的地址空间其实只有2G,另外2G是OS的,那这个多余的1G该如何处理?

呵呵,问题有点多,如果你不方便在这里说的话,可以留下你的交流方式,用一些IM软件交流比论坛要好很多的,QQ:1071545795
yiruirui0507 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huangcheng90 的回复:]
第一个问题,传递两个0是为了在补改变文件的大小的情况下访问文件。如果你磁盘上的文件大小为0字节,CreateFileMapping就会出错。

你那个想法是对的,创建一个内存映射文件,相当于预订一块地址空间,然后将空间区域调拨给物理存储器
[/Quote]
看样子你对内存映射文件的原理比较清楚啊,能否给讲讲?简单的说一下?能明白就行。
yiruirui0507 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fishion 的回复:]
MapViewOfFile的第三个跟第四个参数是设置映射的位置从哪开始,一个是高位,一个是低位,这两个数据组合起来就是真正的映射的位置,第五个参数就是映射的大小了
[/Quote]

MapViewOfFile的第三个第四个参数+第五个参数的意思我都知道,我从MSDN中都会背了,你也知道最后一个参数就是映射的大小了,那我把最后一个参数设为8,表示我映射8个字节,为什么运行会出错?
fishion 2011-03-18
  • 打赏
  • 举报
回复
MapViewOfFile的第三个跟第四个参数是设置映射的位置从哪开始,一个是高位,一个是低位,这两个数据组合起来就是真正的映射的位置,第五个参数就是映射的大小了
Dreadnought 2011-03-18
  • 打赏
  • 举报
回复
第一个问题,传递两个0是为了在补改变文件的大小的情况下访问文件。如果你磁盘上的文件大小为0字节,CreateFileMapping就会出错。

你那个想法是对的,创建一个内存映射文件,相当于预订一块地址空间,然后将空间区域调拨给物理存储器
fishion 2011-03-18
  • 打赏
  • 举报
回复
那两个参数就是映射文件的大小,但是如果都是0的话,解释如下
If this parameter and dwMaximumSizeHigh are 0 (zero), the maximum size of the file mapping object is equal to the current size of the file that hFile identifies.

jyh_baoding 2011-03-18
  • 打赏
  • 举报
回复
自己看看文档

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧