扩展内存XMS
1: DOS根目录下的“Config.Sys”文件须加载himem.Sys文件.
2:头文件是“Memory.h”,类名是“CXmsMemory”
3:主要接口有
int GetVersion();
//得到版本号
BOOL GetFreeInformation(WORD*
pwMaxFreeBlock, WORD* pwTotalFreeBlock);//得到自由XMS信息
BOOL MallocXms(DWORD dwCount);//分配扩展内存
BOOL FreeXms();//释放扩展内存
BOOL
RemallocXms(DWORD
dwCount);//重新分配扩展内存
BOOL LockXms();//锁住内存块
BOOL UnlockXms();//内存块加锁
BOOL Fill(char nCh);//将已分配的XMS全部填充成指定的字符
void SetWrite(BOOL bWrite);//将XMS置成“脏”标志
BOOL GetWrite();//判断XMS是否是“脏”的
static BOOL
MallocHma(WORD wSize);//分配HMA内存
static
BOOL
FreeHma();//释放HMA内存
static
BOOL
MallocUmb(DWORD dwSize, WORD* pwUmbNumber);//分配UMB内存
static
BOOL
FreeUmb(WORD wUmbNumber);//释放UMB内存
BOOL SetSize(DWORD dwSize,
DWORD dwCount = 1);//设置扩展内存的大小
BOOL SetSizeEx(DWORD
dwSize, DWORD dwCount = 1);//得新设置扩展内存的大小
BOOL LoadFile(char
*strFile, DWORD dwIndex = 0);//装入文件
BYTE* GetPoint(DWORD dwIndex, int
nCount = 1);//得到指定索引字节的指针
BYTE GetByteData(DWORD
dwIndex);//读字节类型值
int
GetIntData(DWORD dwIndex);//读整数类型值
long GetLongData(DWORD
dwIndex);//读长整数类型值
float GetFloatData(DWORD dwIndex);//读单精度浮点类型值
double GetDoubleData(DWORD dwIndex);//读双精度浮点类型值
BOOL SetByteData(DWORD
dwIndex,BYTE);//写字节类型值
BOOL SetIntData(DWORD
dwIndex,int);//写整数类型值
BOOL SetLongData(DWORD
dwIndex,long);//写长整类型值
BOOL SetFloatData(DWORD
dwIndex,float);//写单精度浮点类型值
BOOL SetDoubleData(DWORD
dwIndex,double);//写双精度浮点类型值
BYTE* GetByteData(DWORD dwIndex,
BYTE* pByte, DWORD dwCount);//读指定字节串
BOOL SetByteData(DWORD
dwIndex, BYTE* pByte, DWORD dwCount);//写指定字节串
int
GetXmsPageLength();//得到XMS页宽度
CXmsMemory();//默认256字节页宽度的构造函数
CXmsMemory(int nPageLength); //指定字节页宽度的构造函数
4:本系统的页框是分配在“常规内存”中,故请不要开辟太大的页框,默认是256字节。
5:设置目标主板的“扩展内存”类型
在可执行文件的目录中,有一个“Config.Sys”文件,注意[Boot]段的“XmsStyle”键值,
它的意义如下:
XmsStyle = 0 ;标准扩展内存
XmsStyle = 1 ;用磁盘仿真扩展内存
XmsStyle = 2 ;PCM3486目标板专用的扩充内存卡
字库的XMS内存分配
系统内核有一个变量CXmsMemory
mAfxXmsFontMemory扩展内存可供调用,其帧窗口的大小是4K字节,其内部分配如下。(注:系统拥有修改内部位置的权力, 最好通过调用函数来得到其指针),如果用户想借用该XMS来多扩展Size字节的XMS内存,可以调用mAfxXmsFontMemory->SetSizeEx(mAfxXmsFontMemory->GetSize()
+ Size);
|
280K,16 * 16简体或繁体字库(内核使用) |
|
40K,波形测试数据(用户使用) |
|
20K,测试项目及单位数据(用户使用) |
|
2048K,窗口背景数据(内核使用) |
(1) 280K,16 * 16简体或繁体字库可调用GetXms_FontBlock()函数返回以K为单位的起始索引
(2) 40K,波形测试数据可调用GetXms_FontBlock()函数返回以K为单位的起始索引
(3) 20K,测试项目及单位数据可调用GetXms_FontBlock()函数返回以K为单位的起始索引
(4) 1024K,窗口背景数据可调用GetXms_WindowBlock()函数返回以K为单位的起始索引
(4) 尾端,用户自己,GetXms_FreeBlock()函数返回以K为单位的起始索引
(5举例读写波形数据
WORD*
GetWaveFromXms(int nIndex) //从字库中的XMS中获得第nIndex个波形首地址
{
WORD *pXmsData = (WORD
*)mAfxXmsFontMemory.GetPoint(
1024L* ::GetXms_WaveBlock() +
1L * nIndex * sizeof(WORD) * 2048);
return(pXmsData);
}
void
SaveWaveToXms(int nIndex, WORD *pwData, int nCount)//将波形数据写入字库中的XMS
{
DWORD dwLocation = 1024L* ::GetXms_WaveBlock() + 1L * nIndex * sizeof(WORD) * 2048;
mAfxXmsFontMemory.SetByteData(dwLocation, (BYTE
*)pwData, 1L * sizeof(WORD) *
nCount);
}
1.
扩充内存EMS
1:,类名是“CEmsMemory”,
2:由于整个EMS同时只有四个页框,故只能有已分配EMS的4个CEmsMemory类同时存在。
3:由于Windows2000不支持EMS,故系统内核从20004年10月起,去掉了EMS支持,请需要访问超过1M内存之外时,请改用“CXmsMemory”类,原来代码只需将“EmsMemory”改为“XmsMemory”即可。