小弟我
      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; 

解决方案 »

  1.   

    感谢你的信任。由于我看不到你的源代码,所以我只能提供一些思路:1。你的OS是WINNT还是WIN9X,两种不同的操作系统,对MapViewOfFile所映射的VIEW来说是不同的。如果是Win9x,系统并没有额外再映射一个新的地址给它,而只是把原先的基地址加上一个偏移量做为新的视的地址而返回,换句话
    说地址空间只有一份,而WinNT则是真正的新产生了一个地址空间返回来. 原理见
      http://cn.tech.yahoo.com/021021/31/1abgg.html2。在  UnmapViewOfFile()和 MapViewOfFile()之后分别插入一条语句
       ::Getlasterror,看一看到底发生了什么3.检查你的硬盘和内存空间,仔细计算一下你的文件偏移地址是否合理[email protected]
      

  2.   

    我发现了问题的原因,是申请的mapView已经超出了所申请的FileMapping空间!我还两个问题:
    1、我发现为fileMapping分配一块较大的空间后,mapView就只能分配到很小的一块了,这是怎么回事?两者用的是不同的空间吗?2、内存映射文件到底在什么时候才将数据倒入硬盘?是UnmapViewOfFile()
    的时候,还是当数据积累到一定量的时候?谢谢!
      

  3.   

    问题1: 你仔细看一下
            http://cn.tech.yahoo.com/021021/31/1abgg.html
    问题2: 当调用API的写文件命令时,OS并不是将数据立即写入磁盘文件,而是
           先保存到一个数据缓冲区,并由OS决定在什么时候在将数据写如磁盘文件。
           如果需要立即将数据写入内存映射文件,调用
          ::FlushViewOfFile
          这样数据缓冲区的数据将被强行立即写入磁盘文件