求高手帮忙!VC6.0+32位系统突破2GB内存访问!!!

lc8080 2012-12-10 09:07:43
开启了PAE, 使用AWE 依旧不能突破2GB内存限制,求高手指点!!
下面是我根据网上找到的代码修改的,XP+VC6.0+开启PAE

#include "stdafx.h"
#include <windows.h>
#include <WinBase.h>
#include <iostream>

using std::cout;
using std::endl;

BOOL AWESetLockPagesPrivilege( HANDLE hProcess, BOOL Enable )
{
HANDLE Token = NULL;
BOOL Result = FALSE;
TOKEN_PRIVILEGES Info = { 0 };

// 打开令牌
Result = OpenProcessToken ( hProcess, TOKEN_ADJUST_PRIVILEGES, &Token );
if( !Result )
return FALSE;

// 设置权限信息
Info.PrivilegeCount = 1;
Info.Privileges[0].Attributes = Enable? SE_PRIVILEGE_ENABLED : 0;

// 获得锁定内存权限的ID
Result = LookupPrivilegeValue ( NULL,SE_LOCK_MEMORY_NAME,&(Info.Privileges[0].Luid));
if( !Result )
{
CloseHandle( Token );
return FALSE;
}

// 调整权限
Result = AdjustTokenPrivileges ( Token, FALSE,(PTOKEN_PRIVILEGES) &Info,0, NULL, NULL);
if( ( !Result ) || ( GetLastError() != ERROR_SUCCESS ) )
{
CloseHandle( Token );
return FALSE;
}

// 成功返回
CloseHandle( Token );
return TRUE;
}

class MMemory
{
private:
ULONG_PTR NumberOfPages; // 申请的内存页数
ULONG_PTR *aPFNs; // 页信息,存储获取的内存页成员
LPVOID lpMemReserved; // AWE窗口
public:
BOOL AllocMemory(ULONG_PTR dMemorySzie);
LPVOID GetMemory();
BOOL FreeMemory();
};

BOOL MMemory::AllocMemory(ULONG_PTR MemorySzie)
{
BOOL bResult; // 通用bool变量
ULONG_PTR NumberOfPagesInitial; // 初始的要申请的内存页数
SYSTEM_INFO sSysInfo; // 系统信息
INT PFNArraySize; // PFN队列所占的内存长度

GetSystemInfo(&sSysInfo); // 获取系统信息

//计算要申请的内存页数.
NumberOfPages = MemorySzie/sSysInfo.dwPageSize;
printf ("Requesting %d pages of memory.\n", NumberOfPages);

// 计算PFN队列所占的内存长度
PFNArraySize = NumberOfPages * sizeof (ULONG_PTR);
aPFNs = (ULONG_PTR *) HeapAlloc(GetProcessHeap(), 0, PFNArraySize);
if (aPFNs == NULL)
{
printf ("Failed to allocate on heap.\n");
return 0;
}

// 分配物理内存
NumberOfPagesInitial = NumberOfPages;
bResult = AllocateUserPhysicalPages( GetCurrentProcess(), &NumberOfPages, aPFNs );
if( bResult != TRUE )
{
printf("Cannot allocate physical pages (%u)\n", GetLastError() );
return 0;
}
if( NumberOfPagesInitial != NumberOfPages )
{
printf("Allocated only %p pages.\n", NumberOfPages );
return 0;
}

// 分配虚拟内存块(这个内存块即AWE窗口)
lpMemReserved = VirtualAlloc( NULL, MemorySzie, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE );
if( lpMemReserved == NULL )
{
printf("Cannot reserve memory.\n");
return 0;
}

// 开始映射
bResult = MapUserPhysicalPages( lpMemReserved, NumberOfPages, aPFNs );
if( bResult != TRUE )
{
printf("MapUserPhysicalPages failed (%u)\n", GetLastError() );
return 0;
}

return 1;
}

LPVOID MMemory::GetMemory()
{
return lpMemReserved;
}

BOOL MMemory::FreeMemory()
{
BOOL bResult;

// 解除映射
bResult = MapUserPhysicalPages(lpMemReserved, NumberOfPages, NULL );
if( bResult != TRUE )
{
printf("MapUserPhysicalPages failed (%u)\n", GetLastError() );
return 0;
}

// 释放物理内存空间
bResult = FreeUserPhysicalPages( GetCurrentProcess(), &NumberOfPages, aPFNs );
if( bResult != TRUE )
{
printf("Cannot free physical pages, error %u.\n", GetLastError());
return 0;
}

// 释放虚拟内存地址
bResult = VirtualFree( lpMemReserved, 0, MEM_RELEASE );

// 释放PFN队列空间
bResult = HeapFree(GetProcessHeap(), 0, aPFNs);
if( bResult != TRUE )
{
printf("Call to HeapFree has failed (%u)\n", GetLastError() );
}

return 1;
}

void _cdecl main()
{
if( !AWESetLockPagesPrivilege( GetCurrentProcess(), TRUE) )
{
// 输出错误信息
cout<<"do not have privilege!"<<endl;
}
for(int k = 0; k < 5; k++)
{
MMemory A;
A.AllocMemory(1024*1024*1024);
//A.FreeMemory();
}
}
...全文
393 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hztj2005 2012-12-10
  • 打赏
  • 举报
回复
引用 4 楼 tiger9991 的回复:
楼主看过这个了?
1、http://blog.csdn.net/flyingworm_eley/article/details/6523326 太好了,第一次看到这么完整的让32位应用程序不再为2G内存方法。 不过也说明MapUserPhysicalPages出来的内存其实只能相当于缓冲区,与一般内存用途还是有区别的。 2、http://social.msdn.microsoft.com/Forums/zh-CN/sqldatabaseengine/thread/cc5f9b7e-0409-45ea-8305-782f48c71c24 这个贴子的提问和回复也不错。 总结一句: 楼主突破2GB内存,究竟是打算用作何用途。 如果想一次new出4GB的数组,那么别折腾,快换64bit的系统。 如果在32bit的系统,使用/3GB设置,应用程序最多有普通内存3GB,最后要留一些给其它应用程序,否则2中说:The system will grind to a halt.(系统会逐渐降低速度)。就是说你的应用程序最多只能使用2.5G或2.7G普通内存。 至于超过4GB的其它部分内存,只能通过MapUserPhysicalPages来做缓冲交换数据用,并且要在普通内存中开一个窗口映射。
lc8080 2012-12-10
  • 打赏
  • 举报
回复
我有64位win7 可是我的编译器VC6.0 32位的 程序已经成型很难移植 程序将来运行的环境可能是32位也可能是64位的 求各位大神帮忙
rickys2080 2012-12-10
  • 打赏
  • 举报
回复
多开几个进程?
lc8080 2012-12-10
  • 打赏
  • 举报
回复
tiger9991 的连接看过了 就是根据这个改的 完全使用例子也只能到2.5G 我的机器8GB内存
ok1234567 2012-12-10
  • 打赏
  • 举报
回复
内存的速度比任何硬盘都快,这是无疑的 所以,需要大存储的程序,用大内存,就不是效率问题,而是能不能用起来的问题:) 比如数据库,当数据量达到50G以上时,2G的内存就很难胜任了 当然,现在开发程序,如果需要大内存 建议强制64位系统,awe主要是迁就32位系统
看不见的裂痕 2012-12-10
  • 打赏
  • 举报
回复
楼主看过这个了? 链接
ok1234567 2012-12-10
  • 打赏
  • 举报
回复
我并没有在自己的程序中使用过awe 但是在32位的数据库中,就一定要使用awe,比如ms sqlserver 配置的过程一定为三步: 1、OS ini + /pae 2、在组策略管理中,给启动程序(服务)的用户授权 3、在程序中打开awe的控制
lc8080 2012-12-10
  • 打赏
  • 举报
回复
分配权限了 请问ok1234567 你使用过AWE吗?我现在不知道这个方法是否好用!!最好帮我运行一下!!
ok1234567 2012-12-10
  • 打赏
  • 举报
回复
运行gpedit.msc 在“用户权限分配中”给执行程序的用户授予“内存中锁定页面”权限
lc8080 2012-12-10
  • 打赏
  • 举报
回复
百科名片 AWE:地址窗口化扩展插件,允许在 32 位版本的 Windows 操作系统上使用 4 GB 以上的物理内存。最多可支持 64 GB 的物理内存。 怎么实现的?
lc8080 2012-12-10
  • 打赏
  • 举报
回复
不要说那些没用的,现在是要解决问 我不知道能否实现才求各位帮助! 32位系统 8G内存 怎么样才能使用更多的内存?使用极限是多少?
看不见的裂痕 2012-12-10
  • 打赏
  • 举报
回复
9楼说的正解。 本来那么大的数据量就不能再用32位再处理了。还不如装虚拟机呢(现在CPU基本都支持64位的,可以在32位操作系统上模拟64位操作系统,我就这么做过)
lc8080 2012-12-10
  • 打赏
  • 举报
回复
通过修改代码在win7 64位下已经可以运行 使用7.6G内存 请问能否在32位系统中实现

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧