/************************************************************************/
/*
模块名: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中为非控制台程序提供控制台输出窗口的更多相关文章

  1. Net Core 控制台程序使用Nlog 输出到log文件

    using CoreImportDataApp.Common; using Microsoft.Extensions.Configuration; using Microsoft.Extensions ...

  2. c# 控制台程序 隐藏控制台窗口

    在某些项目中,需要采用控制台程序,但是又不需要通过dos窗口进行交互,同时打算隐藏掉难看的控制台窗口.实现的方法很多,有的是修改链接命令.我采用的方法略有些麻烦,首先是给窗口命名,之后找到该窗口指针, ...

  3. Delphi中如何控制其他程序窗体上的窗口控件

    回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你提供的地址调用这个函数通知你,并按照预先规定好的形式传递参数 ...

  4. 控制台程序的中文输出乱码问题(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中显示出错 ...

  5. C#控制台程序,运行完窗口不退出的方法

    .... static void Main(string[] args){ Console.WriteLine("运行完后不退出窗口"); Console.ReadKey();// ...

  6. PyCharm中运行同一个python程序时选择平行窗口运行

    问题描述 当我们进行Socket编程时,客户端可能有多个,原则上如果有n个客户端,那么我们就要编辑n客户端的代码.然而其实我们每个客户端的代码都是相同,如果编辑n遍,将会相当的浪费空间. 解决办法 学 ...

  7. C++ gui程序附加dos输出窗口

    C++ gui程序附加console qtcreator 1:在.pro文件中加入一句: CONFIG+= console 2:在运行设置里勾选在终端运行的选项 vs 1.新建gui项目 2.连接器( ...

  8. C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)

    一.什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的“ ...

  9. VC++中的C运行时库浅析(控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)

    1.概论 运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的.C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于 ...

随机推荐

  1. [Android] Activity间切换,传递数据

    前面照着android系统的裁剪图片的功能自己写了一个相似的工具.功能是大体上实现了,但留下了一个调用的问题:如何从我的程序调用这个裁剪工具,并且获得裁剪后的图片呢? 其实这个也很简单了,就是inte ...

  2. ECMAScript5新特性总结

    虽然ECMAScript5早就成为标准推出来了,但之前因为一直用的是ECMAScript3,并且工作中总是要求兼容IE的低版本,所以用的比较少.如今市场上大多数浏览器都能兼容ECMAScript5(I ...

  3. python 遇到的一些坑

    lst = [1, 2, 4] print lst.__iter__().next() # 打印出来的是 1 print lst.__iter__().next() # 打印出来的是 1 # 调用__ ...

  4. 如何加密 Windows VM 上的虚拟磁盘

    为了增强虚拟机 (VM) 的安全性以及符合性,可以加密 Azure 中的虚拟磁盘. 磁盘是使用 Azure 密钥保管库中受保护的加密密钥加密的. 可以控制这些加密密钥,以及审核对它们的使用. 本文详细 ...

  5. linux操作系统不重启添加raid0步骤

    1.限制:本步骤仅适用于LSI芯片的raid卡,可以通过以下蓝色指令判断是否LSI芯片 [root@HKC-Lab-CDN ~]# lspci | grep -i lsi 03:00.0 RAID b ...

  6. 插入图片新方式:data:image

    我们在使用<img>标签和给元素添加背景图片时,不一定要使用外部的图片地址,也可以直接把图片数据定义在页面上.对于一些“小”的数据,可以在网页中直接嵌入,而不是从外部文件载入. 如何使用 ...

  7. SharePoint读取配置文件

    配置文件存放目录 C:\inetpub\wwwroot\wss\VirtualDirectories\80\web.config 读取配置 string Name=Configuration.WebC ...

  8. tail 尾巴

    tail用法:尾巴,取文件的最后N行,默认前10行, -n 2 取前2行-n 2,简写就是-2 -f 文件 跟踪一个文件尾部的时时变化. 克隆出一个窗口执行:循环脚本:for n in `seq 1 ...

  9. 人工智能——Singleton模式

    上次在状态模式中的设计有一个严重的问题,就是如下: voidCTroll::ChageState(CState* pNewState) {        deletem_pCurrentState; ...

  10. Hadoop HBase概念学习系列之HBase里的客户端和HBase集群建立连接(详细)(十四)

    需要遵循以下步骤: 1.客户端和Zookeeper集群建立连接.在这之前客户端需要获得一些信息(可以从HBase配置文件中读取或是直接指定).客户端从Zookeeper集群中读取-ROOT-表的位置信 ...