在内存映射中要一次把文件映射进内存,用如下函数
HANDLE hNewFileMap = CreateFileMapping(hNewFile, NULL, PAGE_READWRITE,
0, file_size,NULL);
要一部分一部分处理的时候,应该用下面的函数吧?
MapViewOfFile请教MapViewOfFile的具体用法,谢谢!(MSDN没看明白)
HANDLE hNewFileMap = CreateFileMapping(hNewFile, NULL, PAGE_READWRITE,
0, file_size,NULL);
要一部分一部分处理的时候,应该用下面的函数吧?
MapViewOfFile请教MapViewOfFile的具体用法,谢谢!(MSDN没看明白)
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的大小,字节数目。
我觉得是我用内存映射的方法不对,没有把它的优越性发挥出来那参数是个变量也应该没错吧?我的是变量就不对那就是不用管什么64位的高、低字节了,是吗?
倒数第一个是view的字节数,倒数第二个是开始映射的文件位置,倒数第三个就写0就可以?谢谢!!!
现在是第一块的时候没有问题,可是第二块好象view不上
第二块的时候,返回值就变成了0x00000000为什么呢?
处理完第一块也执行了
UnmapViewOfFile(pOldVoid);
分块大小如果是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所在数据地址
(LPVOID) pOldVoid=MapViewOfFile (hOldFileMap,FILE_MAP_COPY,0,map_addr,first_length);
第二包的时候也改成同样的,参数一模一样,但是会出错
返回值为0。如果文件大小不够一包就会只处理一包的数据,而且加密是正确的。