麻烦各位看下,我用内存映射的方式来合并文件,为什么在第二次while循环中调用          
 LPBYTE lpMapAllAdress = (LPBYTE)MapViewOfFile(hFileMapAll,FILE_MAP_ALL_ACCESS,(DWORD)(i64Offset >> 32), (DWORD)(i64Offset & 0xFFFFFFFF),dwBytesInBlock);时不成功,lpMapAllAdress为空。
#define MAKEINT64(a,b) ((LONG64)(DWORD)(a)|(LONG64)(DWORD)(b)<<32)
LONG64 GetFileSizeEx(CString strFileName)
{
        WIN32_FIND_DATA infoFile;
        HANDLE hFile = FindFirstFile(strFileName,&infoFile);
        if (INVALID_HANDLE_VALUE == hFile)
        {
           return -1;
        }        FindClose(hFile);
        return MAKEINT64(infoFile.nFileSizeLow,infoFile.nFileSizeHigh);
}        CString strFile1 = "d:\\20110611174036_1.AVI";
        CString strFile2 = "d:\\20110611183040_1.AVI";
        // TODO: Add your control notification handler code here
        LONG64 i64FileSize1 = GetFileSizeEx(strFile1);
        LONG64 i64FileSize2 = GetFileSizeEx(strFile2);
        
        if (i64FileSize1==-1|| i64FileSize2 == -1)
        {
                return;
        }
        
        SYSTEM_INFO sinf;
        HANDLE hFile_All = CreateFile("D:\\Merge.avi",GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,NULL);        HANDLE hFileMapAll = CreateFileMapping(hFile_All, NULL, PAGE_READWRITE, 
        DWORD)((i64FileSize1 + i64FileSize2) >> 32),(DWORD)((i64FileSize1 + i64FileSize2)&0xFFFFFFFF), NULL);
        
        
        if (hFileMapAll == NULL)
        {
                CloseHandle(hFile_All);
                return;
        }
        
        CloseHandle(hFile_All);
        
        GetSystemInfo(&sinf);
        DWORD dwGran = sinf.dwAllocationGranularity;
        HANDLE hFile1 = CreateFile  (strFile1,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
        
        HANDLE hFileMapping1 = CreateFileMapping(hFile1,NULL,PAGE_READONLY,0,0,NULL);
                HANDLE hFile2 = CreateFile(strFile2,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
        HANDLE hFileMapping2 = CreateFileMapping(hFile2,NULL,PAGE_READONLY,0,0,NULL);
                DWORD dwFileSizeHigh1 = 0;
        LONG64 qwFileSize1 = GetFileSize(hFile1,&dwFileSizeHigh1);
        qwFileSize1 +=(((LONG64)dwFileSizeHigh1)<<32);
         
        __int64 i64Offset = 0;
        
        while (qwFileSize1>0)
        {
                 DWORD dwBytesInBlock = sinf.dwAllocationGranularity;
                if (qwFileSize1  < sinf.dwAllocationGranularity)
                {
                        dwBytesInBlock = (DWORD) qwFileSize1;
                }                LPBYTE lpMapAllAdress = (LPBYTE)MapViewOfFile(hFileMapAll,FILE_MAP_ALL_ACCESS,(DWORD)(i64Offset >> 32), (DWORD)(i64Offset & 0xFFFFFFFF),dwBytesInBlock);
                LPBYTE lpMapAddress1 = (LPBYTE) MapViewOfFile(hFileMapping1,FILE_MAP_READ,(DWORD)(i64Offset >> 32), (DWORD)(i64Offset & 0xFFFFFFFF),dwBytesInBlock);                memcpy((void*)lpMapAllAdress,(void*)lpMapAddress1,dwBytesInBlock);
                UnmapViewOfFile(lpMapAddress1);
                UnmapViewOfFile(lpMapAllAdress);
                i64Offset += dwBytesInBlock;
                qwFileSize1-=dwBytesInBlock;
        }
        
        CloseHandle(hFileMapping1);
        CloseHandle(hFile1);
                
        
        DWORD dwFileSizeHigh2 = 0;
        LONG64 qwFileSize2 = GetFileSize(hFile2,&dwFileSizeHigh2);
        qwFileSize2 +=(((LONG64)dwFileSizeHigh2)<<32);
        __int64 i64Offset2 = 0;
        
        while (qwFileSize2>0)
        {
                DWORD  dwBytesInBlock = sinf.dwAllocationGranularity;
                if (qwFileSize2  < sinf.dwAllocationGranularity)
                {
                        dwBytesInBlock = (DWORD) qwFileSize2;
                }
                        
                LPBYTE lpMapAllAdress = (LPBYTE)MapViewOfFile(hFileMapAll,FILE_MAP_ALL_ACCESS,(DWORD)(i64Offset >> 32), (DWORD)(i64Offset & 0xFFFFFFFF),dwBytesInBlock);
                LPBYTE lpMapAddress2 = (LPBYTE) MapViewOfFile(hFileMapping2,FILE_MAP_READ,(DWORD)(i64Offset2 >> 32), (DWORD)(i64Offset2 & 0xFFFFFFFF),dwBytesInBlock);
                        
                memcpy((void*)lpMapAllAdress,(void*)lpMapAddress2,dwBytesInBlock);
                UnmapViewOfFile(lpMapAddress2);
                UnmapViewOfFile(lpMapAllAdress);
                i64Offset += dwBytesInBlock;
                i64Offset2 += dwBytesInBlock; 
                qwFileSize2-=dwBytesInBlock;
        }
        CloseHandle(hFileMapping2);
        CloseHandle(hFile2);
                        CloseHandle(hFileMapAll);
        CloseHandle(hFile_All);