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年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于 ...
随机推荐
- poj_3253 Fence Repair
Fence Repair Description Farmer John wants to repair a small length of the fence around the pasture. ...
- 《SQL Server 2008从入门到精通》--20180724
目录 1.事务 1.1.事务的ACID属性 1.2.事务分类 1.2.1.系统提供的事务 1.2.2.用户自定义的事务 1.3.管理事务 1.3.1.SAVE TRANSACTION 1.3.2.@@ ...
- 推荐linux下的数据库开发工具DBeaver 开源免费
linux下不错的数据库管理工具 DBeaver 操作比较友好,基于eclipse.使用jdbc链接,链接数据库非常全(oracle mysql mssql sqlite 常见的统统支持).而且可以 ...
- 读高性能JavaScript编程 第四章 Conditionals
if else 和 switch && 递归 if else 和 switch 一般来说,if-else 适用于判断两个离散的值或者判断几个不同的值域.如果判断多于两个离散 ...
- Windows Server 2012上安装.NET Framework 3.5
引用:https://jingyan.baidu.com/article/14bd256e26b714bb6d26128a.html 装不成功后网上搜到很多相同的问题,都尝试过没解决到 用PowerS ...
- redis 持久化与备份策略
持久化(persistence) 本文是 Redis 持久化文档 的中文翻译. 这篇文章提供了 Redis 持久化的技术性描述,推荐所有 Redis 用户阅读. 要更广泛地了解 Redis 持久化,以 ...
- node学习笔记_03 express框架
express api地址:http://www.expressjs.com.cn/starter/static-files.html 一.安装依赖 npm i --save express npm ...
- swift的类型约束
关键词: 类型与功能绑定.类型指定.访问控制. 类型约束的本质: 1.是否强制指定具有某些特征的类型:看类型构造器的定义本身是否对类型有约束: 2.访问控制:类型构造器的功能分为通用功能和约束功能: ...
- NOIP模板总结
NOIP模板总结 进考场先打一份缺省源: # include <cstdio> # include <iostream> # include <cstring> # ...
- tarjan【模板】缩点
传送门:https://www.luogu.org/problemnew/show/P3387 首先呢,tarjan找一个图的强连通分量是基于对图的dfs的.这中间开了一个dfn[]代表dfs序,还有 ...