lpMapAddress = MapViewOfFile( hMapFile,FILE_MAP_ALL_ACCESS, 0,0x20000,0x8c04);
我一共映射了0x8c04大小的空间,为什么我通过返回的lpMapAddress指针到内存中去查时,发现映射到内存的的字节数会大于ox8c04呢,大了1020个字节。

解决方案 »

  1.   

    int bytemap=0x8c04;lpMapAddress = MapViewOfFile( hMapFile,FILE_MAP_ALL_ACCESS, 0,0x20000,bytemap);执行后,检查bytemap的大小,就是实际映射的大小。
      

  2.   

    bytemap是输入参数啊,我现在就是指定映射的大小为0x8c04,但是我发现映射到内存中的数据超过了这么多
      

  3.   

     The combination of the high and low offsets must specify an offset within the file that matches the system's memory allocation granularity, or the function fails. That is, the offset must be a multiple of the allocation granularity
    这里的allocation granularity就是64kb(通常下)
      

  4.   

    allocation granularity和commit的粒度不一样
      

  5.   

    windows核心编程上描述:使用一块地址空间时会先预定再调拨(commit),前者要求预定的起始地址是分配粒度(64kb)的整数倍,后者要求大小是页面大小(4kb)的整数倍。windows核心编程和MSDN都没有说映射的大小一定要是页面大小(4kb)的整数倍。这个参数如果传0,表示映射整个文件,但是这个文件的大小并不一定就是4kb的整数倍吧,只说了文件偏移的起始地址是分配粒度的整数倍。不知道这个函数内部实现是否会4kb对齐,不过我觉得不太可能会。
      

  6.   

    windows核心编程上描述:使用一块地址空间时会先预定再调拨(commit),前者要求预定的起始地址是分配粒度(64kb)的整数倍,后者要求大小是页面大小(4kb)的整数倍。windows核心编程和MSDN都没有说映射的大小一定要是页面大小(4kb)的整数倍。这个参数如果传0,表示映射整个文件,但是这个文件的大小并不一定就是4kb的整数倍吧,只说了文件偏移的起始地址是分配粒度的整数倍。不知道这个函数内部实现是否会4kb对齐,不过我觉得不太可能会。