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 !回答者奖励盐一袋。。

解决方案 »

  1.   

    那两个参数就是映射文件的大小,但是如果都是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.
      

  2.   

    第一个问题,传递两个0是为了在补改变文件的大小的情况下访问文件。如果你磁盘上的文件大小为0字节,CreateFileMapping就会出错。你那个想法是对的,创建一个内存映射文件,相当于预订一块地址空间,然后将空间区域调拨给物理存储器
      

  3.   

    MapViewOfFile的第三个跟第四个参数是设置映射的位置从哪开始,一个是高位,一个是低位,这两个数据组合起来就是真正的映射的位置,第五个参数就是映射的大小了
      

  4.   


    MapViewOfFile的第三个第四个参数+第五个参数的意思我都知道,我从MSDN中都会背了,你也知道最后一个参数就是映射的大小了,那我把最后一个参数设为8,表示我映射8个字节,为什么运行会出错?