NT和9X对于内存映射文件的实现机制不太一样,用MapViewOfFile进行映射时,NT为每次映射保留指定的地址空间区域。而9X保留的是整个文件大小的地址空间区域。所以在9X中就算你只映射几KB,系统也会为整个文件保留1.5GB的地址空间。

解决方案 »

  1.   

    两个条件缺一不可:1、有足够的虚地址空间。9X下的内存映射文件全部映射到0x80000000到0xBFFFFFFF这1GB的地址空间中去。1.5GB的文件根本映射不进去。而在NT中内存映射文件是被映射到0x00010000到0x7FFEFFFF这2GB的空间中。2、有足够的物理存储,如果你手工限制了页面交换文件大小的话,最大的物理存储就定死了。
      

  2.   

    to reigod(月影清风下,自在逍遥中):
      感谢你的回答,但是我在MSDN里反复看了File Mapping相关的几个函数,都没有看到他说在98下有什么限制。请问您的这些数据是从哪里得到的?如果确实如此,那MSDN的文档岂不是不完整也不可信了吗?
      

  3.   

    C盘上有15000G的空间也一样打不开
    95虚拟内存的东西我都完的差不多了,简单的说,一个进程系统给你4G的虚拟内存,其中有一半跟你没关,是系统平台、系统dll、映射文件占用的,剩下的2g也不是都给你读写,还要存自己的exe,客户的dll,调用的控件,真正自己读写的就1g,而且还分成了好几块。
    nt的内存技术我还不太了解.
      

  4.   

    9X的内存布局:
    0x00000000---0x00000FFF 不可访问 用于捕获空指针错误
    0x00001000---0x003FFFFF MS-DOS、16位Windows程序兼容区
    0x00400000---0x7FFFFFFF Win32进程私有
    0x80000000---0xBFFFFFFF 内存映射、共享的Win32DLL、16位应用内存分配区
    0xC0000000---0xFFFFFFFF VXD、系统区NT的内存布局:
    0x00000000---0x0000FFFF 不可访问 用于捕获空指针错误
    0x00010000---0x7FFEFFFF Win32进程私有
    0x7FFF0000---0x7FFFFFFF 不可访问 内存隔离区,防止应用访问系统区
    0x80000000---0xFFFFFFFF 系统区
      

  5.   

    看WINDOWS核心编程,内存管理中有介绍。
      

  6.   

    据reigod(月影清风下,自在逍遥中)兄之所言,在下还是有两点不明白,
    1. 从98的内存表中看,0x80000000---0xBFFFFFFF用于内存映射,共享DLL等,那么如何知道98下究竟有多少控件可以专用于内存映射?
    2. 在NT的内存表中,为什么没有内存映射区?
      

  7.   

    我同意 reigod(月影清风下,自在逍遥中) 的
      

  8.   

    to chcw():
    1、<b>最大</b>是1GB
    2、我已经说过了。NT映射到0x00010000到0x7FFEFFFF这2GB的空间中。和进程代码什么的在同一个区域,这块是私有的,所以提高了安全性。
      

  9.   

    to reigod(月影清风下,自在逍遥中):
    1.我的理解是,当前程序可用的最大映射区是小于1GB的,因为有共享DLL占用了一部分空间,具体占用了多少空间,目前我还不知道用什么API来获取?
    2.对NT下进程私有区域,如果用户在程序的其它地方也使用了这部分空间,那么可用的内存空间也应该会相应的减小。
    to dengyongtao(好死不如赖活):
    当然有了,你的邮箱地址是多少?我发给你?(当然你要有那么大的邮箱才行了)
      

  10.   

    理解正确。
    要获取内存和页面文件状态,用GlobalMemoryStatus
      

  11.   

    to reigod(月影清风下,自在逍遥中):我运行了MSDN中关于GlobalMemoryStatus的一个例子,在2000下得到如下结果:
    There are  130524 total Kbytes of physical memory.
    There are   25984 free Kbytes of physical memory.
    There are  309980 total Kbytes of paging file.
    There are  152928 free Kbytes of paging file.
    There are  1fff80 total Kbytes of virtual memory.
    There are  1fc7e8 free Kbytes of virtual memory.那么我内存中可用于内存映射的区域是free paging file部分还是free virtual memory部分呢?在2000和98下又如何能手工调节虚拟内存的大
    小呢?
      

  12.   

    有时win98是连接不上。有的server只能win2000的client才能直接在网上邻居中看到,而win98看不到。要用ftp