⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 consolemanage.cpp

📁 这是一个软件水平资格考试中使用的CASL汇编语言的编译器,实现文件中包括一个编译器,一个虚拟机,一个类似于Debug的调试器.
💻 CPP
字号:
// ConsoleManage.cpp: implementation of the CConsoleManage class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ConsoleManage.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CConsoleManage::CConsoleManage()
{
  m_hConsoleBuffer = INVALID_HANDLE_VALUE;
}

CConsoleManage::~CConsoleManage()
{
  if (m_hConsoleBuffer != INVALID_HANDLE_VALUE)
  {
    //关闭分配的Console Screen缓冲区
    CloseHandle(m_hConsoleBuffer);
    m_hConsoleBuffer = INVALID_HANDLE_VALUE;
    //将控制台与进程断开连接
    FreeConsole();
  }
}


/////////////////////////////////////////////////////////////////////////
//函数名称:StartConsole
//函数功能:----------启动一个Console-----------------------
//入口参数:无
//出口参数:无
//返回值:int-----CONSOLE_WORK_OK 表示控制台启动成功
//               CONSOLE_WORK_FAILED 表示控制台启动失败
//               CONSOLE_ALREADY_STARTED  表示在调用该函数前已经存在一个与调用进程相连的控制台了
//开发人员:杨军
//开发日期:2004-5-31
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CConsoleManage::StartConsole()
{
  //如果当前已经启动了一个控制台,则不能启动第二个控制台
  //因为一个进程同一时间只能拥有一个控制台
  if (m_hConsoleBuffer != INVALID_HANDLE_VALUE)
  {
    return CONSOLE_ALREADY_STARTED;
  }
  //分配一个Console给调用进程
  if (!AllocConsole())
  {
    return CONSOLE_WORK_FAILED;
  }

  m_hConsoleBuffer = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 
                                               FILE_SHARE_READ | FILE_SHARE_WRITE, 
                                               NULL,
                                               CONSOLE_TEXTMODE_BUFFER,
                                               NULL);

  if (INVALID_HANDLE_VALUE == m_hConsoleBuffer)
  {
    FreeConsole();
    return CONSOLE_WORK_FAILED;
  }

  return CONSOLE_WORK_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:ExitConsole
//函数功能:----------关闭已经打开的Console-----------------
//入口参数:无
//出口参数:无
//返回值:int ---------------------CONSOLE_WORK_OK-------控制台关闭成功
//                                CONSOLE_WORK_FAILED---控制台关闭失败
//                                CONSOLE_NOT_STARTED----控制台尚未启动
//开发人员:杨军
//开发日期:2004-5-31
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CConsoleManage::ExitConsole()
{
  //如果当前没有打开的控制台
  if (INVALID_HANDLE_VALUE == m_hConsoleBuffer)
  {
    return CONSOLE_NOT_STARTED;
  }
  //关闭分配的Console Screen缓冲区
  if (!CloseHandle(m_hConsoleBuffer))
  {
    return CONSOLE_WORK_FAILED;
  }

  m_hConsoleBuffer = INVALID_HANDLE_VALUE;
  //将控制台与进程断开连接
  if (!FreeConsole())
  {
    return CONSOLE_WORK_FAILED;
  }

  
  return CONSOLE_WORK_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:WriteData
//函数功能:----------向控制台输出字符串--------------------
//入口参数:CString argData--------要向控制台输出的字符串
//出口参数:无
//返回值:int ---------------------CONSOLE_WORK_OK-------控制台关闭成功
//                                CONSOLE_WORK_FAILED---控制台关闭失败
//                                CONSOLE_NOT_STARTED----控制台尚未启动
//开发人员:杨军
//开发日期:2004-5-31
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CConsoleManage::WriteData(CString argData) 
{
  //------------------变量定义部分  begins------------------------------  
  HANDLE hOutput = INVALID_HANDLE_VALUE;
  DWORD dwWritten = 0;
  //------------------变量定义部分  ends--------------------------------
  if (INVALID_HANDLE_VALUE ==  m_hConsoleBuffer)
  {
    return CONSOLE_NOT_STARTED;
  }

  //获得Console输出句柄
  hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

  if (INVALID_HANDLE_VALUE == hOutput)
  {
    return CONSOLE_WORK_FAILED;
  }

  //向控制台缓冲区输出数据
  if (!WriteConsole(hOutput, (CONST VOID *)argData, argData.GetLength(), &dwWritten, NULL))
  {
    return CONSOLE_WORK_FAILED;
  }
  
  return CONSOLE_WORK_OK;
}


/////////////////////////////////////////////////////////////////////////
//函数名称:ReadData
//函数功能:----------从控制台输入一组数据------------------
//入口参数:DWORD argToRead-----------------用户请求读求的数据的长度(按字节计算)
//出口参数:CString& argData---------------储存用户输入的数据
//         DWORD& argRead-------------------实际获得的输入的数据的长度(按字节计算)
//返回值:int ---------------------CONSOLE_WORK_OK-------控制台关闭成功
//                                CONSOLE_WORK_FAILED---控制台关闭失败
//                                CONSOLE_NOT_STARTED----控制台尚未启动
//开发人员:杨军
//开发日期:2004-5-31
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CConsoleManage::ReadData(CString& argData, DWORD argToRead, DWORD& argRead) 
{
  //------------------变量定义部分  begins------------------------------
  HANDLE hInput = INVALID_HANDLE_VALUE; 
  LPTSTR lpBuffer = NULL;
  //------------------变量定义部分  ends--------------------------------
  
  if (INVALID_HANDLE_VALUE == m_hConsoleBuffer)
  {
    return CONSOLE_NOT_STARTED;
  }

  //获得Console输入句柄
  hInput = GetStdHandle(STD_INPUT_HANDLE);

  if (INVALID_HANDLE_VALUE == hInput)
  {
    return CONSOLE_WORK_FAILED;
  }
  
  //用户请求读取的数据的长度不能 <= 0
  if (argToRead <= 0)
  {
    return CONSOLE_WORK_FAILED;
  }
  argData.Empty();
  lpBuffer = argData.GetBuffer(argToRead);
  if (!ReadConsole(hInput, lpBuffer, argToRead, &argRead, NULL))
  {
    return CONSOLE_WORK_FAILED;
  }

  argData.ReleaseBuffer();

  return CONSOLE_WORK_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -