小弟我
CreateFile()
CreateFileMapping()
MapViewOfFile()
………………
memcpy,
………………
析构退出,一切正常。 但是,由于需创建的文件可能很大,只能用MapViewOfFile分配较小的区域。
程序流程变为: CreateFile()
CreateFileMapping()
MapViewOfFile()
………………
memcpy,
………………
UnmapViewOfFile()
MapViewOfFile()//!!!此处出现问题!!!!! 当我再次调用MapViewOfFile时出现了问题:
pbFile = (PBYTE)MapViewOfFile(hFileMapping,FILE_MAP_ALL_ACCESS,
(DWORD)(Offset)>>32), (DWORD)((Offset&0xFFFFFFFF),1000*64*1024); 其中偏移地址Offset保证为64k的整数倍,但居然pbFile还是为NULL,这是怎么回事啊,请多多指导:) 附:GetSystemInfo(&sinf);
sinf.dwAllocationGranularity为64k;
CreateFile()
CreateFileMapping()
MapViewOfFile()
………………
memcpy,
………………
析构退出,一切正常。 但是,由于需创建的文件可能很大,只能用MapViewOfFile分配较小的区域。
程序流程变为: CreateFile()
CreateFileMapping()
MapViewOfFile()
………………
memcpy,
………………
UnmapViewOfFile()
MapViewOfFile()//!!!此处出现问题!!!!! 当我再次调用MapViewOfFile时出现了问题:
pbFile = (PBYTE)MapViewOfFile(hFileMapping,FILE_MAP_ALL_ACCESS,
(DWORD)(Offset)>>32), (DWORD)((Offset&0xFFFFFFFF),1000*64*1024); 其中偏移地址Offset保证为64k的整数倍,但居然pbFile还是为NULL,这是怎么回事啊,请多多指导:) 附:GetSystemInfo(&sinf);
sinf.dwAllocationGranularity为64k;
说地址空间只有一份,而WinNT则是真正的新产生了一个地址空间返回来. 原理见
http://cn.tech.yahoo.com/021021/31/1abgg.html2。在 UnmapViewOfFile()和 MapViewOfFile()之后分别插入一条语句
::Getlasterror,看一看到底发生了什么3.检查你的硬盘和内存空间,仔细计算一下你的文件偏移地址是否合理[email protected]
1、我发现为fileMapping分配一块较大的空间后,mapView就只能分配到很小的一块了,这是怎么回事?两者用的是不同的空间吗?2、内存映射文件到底在什么时候才将数据倒入硬盘?是UnmapViewOfFile()
的时候,还是当数据积累到一定量的时候?谢谢!
http://cn.tech.yahoo.com/021021/31/1abgg.html
问题2: 当调用API的写文件命令时,OS并不是将数据立即写入磁盘文件,而是
先保存到一个数据缓冲区,并由OS决定在什么时候在将数据写如磁盘文件。
如果需要立即将数据写入内存映射文件,调用
::FlushViewOfFile
这样数据缓冲区的数据将被强行立即写入磁盘文件