在XMS模块中,全程变量int nAfxXmsStyle是控制默认分配XMS内存模式的变量。
nAfxXmsStyle = 0 (=XMSMEMORY_STYLE_MORAL)表示默认XMS
nAfxXmsStyle = 1 (=XMSMEMORY_STYLE_DISK)表示磁盘XMS
nAfxXmsStyle = 2 (=XMSMEMORY_STYLE_EMSCARD)表示PCM3486的扩充内存卡
如果您调用了"InitSystem()"函数,则它会分析“Config.Sys”文件的"Boot"段的“XmsStyle”键。
其实,可以调用CXmsMemory::SetXmsStyle()来改变XMS性质,必须在下面函数之前调用:
CXmsMemory::SetSize()
CXmsMemory::SetSizeEx()
CXmsMemory::MallocXms()函数
//---------------------------------------------
#include <string.h>
#include <Symbol.h>
#include <Memory.h>
extern unsigned _stklen = 50L * 1024L;
extern int nAfxXmsStyle;
int main()
{
nAfxXmsStyle = XMSMEMORY_STYLE_DISK; //用磁盘访真XMS内存
//建立一个默认页框为256字节
CXmsMemory mXmsMemory;
//分配一新的内存块作为新页框。页框越大,访问XMS的速度越快
BYTE* pNewBlock = new BYTE[2048];
//用户的默认页框为256字节,改变页框为2048字节
BYTE* pOldBlock = mXmsMemory.ChangeFrame(pNewBlock, 2048);
//删除老的页框
delete pOldBlock;
//分配200K字节的XMS内存
mXmsMemory.SetSize(200L, 1024L);
//增加100K的XMS内存(300 = 200 + 100)
mXmsMemory.SetSizeEx(300L, 1024L);
//将字符串“My name is LiPing1!”写入以字节为单位的索引“120030L”的位置
char buf[100] = "My Name is LiPing1!";
mXmsMemory.SetByteData(120030L, (BYTE *)buf, _fstrlen(buf) + 1);
//将字符串“My name is LiPing1!”从以字节为单位的索引“120030L”的位置读出来
_fmemset((BYTE *)buf, 0, 100);
mXmsMemory.GetByteData(120030L, (BYTE *)buf, 100);
printf("\n S = \"%s\"", buf);
//如果在普通PC上运行的话,可以将内存改为XMS
mXmsMemroy.FreeXms();
mXmsMemory.SetXmsStyle(XMSMEMORY_STYLE_NORMAL);//如果是PCM3486改为XMSMEMORY_STYLE_EMSCARD
mXmsMemory.SetSize(300L, 1024L);
//将字符串“My name is LiPing2!”写入以字节为单位的索引“120030L”的位置
_fmemcpy(buf, "My Name is LiPing2!");
mXmsMemory.SetByteData(120030L, (BYTE *)buf, _fstrlen(buf) + 1);
//将字符串“My name is LiPing2!”从以字节为单位的索引“120030L”的位置读出来
_fmemset((BYTE *)buf, 0, 100);
mXmsMemory.GetByteData(120030L, (BYTE *)buf, 100);
printf("\n S = \"%s\"", buf);
getch();
//释放已经分配的XMS内存块
mXmsMemory.FreeXms();
return(0);
}