我写了一段文件映射的程序,块大小设置为512M,经测试运行成功,取名为工程A;之后给工程A添加功能,复制了A的附件,并在A的基础上添加功能按钮,原有程序没变过,新工程取名B;
  问题来了,B的文件映射怎么招都失败,错误代码8,内存不足;但是A怎么招都运行的起来;之后给B的块大小设置为256M又是怎么招都运行的起来,改回原来的大小又是内存不足;这到底是为嘛子啊为嘛子,求大侠解决问题

解决方案 »

  1.   

    另外,在我自己编程序的电脑上,512M块大小的B怎么招都没问题,到了老板电脑上B程序就出现内存不足的错误,但是A程序到了老板电脑上又是怎么招都没问题,为什么啊这是
      

  2.   

    A,B在我自己的电脑上都能跑,且无错,在其他电脑上就A能跑,B显示内存不足,将B的块改成256,又都可以跑,何解啊这到底????
      

  3.   

    本帖最后由 VisualEleven 于 2012-08-30 10:53:59 编辑
      

  4.   

    把CreateFileMapping的4,5参数都设置为0
      

  5.   

    (DWORD)(FileMaxSize>>32)
    看看它是不是太大。FileMaxSize类型是 ULONGLONG,或者其它8字节类型。
    是在这行出来的? MessageBox("创建文件映射对象失败,错误代码");
      

  6.   

    未必总会有一块连续的512M给你用,还是稳妥点分段映射,每次映射64KB(内存分配粒度)吧
      

  7.   

    这也正常,工程B不是在A的基础上还添加了些功能吗,那应该比A多占用些内存,可能恰好A的虚拟地址空间里有一块连续的512M,而B没有。一个进程在32位下地址空间位4G,除去内核,供用户使用的可能还不到2G,我新建一个空的工程一次映射1G多,还能映射成功呢。
      

  8.   

    这是个例子
    HANDLE hFile = NULL;
    HANDLE hFileMap = NULL;
    const viewmapsize = 8 * 1024 * 1024;//8m
    DWORD highsize,lowsize,fileoffsetlow,fileoffsethigh,mapsize;
    _int64 filesize,offset,remain;
    int dwError;do {
    //打开文件
    hFile= CreateFile("g:\\1289527402.png",
    GENERIC_READ,
    FILE_SHARE_READ|FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL);
    if ( hFile == INVALID_HANDLE_VALUE )
    {
    CString cs;
    cs.Format("打开文件失败:%d",GetLastError());
    AfxMessageBox(cs);
    break;
    }
    lowsize = GetFileSize(hFile,&highsize);
    if ( lowsize == 0xFFFFFFFF && ( dwError = GetLastError() ) != NO_ERROR )
    {
    CString cs;
    cs.Format("获取文件大小失败:%d",dwError);
    AfxMessageBox(cs);
    break;
    }
    //文件大小
    filesize = highsize<<32 | lowsize;

    hFileMap = CreateFileMapping(hFile,NULL,
    PAGE_READONLY,
    highsize,
    lowsize,
    NULL);
    if ( hFileMap == NULL )
    {
    CString cs;
    cs.Format("建立CreateFileMapping失败:%d",GetLastError());
    AfxMessageBox(cs);
    break;
    }
    offset = 0;

    mapsize = (int)(filesize > viewmapsize ? viewmapsize : filesize);
    fileoffsethigh = (int)(offset >> 32);
    fileoffsetlow = (int)(offset / viewmapsize * viewmapsize);

    LPVOID lpmap;
    while ( filesize > offset && ( lpmap = MapViewOfFile(hFileMap,FILE_MAP_READ,fileoffsethigh,fileoffsetlow,mapsize) ) != NULL )
    {
    offset += mapsize;
    remain = filesize - offset;

    mapsize = (int)(remain > viewmapsize ? viewmapsize : remain);
    fileoffsethigh = (int)(offset >> 32);
    fileoffsetlow = (int)(offset);

    UnmapViewOfFile(lpmap);

    }
    if ( lpmap == NULL )
    {
    CString cs;
    cs.Format("建立MapViewOfFile失败:%d",GetLastError());
    AfxMessageBox(cs);
    break;
    }
    else
    UnmapViewOfFile(lpmap);

    if ( filesize == offset )
    AfxMessageBox("映射文件结束");

    }while (0);if ( hFileMap )
    CloseHandle(hFileMap);
    if (hFile)
    CloseHandle(hFile);
      

  9.   

    我觉得就是FileMaxSize这个8字节整型的问题。也许是不同机器字长右移32为会回绕,造成高4位数据过大,发生内存不足。
     
      

  10.   


    map的问题...用MapViewOfFile处理大文件时,如果文件过大,则无法一次性映射入内存,否则会出现1132错误,即内存不足。原因可能为操作系统无法找到连续的内存。因此需要通过分页的方式,逐页将文件内容映射到内存你试着改小一点,或者直接是64K
      

  11.   

    那为什么同样的程序,A每次投成功,B乱按按之后成功了呢,难道对B内存的连续空间一直在变,A就一直存在连续的空间?