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 = 0;

        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( -1 == 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( -1 == 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

原文地址:https://www.cnblogs.com/zhehan54/p/9216657.html

时间: 2024-08-05 19:21:33

VS中为非控制台程序提供控制台输出窗口的相关文章

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

C++ gui程序附加console qtcreator 1:在.pro文件中加入一句: CONFIG+= console 2:在运行设置里勾选在终端运行的选项 vs 1.新建gui项目 2.连接器(linker) 3.系统(system) 4.将第一项选成控制台(Console).不过务必要记得选择控制台前是在什么选项上,等调试结束后选回去,不然程序编译出来,就带着那个黑框框的控制台了.或者直接在连接器->命令行->其他选项中直接添加/SUBSYSTEM:CONSOLE

在控制台程序中隐藏控制台窗口

大家都知道,当编写一个win32 console application时,当运行此类程序的时候默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只想在程序中运行一段功能代码,不希望显示这个console窗口,让代码执行完毕之后程序自动退出. 下面就介绍一下,如何隐藏win32 console application的console窗口 因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译器的链接开关选项(也就是linker选项). 首先我们来看一下linke

QT中控制台程序运行问题

环境: ubuntu14.04 问题与解决方法: QT中的控制他程序,默认运行方式是直接输出到Output窗口中来.我的程序需要从控制台输入,这时候默认的运行方式就不行了.通过设置工程全选项让它在终端中运行: projects--Build&Run--Run--选中Run In Terminal 此时可能还有问题,就是即不从Output窗口输出,也不从终端运行,这其实应该是终端配置有问题,修改一下: 菜单--工具--选项--环境--普通--系统--终端:/usr/bin/gnome-termin

在Win32控制台程序中使用CString

进入Project->Settings->General 下,在下拉框中选"Use MFC in a Static Library"(使用MFC做为静态链接库): 然后添加头文件#include <afxwin.h>,并且要放在其它头文件前. 否则,会有#error : WINDOWS.H already included. MFC apps must not #include <windows.h>的错误提示. 在Win32控制台程序中使用CStr

VS2010运行正常的控制台程序在VS2015中出现乱码的解决方法

以前在Visual Stuido 2010中运行正常的控制台程序,在Visual Studio 2015中出现乱码,找到<Visual Studio 2015的坑:中文字符串编译后成乱码>这篇文章,原来是某个cs文件的保存格式为ANSI,在保存按钮右侧有一个编码保存,用UTF8另存后,编译运行OK!

C#控制台程序中处理2个关闭事件的代码实例

应用场景 我们开发的控制台应用,在运行阶段很有可能被用户Ctrl+C终止或是被用户直接关闭.如果我们不希望用户通过Ctrl+C终止我们的程序,就需要对Ctrl+C或关闭事件作处理. 处理方法 在.net平台下Console类有个CancelKeyPress事件可以处理Ctrl+C,不过对于直接关闭控制台应用,这种处理就无能为力了. 不过Windows API中有个SetConsoleCtrlHandler函数可以处理这两种关闭事件. C#处理代码如下: 代码如下: static class Pr

.net core控制台程序中使用原生依赖注入

原文:.net core控制台程序中使用原生依赖注入 如果要在程序中使用DbContext,则需要先在Nuget中安装Microsoft.EntityFrameworkCore.SqlServer using ConsoleApp1.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System; using Console

.net开发环境的认识,控制台程序的创建,输出,输入,定义变量,变量赋值,值覆盖,值拼接,值打印 两种数据类型,整形类型转换

首先感谢向立凯老师带我走进.net这个很好的软件开发程序.通过两天的学习在这个领域的了解也多了很多,让大家先了解一下c#语言 c#是一种全新且简单.安全.快捷面向对象的程序设计语言.是专门为.net应用开发的语言..net的开发都基于一个统一的开发环境 Visual Studio.net.下面我们来看看怎么在Visual Studio.net.下创建以新的项目: 1.打开 2.新建一个项目 通过执行文件-新建-项目菜单命令,会弹出一个新建项目对话框.在这个对话框中选择开发语言为c#,选择框架版本

重定向子进程控制台程序的输入输出

重定向子进程控制台程序的输入输出 重定向所做的工作都在父进程,但需要子进程遵守下面的规则: 子进程程序在输出代码后,等待输入之前需要调用fflush(stdout)函数,这样把输出的内容放入缓冲区,父进程才能及时的读到输出数据. 不遵守以上规则就没办法实现有效的交互了,cmd.exe是遵守这个规则的典范,大部分控制台程序都不遵守这个规则.今天我试图给Google的V8 Javascript 的Shell搞一个GUI,方便我输入Javascript程序,就遇到了v8_shell不遵守这个的问题.好