在内存映射中要一次把文件映射进内存,用如下函数
HANDLE hNewFileMap = CreateFileMapping(hNewFile, NULL, PAGE_READWRITE, 
0, file_size,NULL);
要一部分一部分处理的时候,应该用下面的函数吧?
MapViewOfFile请教MapViewOfFile的具体用法,谢谢!(MSDN没看明白)

解决方案 »

  1.   

    LPVOID MapViewOfFile(
      HANDLE hFileMappingObject,   // handle to file-mapping object
      DWORD dwDesiredAccess,       // access mode
      DWORD dwFileOffsetHigh,      // high-order DWORD of offset
      DWORD dwFileOffsetLow,       // low-order DWORD of offset
      SIZE_T dwNumberOfBytesToMap  // number of bytes to map
    );hFileMappingObject是CreateFileMapping返回值。
    dwDesiredAccess这个限制对内存的读写,如果不想限制,取FILE_MAP_ALL_ACCESS。
    dwFileOffsetHigh和dwFileOffsetLow组成一个64位的偏移量,就是你想让view的最开始的字节,对应文件中的那个字节相对文件的偏移量。
    dwNumberOfBytesToMap是view的大小,字节数目。
      

  2.   

    是指针指向的第一个字节对应文件的位置。LPVOID pData=MapViewOfFile(hNewFileMap,FILE_MAP_ALL_ACCESS,0,1024,512);是否能够提高速度不好说。
      

  3.   

    那怎样才能提高速度呢?
    我觉得是我用内存映射的方法不对,没有把它的优越性发挥出来那参数是个变量也应该没错吧?我的是变量就不对那就是不用管什么64位的高、低字节了,是吗?
    倒数第一个是view的字节数,倒数第二个是开始映射的文件位置,倒数第三个就写0就可以?谢谢!!!
      

  4.   

    参数是变量没有问题。不过要注意类型应该匹配,注意符号问题。“倒数第一个是view的字节数,倒数第二个是开始映射的文件位置,倒数第三个就写0就可以?”->是的。你需要多快的速度?过去20G IDE硬盘在NTFS下的速度应该可以达到1M字节/秒。速度瓶颈也有可能在加密算法上面。
      

  5.   

    对文件进行分块处理
    现在是第一块的时候没有问题,可是第二块好象view不上
    第二块的时候,返回值就变成了0x00000000为什么呢?
    处理完第一块也执行了
    UnmapViewOfFile(pOldVoid);
      

  6.   

    可以用GetLastError取得错误代码。映射偏移量必须是allocation granularity的整数被。
    分块大小如果是allocation granularity的整数被,程序不用修改,allocation granularity可以用GetSystemInfo得到。如果不是整数被,则进行下面的处理:SYSTEM_INFO siSysInfo;
    GetSystemInfo(&siSysInfo);DWORD dwOffset;//偏移量
    ..//设置dwOffset的值
    BYTE * pMap;DWORD nGr=dwOffsetsiSysInfo.dwAllocationGranularity;
    DWORD dwNewOffset=dwOffset/nGr;
    dwNewOffset*=nGr;
    int nOffVar=dwOffset-dwNewOffset;
    pMap=MapViewOfFile(hNewFileMap,FILE_MAP_ALL_ACCESS,0,dwNewOffset,nSize+nOffVar);BYTE * pData=pMap+nOffVar;//这个是dwOffset所在数据地址
      

  7.   

    好象也不是那个整数倍的问题:(第一包的时候应该是没有问题的,
    (LPVOID) pOldVoid=MapViewOfFile        (hOldFileMap,FILE_MAP_COPY,0,map_addr,first_length);
    第二包的时候也改成同样的,参数一模一样,但是会出错
    返回值为0。如果文件大小不够一包就会只处理一包的数据,而且加密是正确的。
      

  8.   

    GetLastError返回的错误代码是什么?
      

  9.   

    真的是“指定的基址或文件偏移量没有对齐”谢谢!这是我第一次用这个GetLastError真是太厉害了!好,我再试试,多谢!刚才“发出回复”半天也没回复成:( 希望这次可以