精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>○ DOS>>工具箱>>有关DOS下扩充内存的使用之二

主题:有关DOS下扩充内存的使用之二
发信人: riffle()
整理人: yangcs(2000-01-25 11:47:10), 站内信件
emsclas.h

/* author : *** */  // ***
/*--------------------------------------------------------------*/
#ifndef INTEREMSMEMARRAY
#define INTEREMSMEMARRAY
class EMSMEMARRAY
{
  private:
    unsigned int uiMaxData;
    unsigned int uiDataSize;
    unsigned int uiEMSHandle;
  protected:
    char *GetEmsAddr( void );
  public:
    EMSMEMARRAY( unsigned int uiDataNum, unsigned int uiDataLen );
    ~EMSMEMARRAY( void );
    char &operator[]( unsigned int uiIndex );
    EMSMEMARRAY &operator=( EMSMEMARRAY &sEmsmemArray );
};

/*--------------------------------------------------------------*/
#endif





emsclas.cpp

/* author : *** */  // ****
/*--------------------------------------------------------------*/
#include <STDIO.H>
#include <STDLIB.H>
#include <MEM.H>

#include "EMSCLAS.H"
#include "EMSMEM.H"

/*--------------------------------------------------------------*/

static void InsufficientEMS( void );

/*--------------------------------------------------------------*/
/****************************************************************/
static void InsufficientEMS( void )
{
  printf( "\nEMS memory allocation error!\n" );
}
/****************************************************************/

/****************************************************************/
/*-- 取EMS内存地址   程序开始 ----------------------------------*/
char *EMSMEMARRAY::GetEmsAddr( void )
{
  char *sTempStr;
  // 计算总页数
  unsigned int uiLogicPages = ( ( uiMaxData * uiDataSize ) >> 14 ) & 3
;

  // 映射各逻辑页
  for( int i = uiLogicPages; i > 0; i-- )
    GetLogicPageAddress( i, uiEMSHandle );

  // 取逻辑页0的物理地址
  sTempStr = GetLogicPageAddress( 0, uiEMSHandle );

  if ( sTempStr == NULL )
    {
      // 失败,则无法纠正该错误,应强行退出程序
      InsufficientEMS();
      exit( 2 );
    }
  return sTempStr;
}
/*-- 取EMS内存地址   程序结束 ----------------------------------*/
/****************************************************************/

/****************************************************************/
/*-- 构造函数,给定数据块数及数据块大小,分配EMS内存   程序开始 */
EMSMEMARRAY::EMSMEMARRAY( unsigned int uiDataNum, unsigned int uiDataL
en )
{
  unsigned int uiBufLength;
  unsigned long ulMaxLen = uiDataNum;
  unsigned long ulMaxSize = uiDataLen;
  char *caTempBuf;

  uiMaxData = uiDataNum;
  uiDataSize = uiDataLen;
  uiEMSHandle = 0;

  // 计算总的内存需求
  ulMaxLen = ulMaxLen * ulMaxSize;
  uiBufLength = ulMaxLen;

  // 合法检查
  if ( ( ulMaxLen < 65000L ) && ( ulMaxLen > 0 ) )
    {
      AllocateEMS( uiBufLength, uiEMSHandle );
      printf( "allocated ems handle = %d, %d %d\n", uiEMSHandle,
      uiMaxData,
      uiDataSize );
      caTempBuf = GetEmsAddr();
      // 若分配成功,将每个数据块的第一字节赋初值'C'。
      if ( caTempBuf != NULL )
for( int i = 0; i < uiMaxData; i++ )
{
caTempBuf[ i * uiMaxData ] = 'C';
if ( uiDataSize > 1 )
      caTempBuf[ i * uiMaxData + 1 ] = '\0';
  }
    }
}
/*-- 构造函数,给定数据块数及数据块大小,分配EMS内存   程序结束 */
/****************************************************************/

/****************************************************************/
EMSMEMARRAY::~EMSMEMARRAY( void )
{
  // 释放EMS句柄
  FreeEMS( uiEMSHandle );
  printf( "free ems handle = %d\n",  uiEMSHandle );
}
/****************************************************************/

/****************************************************************/
char &EMSMEMARRAY::operator[]( unsigned int uiIndex )
{
  char *caTempBuf = GetEmsAddr();
  return caTempBuf[ uiIndex * uiDataSize ];
}
/****************************************************************/

/****************************************************************/
/*-- 重载'='的函数   程序开始 ----------------------------------*/
EMSMEMARRAY &EMSMEMARRAY::operator=( EMSMEMARRAY &sEmsmemArray )
{
  unsigned int uiBufLength;
  unsigned long ulMaxLen = sEmsmemArray.uiMaxData;
  unsigned long ulMaxSize = sEmsmemArray.uiDataSize;
  char *sTempStr;
  char *sThisStr;

  //释放本身原来申请的EMS句柄
  FreeEMS( uiEMSHandle );
  printf( "free ems handle = %d\n",  uiEMSHandle );

  uiMaxData = sEmsmemArray.uiMaxData;
  uiDataSize = sEmsmemArray.uiDataSize;

  uiEMSHandle = 0;

  // 计算总的内存需求
  ulMaxLen = ulMaxLen * ulMaxSize;
  uiBufLength = ulMaxLen;

  // 合法检查
  if ( ( ulMaxLen < 65000L ) && ( ulMaxLen > 0 ) )
    {
    AllocateEMS( uiBufLength, uiEMSHandle );
    printf( "allocated ems handle = %d\n", uiEMSHandle );
    }

  // 在堆中申请数据块大小的内存
  sTempStr = new char[ uiDataSize + 1 ];

  if ( sTempStr != NULL )
    {
      for( int i = 0; i < uiMaxData; i++ )
{
// 拷贝源EMS内存数据到 sTempStr
memcpy( sTempStr, &sEmsmemArray[ i ], uiDataSize );
// 重新映射本身的地址
sThisStr = GetEmsAddr();
// 拷贝源数据
memcpy( &sThisStr[ i * uiDataSize ], sTempStr, uiDataSize );
}
// 释放堆中的内存
delete sTempStr;
}
return *this;
}
/*-- 重载'='的函数 程序结束 ----------------------------------*/
/****************************************************************/
/****************************************************************/
/****************************************************************/

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.185.27]

[关闭][返回]