VS中为非控制台程序提供控制台输出窗口
/************************************************************************/
/*
模块名:ConsoleAdapter
文件名:ConsoleAdapter.h
功 能:为非控制台程序提供控制台输出窗口
参 考:
1. http://www.codeproject.com/Articles/15836/Writing-to-and-read-from-the-console-From-a-GUI-ap
------------------------------------------------------------------------- #ifndef __CONSOLE_ADAPTER_H__
#define __CONSOLE_ADAPTER_H__ #include <iostream>
#include <io.h>
#include <fcntl.h> using namespace std; typedef enum
{
INPUT_CONS,
OUTPUT_CONS,
BOTH
}CONSOLETYPE_e; class CConsoleAdapter
{
public:
CConsoleAdapter()
{
m_bHasCreate = FALSE;
}
~CConsoleAdapter()
{
if (TRUE == m_bHasCreate)
{
DestroyConsole();
}
} public:
DWORD CreateConsole()
{
DWORD dwErrorCode = ; do
{
if (m_bHasCreate == TRUE)
{
break;
} m_bHasCreate = AllocConsole();
if (FALSE == m_bHasCreate)
{
dwErrorCode = GetLastError();
break;
}
else
{
m_eConsoleType = OUTPUT_CONS;
ReplaceHandles();
}
} while (FALSE); return dwErrorCode;
} void DestroyConsole()
{
try
{
if (m_bHasCreate != TRUE)
{
return;
}
m_bHasCreate = FALSE; FreeConsole();
if( ( INPUT_CONS == m_eConsoleType ) || ( BOTH == m_eConsoleType ) )
{
// if( 0 != m_fpCRTIn )
// {
// fclose( m_fpCRTIn );
// }
// if (-1 != m_nCRTIn)
// {
// _close( m_nCRTIn );
// m_nCRTIn = -1;
// } *stdin = m_fOldStdIn;
} if( ( OUTPUT_CONS == m_eConsoleType ) || ( BOTH == m_eConsoleType ) )
{
// if( 0 != m_fpCRTOut )
// {
// fclose( m_fpCRTOut );
// }
// if (-1 != m_nCRTOut)
// {
// _close( m_nCRTOut );
// m_nCRTOut = -1;
// } *stdout = m_fOldStdOut;
} }
catch ( ... )
{ } } private:
BOOL ReplaceHandles()
{
try
{
if( ( INPUT_CONS == m_eConsoleType ) || ( BOTH == m_eConsoleType ) )
{
m_nCRTIn= _open_osfhandle(
(long) GetStdHandle(STD_INPUT_HANDLE),
_O_TEXT );
if( - == m_nCRTIn )
{
return FALSE;
}
m_fpCRTIn = _fdopen( m_nCRTIn, "r" );
if( !m_fpCRTIn )
{
return FALSE;
}
m_fOldStdIn = *stdin;
*stdin = *m_fpCRTIn;
// if clear is not done, any cout statement before AllocConsole
// will cause, the cin after AllocConsole to fail, so very important
std::cin.clear();
}
if( ( OUTPUT_CONS == m_eConsoleType ) || ( BOTH == m_eConsoleType ) )
{
m_nCRTOut= _open_osfhandle(
(long) GetStdHandle(STD_OUTPUT_HANDLE),
_O_TEXT );
if( - == m_nCRTOut )
{
return FALSE;
} m_fpCRTOut = _fdopen( m_nCRTOut, "w" );
if( !m_fpCRTOut )
{
return FALSE;
}
m_fOldStdOut = *stdout;
*stdout = *m_fpCRTOut;
// if clear is not done, any cout statement before AllocConsole
// will cause, the cout after AllocConsole to fail, so very important
std::cout.clear();
}
}
catch ( ... )
{
return FALSE;
}
return TRUE;
} private:
BOOL m_bHasCreate;
CONSOLETYPE_e m_eConsoleType; FILE m_fOldStdIn;
FILE* m_fpCRTIn;
int m_nCRTIn; FILE m_fOldStdOut;
FILE* m_fpCRTOut;
int m_nCRTOut;
}; #endif
VS中为非控制台程序提供控制台输出窗口的更多相关文章
- Net Core 控制台程序使用Nlog 输出到log文件
using CoreImportDataApp.Common; using Microsoft.Extensions.Configuration; using Microsoft.Extensions ...
- c# 控制台程序 隐藏控制台窗口
在某些项目中,需要采用控制台程序,但是又不需要通过dos窗口进行交互,同时打算隐藏掉难看的控制台窗口.实现的方法很多,有的是修改链接命令.我采用的方法略有些麻烦,首先是给窗口命名,之后找到该窗口指针, ...
- Delphi中如何控制其他程序窗体上的窗口控件
回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你提供的地址调用这个函数通知你,并按照预先规定好的形式传递参数 ...
- 控制台程序的中文输出乱码问题(export LC_CTYPE=zh_CN.GBK,或者修改/etc/sysconfig/i18n为zh_CN.GBK。使用setlocale(LC_CTYPE, "");会使用默认办法。编译器会将源码做转换成Unicode格式,或者指定gcc的输入文件的编码参数-finput-charset=GBK。Linux下应该用wprintf(L"%ls/n",wstr))
今天发现用securecrt登陆时,gcc编译出错时会出现乱码,但直接在主机的窗口界面下用Shell编译却没有乱码.查看了一下当时的错误描述,发现它的引号是中文引号,导致在SecureCRT中显示出错 ...
- C#控制台程序,运行完窗口不退出的方法
.... static void Main(string[] args){ Console.WriteLine("运行完后不退出窗口"); Console.ReadKey();// ...
- PyCharm中运行同一个python程序时选择平行窗口运行
问题描述 当我们进行Socket编程时,客户端可能有多个,原则上如果有n个客户端,那么我们就要编辑n客户端的代码.然而其实我们每个客户端的代码都是相同,如果编辑n遍,将会相当的浪费空间. 解决办法 学 ...
- C++ gui程序附加dos输出窗口
C++ gui程序附加console qtcreator 1:在.pro文件中加入一句: CONFIG+= console 2:在运行设置里勾选在终端运行的选项 vs 1.新建gui项目 2.连接器( ...
- C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)
一.什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的“ ...
- VC++中的C运行时库浅析(控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)
1.概论 运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的.C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于 ...
随机推荐
- 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归
机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归 关键字:Logistic回归.python.源码解析.测试作者:米仓山下时间:2018- ...
- 【three.js练习程序】鼠标滚轮缩放
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 13 款惊艳的 Node.js 框架——第2部分
[编者按]本文作者为 Peter Wayner,主要介绍13款至精至简的 Node.js 框架,帮助你简化高速网站.丰富 API 以及实时应用的开发流程.本文系国内 ITOM 管理平台 OneAPM ...
- LUA 运算笔记
循环 比如要实现这样的一个For for(int i=10;i>1;i—) { print(i) } lua的for循环 转换成LUA for i=10,1,-1 do print(i) end ...
- soapui 调用wsdl 步骤以及出现的问题
创建soap project 添加wsdl 地址(或者导入wsdl(后缀可以是xml或者wsdl)文件) 添加request 自动生成请求代码 参数放在in0 中 <soapenv:Envelo ...
- mysql用户管理与权限
1.设置密码 set password for 用户名@localhost = password('密码'); 2.取消密码 set password for 用户名@localhost = pass ...
- Spirng MVC 重定向传递对象
在 Spring MVC 中我们会经常遇到重定向. @RequestMapping("/order/saveorder.html") public String saveOrder ...
- 团队作业——Alpha冲刺 8/12
团队作业--Alpha冲刺 冲刺任务安排 杨光海天 今日任务:将编辑界面与其中字体设置的弹窗合并,学习Android控件交互. 明日任务:希望完成编辑界面所有接口交互的功能. 郭剑南 今日任务:使用P ...
- Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步
Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步 接上一篇,如何解决前后端请求跨域问题? 首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site: ...
- 2.js深入(以通俗易懂的语言解释JavaScript)
1.函数返回值: 即函数的执行结果 可以没有return 经验:一个函数应该只返回一种类型的值 2.函数传参 可变参(不定参):arguments ——>(参数的个数可变,参数数组) 例子1:求 ...